From c05603d6242a142a7b23297ef4492ffebd7c4a75 Mon Sep 17 00:00:00 2001 From: Micheal Wilkinson Date: Tue, 17 Mar 2026 20:49:50 +0000 Subject: [PATCH] Added NoteStore interface, mock and repository with Create method --- internal/repository/notes.go | 19 +++++++ internal/repository/notes_test.go | 74 +++++++++++++++++++++++++++ internal/repository/notestore.go | 8 +++ internal/repository/notestore_test.go | 15 ++++++ 4 files changed, 116 insertions(+) create mode 100644 internal/repository/notes.go create mode 100644 internal/repository/notes_test.go create mode 100644 internal/repository/notestore.go create mode 100644 internal/repository/notestore_test.go diff --git a/internal/repository/notes.go b/internal/repository/notes.go new file mode 100644 index 0000000..8a77e85 --- /dev/null +++ b/internal/repository/notes.go @@ -0,0 +1,19 @@ +package repository + +import ( + "fmt" + + "git.hrafn.xyz/aether/notes/internal/models" +) + +type NoteRepository struct { + store NoteStore +} + +func NewNoteRepository(store NoteStore) *NoteRepository { + return &NoteRepository{store: store} +} + +func (r *NoteRepository) CreateNote(content string) (models.Note, error) { + return models.Note{}, fmt.Errorf("not implemented") +} \ No newline at end of file diff --git a/internal/repository/notes_test.go b/internal/repository/notes_test.go new file mode 100644 index 0000000..d56555b --- /dev/null +++ b/internal/repository/notes_test.go @@ -0,0 +1,74 @@ +package repository_test + +import ( + "testing" + "testing/synctest" + + "time" + "fmt" + + "git.hrafn.xyz/aether/notes/internal/models" + "git.hrafn.xyz/aether/notes/internal/repository" +) + +func TestCreateNote(t *testing.T) { + testCases := []struct { + name string + content string + expectedNote models.Note + expectedError bool + }{ + { + name: "Good note", + content: "This is a good note with valid content.", + expectedNote: models.Note{ + ID: 1, + CreatedAt: time.Date(0001, 1, 1, 0, 0, 0, 0, time.UTC), //CreatedAt is set by synctest to this specific time + Content: "This is a good note with valid content.", + }, + expectedError: false, + }, + { + name: "Empty content", + content: "", + expectedNote: models.Note{}, + expectedError: true, + }, + { + name: "Long content", + content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + expectedNote: models.Note{ + ID: 2, + CreatedAt: time.Date(0001, 1, 1, 0, 0, 0, 0, time.UTC), + Content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + }, + expectedError: false, + }, + } + repo := repository.NewNoteRepository(&mockNoteStore{}) + for _, tc := range testCases { + + synctest.Test(t, func(t *testing.T) { + note, err := repo.CreateNote(tc.content) + if tc.expectedError { + if err == nil { + t.Errorf("expected an error but got none") + } + } else { + if err != nil { + t.Errorf("unexpected error: %v", err) + } + } + if note.Content != tc.expectedNote.Content { + t.Errorf("expected content %q but got %q", tc.expectedNote.Content, note.Content) + } + if note.ID != tc.expectedNote.ID { + t.Errorf("expected ID %d but got %d", tc.expectedNote.ID, note.ID) + } + if !note.CreatedAt.Equal(tc.expectedNote.CreatedAt) { + t.Errorf("expected CreatedAt %v but got %v", tc.expectedNote.CreatedAt, note.CreatedAt) + } + fmt.Printf("Test case '%s' passed.\n", tc.name) + }) + } + } \ No newline at end of file diff --git a/internal/repository/notestore.go b/internal/repository/notestore.go new file mode 100644 index 0000000..f500b4d --- /dev/null +++ b/internal/repository/notestore.go @@ -0,0 +1,8 @@ +package repository + +import ( + "git.hrafn.xyz/aether/notes/internal/models" +) +type NoteStore interface { + SaveNote(models.Note) (models.Note, error) +} \ No newline at end of file diff --git a/internal/repository/notestore_test.go b/internal/repository/notestore_test.go new file mode 100644 index 0000000..f5b2d3d --- /dev/null +++ b/internal/repository/notestore_test.go @@ -0,0 +1,15 @@ +package repository_test + +import ( + "git.hrafn.xyz/aether/notes/internal/models" +) + +type mockNoteStore struct { + notes []models.Note +} + +func (m *mockNoteStore) SaveNote(note models.Note) (models.Note, error) { + note.ID = len(m.notes) + 1 + m.notes = append(m.notes, note) + return note, nil +} \ No newline at end of file