From 065dd5dc4b9bad95ffc22a1232417eb44795c131 Mon Sep 17 00:00:00 2001 From: Logan Gore <119902778+logan-stytch@users.noreply.github.com> Date: Thu, 29 Feb 2024 12:15:06 -0800 Subject: [PATCH] Fix bug with First (#37) --- select.go | 6 +++--- sqx_test.go | 31 +++++++++++++++++++++++++++++++ version.go | 2 +- widget_test.go | 12 ++++++++++-- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/select.go b/select.go index 338d92e..79dba49 100644 --- a/select.go +++ b/select.go @@ -266,13 +266,13 @@ func (b SelectBuilder[T]) First() (*T, error) { return nil, err } - var dest *T - err = scan.RowStrict(dest, rows) + var dest T + err = scan.RowStrict(&dest, rows) if err != nil { return nil, err } - return dest, nil + return &dest, nil } // FirstScalar is like First but dereferences the result into a scalar value. If an error is raised, the scalar value diff --git a/sqx_test.go b/sqx_test.go index 0e5731d..25c0d56 100644 --- a/sqx_test.go +++ b/sqx_test.go @@ -167,6 +167,37 @@ func TestInsert(t *testing.T) { }) } +func TestSelect(t *testing.T) { + ctx := context.Background() + + w1 := newWidget("great") + w2 := newWidget("fine") + + t.Run("First returns either w1 or w2", func(t *testing.T) { + tx := Tx(t) + setupTestWidgetsTable(t, tx) + dbWidget := newDBWidget() + require.NoError(t, dbWidget.Create(ctx, tx, &w1)) + require.NoError(t, dbWidget.Create(ctx, tx, &w2)) + + w, err := dbWidget.First(ctx, tx, &widgetGetFilter{}) + + require.NoError(t, err) + assert.True(t, *w == w1 || *w == w2) + }) + + t.Run("First returns an error when no rows are found", func(t *testing.T) { + tx := Tx(t) + setupTestWidgetsTable(t, tx) + dbWidget := newDBWidget() + + _, err := dbWidget.First(ctx, tx, &widgetGetFilter{}) + + assert.Error(t, err) + assert.EqualError(t, sql.ErrNoRows, err.Error()) + }) +} + func TestDelete(t *testing.T) { // Arrange ctx := context.Background() diff --git a/version.go b/version.go index 7ea2706..9d4e7a0 100644 --- a/version.go +++ b/version.go @@ -1,3 +1,3 @@ package sqx -const VERSION = "0.3.0" +const VERSION = "0.4.0" diff --git a/widget_test.go b/widget_test.go index b532d4a..b01962f 100644 --- a/widget_test.go +++ b/widget_test.go @@ -26,8 +26,7 @@ func (w Widget) toSetMap() (map[string]any, error) { return sqx.ToSetMap(&w) } -type dbWidget struct { -} +type dbWidget struct{} func newDBWidget() dbWidget { return dbWidget{} @@ -99,6 +98,15 @@ func (d *dbWidget) Get(ctx context.Context, tx sqx.Queryable, f *widgetGetFilter All() } +func (d *dbWidget) First(ctx context.Context, tx sqx.Queryable, f *widgetGetFilter) (*Widget, error) { + return sqx.Read[Widget](ctx). + WithQueryable(tx). + Select("*"). + From("sqx_widgets_test"). + Where(sqx.ToClause(f)). + First() +} + func (d *dbWidget) GetAll(ctx context.Context, tx sqx.Queryable) ([]Widget, error) { return sqx.Read[Widget](ctx). WithQueryable(tx).