From 73dabf32cc890cb09e0f2e4d2e6e564b9d0a6779 Mon Sep 17 00:00:00 2001 From: Maxim Lebedev Date: Mon, 31 Jan 2022 16:57:23 +0500 Subject: [PATCH] :white_check_mark: Used SQLMock for ticket repository tests --- .../repository/sqlite3/sqlite3_ticket.go | 6 +- .../repository/sqlite3/sqlite3_ticket_test.go | 75 +++++++++++++------ 2 files changed, 56 insertions(+), 25 deletions(-) diff --git a/internal/ticket/repository/sqlite3/sqlite3_ticket.go b/internal/ticket/repository/sqlite3/sqlite3_ticket.go index d4e2c78..8c3c87f 100644 --- a/internal/ticket/repository/sqlite3/sqlite3_ticket.go +++ b/internal/ticket/repository/sqlite3/sqlite3_ticket.go @@ -47,6 +47,8 @@ const ( ) func NewSQLite3TicketRepository(db *sqlx.DB, config *domain.Config) ticket.Repository { + db.MustExec(QueryTable) + return &sqlite3TicketRepository{ config: config, db: db, @@ -54,7 +56,7 @@ func NewSQLite3TicketRepository(db *sqlx.DB, config *domain.Config) ticket.Repos } func (repo *sqlite3TicketRepository) Create(ctx context.Context, t *domain.Ticket) error { - if _, err := repo.db.NamedExecContext(ctx, QueryTable+QueryCreate, NewTicket(t)); err != nil { + if _, err := repo.db.NamedExecContext(ctx, QueryCreate, NewTicket(t)); err != nil { return fmt.Errorf("cannot create token record in db: %w", err) } @@ -70,7 +72,7 @@ func (repo *sqlite3TicketRepository) GetAndDelete(ctx context.Context, t string) } tkt := new(Ticket) - if err = tx.GetContext(ctx, tkt, QueryTable+QueryGet, t); err != nil { + if err = tx.GetContext(ctx, tkt, QueryGet, t); err != nil { defer tx.Rollback() if errors.Is(err, sql.ErrNoRows) { diff --git a/internal/ticket/repository/sqlite3/sqlite3_ticket_test.go b/internal/ticket/repository/sqlite3/sqlite3_ticket_test.go index d40b616..a980c74 100644 --- a/internal/ticket/repository/sqlite3/sqlite3_ticket_test.go +++ b/internal/ticket/repository/sqlite3/sqlite3_ticket_test.go @@ -2,52 +2,81 @@ package sqlite3_test import ( "context" + "regexp" "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/DATA-DOG/go-sqlmock" "source.toby3d.me/website/indieauth/internal/domain" "source.toby3d.me/website/indieauth/internal/testing/sqltest" repository "source.toby3d.me/website/indieauth/internal/ticket/repository/sqlite3" ) +//nolint: gochecknoglobals +var tableColumns []string = []string{"created_at", "resource", "subject", "ticket"} + func TestCreate(t *testing.T) { t.Parallel() - db, cleanup := sqltest.Open(t) + ticket := domain.TestTicket(t) + model := repository.NewTicket(ticket) + db, mock, cleanup := sqltest.Open(t) t.Cleanup(cleanup) - ticket := domain.TestTicket(t) - require.NoError(t, repository.NewSQLite3TicketRepository(db, domain.TestConfig(t)). - Create(context.Background(), ticket)) + createTable(t, mock) + mock.ExpectExec(regexp.QuoteMeta(`INSERT INTO tickets`)). + WithArgs( + sqltest.Time{}, + model.Resource, + model.Subject, + model.Ticket, + ). + WillReturnResult(sqlmock.NewResult(1, 1)) - results := make([]*repository.Ticket, 0) - require.NoError(t, db.Select(&results, "SELECT * FROM tickets;")) - require.Len(t, results, 1) - - result := new(domain.Ticket) - results[0].Populate(result) - - assert.Equal(t, ticket.Ticket, result.Ticket) + if err := repository.NewSQLite3TicketRepository(db, domain.TestConfig(t)). + Create(context.Background(), ticket); err != nil { + t.Error(err) + } } func TestGetAndDelete(t *testing.T) { t.Parallel() - db, cleanup := sqltest.Open(t) + ticket := domain.TestTicket(t) + model := repository.NewTicket(ticket) + db, mock, cleanup := sqltest.Open(t) t.Cleanup(cleanup) - ticket := domain.TestTicket(t) - _, err := db.NamedExec(repository.QueryTable+repository.QueryCreate, repository.NewTicket(ticket)) - require.NoError(t, err) + createTable(t, mock) + mock.ExpectBegin() + mock.ExpectQuery(regexp.QuoteMeta(`SELECT * FROM tickets`)). + WithArgs(model.Ticket). + WillReturnRows(sqlmock.NewRows(tableColumns). + AddRow( + model.CreatedAt.Time, + model.Resource, + model.Subject, + model.Ticket, + )) + mock.ExpectExec(regexp.QuoteMeta(`DELETE FROM tickets`)). + WithArgs(model.Ticket). + WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() result, err := repository.NewSQLite3TicketRepository(db, domain.TestConfig(t)). GetAndDelete(context.Background(), ticket.Ticket) - require.NoError(t, err) - assert.Equal(t, ticket.Ticket, result.Ticket) + if err != nil { + t.Fatal(err) + } - results := make([]*repository.Ticket, 0) - require.NoError(t, db.Select(&results, "SELECT * FROM tickets;")) - assert.Empty(t, results) + if result.Ticket != ticket.Ticket { + t.Errorf("GetAndDelete(%s) = %+v, want %+v", ticket.Ticket, result, ticket) + } +} + +func createTable(tb testing.TB, mock sqlmock.Sqlmock) { + tb.Helper() + + mock.ExpectExec(regexp.QuoteMeta(repository.QueryTable)). + WillReturnResult(sqlmock.NewResult(1, 1)) }