Skip to content

Commit

Permalink
Added in memory database
Browse files Browse the repository at this point in the history
  • Loading branch information
MaartendeKruijf committed Jul 11, 2024
1 parent f95355b commit 335d746
Show file tree
Hide file tree
Showing 2 changed files with 330 additions and 0 deletions.
84 changes: 84 additions & 0 deletions database/memory/memory.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package memory

import (
"errors"
"soarca/models/api"
"soarca/models/cacao"
"soarca/models/decoder"
)

type InMemoryDatabase struct {
playbooks map[string]cacao.Playbook
}

func New() InMemoryDatabase {
return InMemoryDatabase{playbooks: make(map[string]cacao.Playbook)}
}

func (memory *InMemoryDatabase) GetPlaybooks() ([]cacao.Playbook, error) {
size := len(memory.playbooks)
playbookList := make([]cacao.Playbook, 0, size)
for _, playbook := range memory.playbooks {
playbookList = append(playbookList, playbook)
}

return playbookList, nil
}

func (memory *InMemoryDatabase) GetPlaybooksMetas() ([]api.PlaybookMeta, error) {
size := len(memory.playbooks)
playbookList := make([]api.PlaybookMeta, 0, size)
for _, playbook := range memory.playbooks {
meta := api.PlaybookMeta{ID: playbook.ID, Name: playbook.Name,
Description: playbook.Description,
ValidFrom: playbook.ValidFrom,
ValidUntil: playbook.ValidUntil,
Labels: playbook.Labels}
playbookList = append(playbookList, meta)
}

return playbookList, nil
}

func (memory *InMemoryDatabase) Create(json *[]byte) (cacao.Playbook, error) {

if json == nil {
return cacao.Playbook{}, errors.New("empty input")
}
result := decoder.DecodeValidate(*json)
if result == nil {
return cacao.Playbook{}, errors.New("failed to decode")
}
_, ok := memory.playbooks[result.ID]
if ok {
return cacao.Playbook{}, errors.New("playbook already exists")
}
memory.playbooks[result.ID] = *result
return *result, nil
}

func (memory *InMemoryDatabase) Read(id string) (cacao.Playbook, error) {
playbook, ok := memory.playbooks[id]
if !ok {
return cacao.Playbook{}, errors.New("playbook is not in repository")
}
return playbook, nil
}

func (memory *InMemoryDatabase) Update(id string, json *[]byte) (cacao.Playbook, error) {
playbook, err := memory.Read(id)
if err != nil {
return playbook, err
}
updatePlaybook := decoder.DecodeValidate(*json)
if updatePlaybook == nil {
return cacao.Playbook{}, errors.New("failed to decode")
}
memory.playbooks[id] = *updatePlaybook
return *updatePlaybook, nil
}

func (memory *InMemoryDatabase) Delete(id string) error {
delete(memory.playbooks, id)
return nil
}
246 changes: 246 additions & 0 deletions test/unittest/database/memory/memory_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,246 @@
package memory_test

import (
"encoding/json"
"errors"
"fmt"
"io"
"os"
"soarca/database/memory"
"soarca/models/cacao"
"soarca/models/decoder"
"sort"
"testing"

"github.com/go-playground/assert/v2"
)

var PB_PATH string = "../../cacao/playbooks/"

func TestCreate(t *testing.T) {
jsonFile, err := os.Open(PB_PATH + "playbook.json")
if err != nil {
fmt.Println(err)
t.Fail()
}
defer jsonFile.Close()
byteValue, _ := io.ReadAll(jsonFile)

if err != nil {
fmt.Println("Not valid JSON")
t.Fail()
return
}

var workflow = decoder.DecodeValidate(byteValue)
mem := memory.New()
playbook, err := mem.Create(&byteValue)
assert.Equal(t, err, nil)
assert.Equal(t, playbook, workflow)

}

func TestRead(t *testing.T) {
jsonFile, err := os.Open(PB_PATH + "playbook.json")
if err != nil {
fmt.Println(err)
t.Fail()
}
defer jsonFile.Close()
byteValue, _ := io.ReadAll(jsonFile)

if err != nil {
fmt.Println("Not valid JSON")
t.Fail()
return
}

var workflow = decoder.DecodeValidate(byteValue)

mem := memory.New()
empty, err := mem.Read(workflow.ID)
assert.Equal(t, err, errors.New("playbook is not in repository"))
assert.Equal(t, empty, cacao.Playbook{})

playbook, err := mem.Create(&byteValue)
assert.Equal(t, err, nil)
result, err := mem.Read(playbook.ID)
assert.Equal(t, err, nil)
assert.Equal(t, playbook, result)

}

func TestUpdate(t *testing.T) {
jsonFile, err := os.Open(PB_PATH + "playbook.json")
if err != nil {
fmt.Println(err)
t.Fail()
}
defer jsonFile.Close()
byteValue, _ := io.ReadAll(jsonFile)

if err != nil {
fmt.Println("Not valid JSON")
t.Fail()
return
}

var workflow = decoder.DecodeValidate(byteValue)

mem := memory.New()
empty, err := mem.Update(workflow.ID, nil)
assert.Equal(t, err, errors.New("playbook is not in repository"))
assert.Equal(t, empty, cacao.Playbook{})

playbook, err := mem.Create(&byteValue)
assert.Equal(t, err, nil)

emptyBytes, err := json.Marshal(new([]byte))
assert.Equal(t, err, nil)

parsingFailed, err := mem.Update(playbook.ID, &emptyBytes)
assert.Equal(t, err, errors.New("failed to decode"))
assert.Equal(t, parsingFailed, cacao.Playbook{})

workflow.Description = "new"
jsonBytes, err := json.Marshal(workflow)
assert.Equal(t, err, nil)

result, err := mem.Update(playbook.ID, &jsonBytes)
assert.Equal(t, err, nil)
assert.Equal(t, workflow, result)

}

func TestDelete(t *testing.T) {
jsonFile, err := os.Open(PB_PATH + "playbook.json")
if err != nil {
fmt.Println(err)
t.Fail()
}
defer jsonFile.Close()
byteValue, _ := io.ReadAll(jsonFile)

if err != nil {
fmt.Println("Not valid JSON")
t.Fail()
return
}

var workflow = decoder.DecodeValidate(byteValue)

mem := memory.New()
err = mem.Delete(workflow.ID)
assert.Equal(t, err, nil)

playbook, err := mem.Create(&byteValue)
assert.Equal(t, err, nil)
assert.Equal(t, playbook, workflow)
readbackPlaybook, err := mem.Read(workflow.ID)
assert.Equal(t, err, nil)
assert.Equal(t, readbackPlaybook, workflow)

err = mem.Delete(workflow.ID)
assert.Equal(t, err, nil)

readbackPlaybook2, err := mem.Read(workflow.ID)
assert.Equal(t, err, errors.New("playbook is not in repository"))
assert.Equal(t, readbackPlaybook2, cacao.Playbook{})

}

func TestGetAllPlaybooks(t *testing.T) {
jsonFile, err := os.Open(PB_PATH + "playbook.json")
if err != nil {
fmt.Println(err)
t.Fail()
}
defer jsonFile.Close()
byteValue, _ := io.ReadAll(jsonFile)

if err != nil {
fmt.Println("Not valid JSON")
t.Fail()
return
}

var workflow = decoder.DecodeValidate(byteValue)

mem := memory.New()

list := []string{
"playbook--f47d4081-21ed-4f21-9d05-6b368d73da30",
"playbook--d41b1046-9334-400b-baa9-91b2ea431731",
"playbook--586fa554-448a-427e-a719-938f6e033e0d",
"playbook--3b1e8e64-bb5c-426f-8086-b5a6f9c565e2",
"playbook--08a82149-d48d-45dd-b8a2-025713d74742",
"playbook--dcd634a4-04b5-4fa5-842b-bb842a104fbf",
"playbook--e848e4d2-f529-46e7-8dc4-6ef7acaad902",
"playbook--e56eb89e-e8ab-41b8-ba94-f97014670bc7",
"playbook--c2ae6f09-53c5-4e61-b7fb-f5207b2604b3",
"playbook--8dbdf991-2ec2-45d6-952d-7ef1ac2a9254",
}
sort.Strings(list)

for _, id := range list {
workflow.ID = id
jsonBytes, err := json.Marshal(workflow)
assert.Equal(t, err, nil)
_, err = mem.Create(&jsonBytes)
assert.Equal(t, err, nil)
// assert.Equal(t, playbook, workflow)
}

playbooks, err := mem.GetPlaybooks()
assert.Equal(t, err, nil)
assert.Equal(t, len(playbooks), 10)

}

func TestGetAllPlaybookMetas(t *testing.T) {
jsonFile, err := os.Open(PB_PATH + "playbook.json")
if err != nil {
fmt.Println(err)
t.Fail()
}
defer jsonFile.Close()
byteValue, _ := io.ReadAll(jsonFile)

if err != nil {
fmt.Println("Not valid JSON")
t.Fail()
return
}

var workflow = decoder.DecodeValidate(byteValue)

mem := memory.New()

list := []string{
"playbook--f47d4081-21ed-4f21-9d05-6b368d73da30",
"playbook--d41b1046-9334-400b-baa9-91b2ea431731",
"playbook--586fa554-448a-427e-a719-938f6e033e0d",
"playbook--3b1e8e64-bb5c-426f-8086-b5a6f9c565e2",
"playbook--08a82149-d48d-45dd-b8a2-025713d74742",
"playbook--dcd634a4-04b5-4fa5-842b-bb842a104fbf",
"playbook--e848e4d2-f529-46e7-8dc4-6ef7acaad902",
"playbook--e56eb89e-e8ab-41b8-ba94-f97014670bc7",
"playbook--c2ae6f09-53c5-4e61-b7fb-f5207b2604b3",
"playbook--8dbdf991-2ec2-45d6-952d-7ef1ac2a9254",
}
sort.Strings(list)

for _, id := range list {
workflow.ID = id
jsonBytes, err := json.Marshal(workflow)
assert.Equal(t, err, nil)
_, err = mem.Create(&jsonBytes)
assert.Equal(t, err, nil)
// assert.Equal(t, playbook, workflow)
}

playbooks, err := mem.GetPlaybooksMetas()
assert.Equal(t, err, nil)
assert.Equal(t, len(playbooks), 10)

}

0 comments on commit 335d746

Please sign in to comment.