From fb49f94a36e0402afaf2bac75379182a97950bce Mon Sep 17 00:00:00 2001 From: Wibowo Arindrarto Date: Fri, 13 Oct 2023 04:58:32 +0200 Subject: [PATCH] feat: Implement and test FeedStore.ViewEntry --- internal/store/edit_entries.go | 49 ------------------------ internal/store/view_entry.go | 63 +++++++++++++++++++++++++++++-- internal/store/view_entry_test.go | 23 ++++++++++- 3 files changed, 81 insertions(+), 54 deletions(-) diff --git a/internal/store/edit_entries.go b/internal/store/edit_entries.go index ffb9934..3b26f23 100644 --- a/internal/store/edit_entries.go +++ b/internal/store/edit_entries.go @@ -44,53 +44,4 @@ func (s *SQLite) EditEntries( return entries, nil } -func getEntry(ctx context.Context, tx *sql.Tx, entryDBID DBID) (*Entry, error) { - - sql1 := ` - SELECT - e.id AS id, - e.feed_id AS feed_id, - e.title AS title, - e.is_read AS is_read, - e.external_id AS ext_id, - e.description AS description, - e.content AS content, - e.url AS url, - e.update_time AS update_time, - e.publication_time AS publication_time - FROM - entries e - WHERE - e.id = $1 - ORDER BY - COALESCE(e.update_time, e.publication_time) DESC -` - scanRow := func(row *sql.Row) (*Entry, error) { - var entry Entry - if err := row.Scan( - &entry.DBID, - &entry.FeedDBID, - &entry.Title, - &entry.IsRead, - &entry.ExtID, - &entry.Description, - &entry.Content, - &entry.URL, - &entry.Updated, - &entry.Published, - ); err != nil { - return nil, err - } - return &entry, nil - } - - stmt1, err := tx.PrepareContext(ctx, sql1) - if err != nil { - return nil, err - } - defer stmt1.Close() - - return scanRow(stmt1.QueryRowContext(ctx, entryDBID)) -} - var setEntryIsRead = setTableField[bool]("entries", "is_read") diff --git a/internal/store/view_entry.go b/internal/store/view_entry.go index 844a43d..561a202 100644 --- a/internal/store/view_entry.go +++ b/internal/store/view_entry.go @@ -6,16 +6,24 @@ package store import ( "context" "database/sql" - "fmt" + "errors" ) -func (s *SQLite) ViewEntry(ctx context.Context, _ DBID) (*Entry, error) { +func (s *SQLite) ViewEntry(ctx context.Context, entryID DBID) (*Entry, error) { s.mu.Lock() defer s.mu.Unlock() var entry *Entry dbFunc := func(ctx context.Context, tx *sql.Tx) error { - return fmt.Errorf("unimplemented") + ientry, err := getEntry(ctx, tx, entryID) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return EntryNotFoundError{entryID} + } + return err + } + entry = ientry + return nil } fail := failF("SQLite.ViewFeed") @@ -26,3 +34,52 @@ func (s *SQLite) ViewEntry(ctx context.Context, _ DBID) (*Entry, error) { } return entry, nil } + +func getEntry(ctx context.Context, tx *sql.Tx, entryDBID DBID) (*Entry, error) { + + sql1 := ` + SELECT + e.id AS id, + e.feed_id AS feed_id, + e.title AS title, + e.is_read AS is_read, + e.external_id AS ext_id, + e.description AS description, + e.content AS content, + e.url AS url, + e.update_time AS update_time, + e.publication_time AS publication_time + FROM + entries e + WHERE + e.id = $1 + ORDER BY + COALESCE(e.update_time, e.publication_time) DESC +` + scanRow := func(row *sql.Row) (*Entry, error) { + var entry Entry + if err := row.Scan( + &entry.DBID, + &entry.FeedDBID, + &entry.Title, + &entry.IsRead, + &entry.ExtID, + &entry.Description, + &entry.Content, + &entry.URL, + &entry.Updated, + &entry.Published, + ); err != nil { + return nil, err + } + return &entry, nil + } + + stmt1, err := tx.PrepareContext(ctx, sql1) + if err != nil { + return nil, err + } + defer stmt1.Close() + + return scanRow(stmt1.QueryRowContext(ctx, entryDBID)) +} diff --git a/internal/store/view_entry_test.go b/internal/store/view_entry_test.go index 7bcf637..2b60ed7 100644 --- a/internal/store/view_entry_test.go +++ b/internal/store/view_entry_test.go @@ -51,6 +51,25 @@ func TestViewEntryOk(t *testing.T) { context.Background(), keys[dbFeeds[1].Title].Entries["Entry X2"], ) - r.EqualError(err, "SQLite.ViewFeed: unimplemented") - a.Nil(dbEntry) + r.NoError(err) + r.NotNil(dbEntry) + + a.Equal("Entry X2", dbEntry.Title) + a.True(dbEntry.IsRead) +} + +func TestViewEntryErr(t *testing.T) { + t.Parallel() + + a := assert.New(t) + r := require.New(t) + st := newTestStore(t) + + r.Equal(0, st.countFeeds()) + + dbEntry, err := st.ViewEntry(context.Background(), 86) + r.Nil(dbEntry) + r.Error(err) + + a.EqualError(err, "SQLite.ViewFeed: entry with ID=86 not found") }