Used SQLMock for ticket repository tests

This commit is contained in:
Maxim Lebedev 2022-01-31 16:57:23 +05:00
parent 4fd5941ab3
commit 73dabf32cc
Signed by: toby3d
GPG Key ID: 1F14E25B7C119FC5
2 changed files with 56 additions and 25 deletions

View File

@ -47,6 +47,8 @@ const (
) )
func NewSQLite3TicketRepository(db *sqlx.DB, config *domain.Config) ticket.Repository { func NewSQLite3TicketRepository(db *sqlx.DB, config *domain.Config) ticket.Repository {
db.MustExec(QueryTable)
return &sqlite3TicketRepository{ return &sqlite3TicketRepository{
config: config, config: config,
db: db, 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 { 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) 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) 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() defer tx.Rollback()
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {

View File

@ -2,52 +2,81 @@ package sqlite3_test
import ( import (
"context" "context"
"regexp"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/DATA-DOG/go-sqlmock"
"github.com/stretchr/testify/require"
"source.toby3d.me/website/indieauth/internal/domain" "source.toby3d.me/website/indieauth/internal/domain"
"source.toby3d.me/website/indieauth/internal/testing/sqltest" "source.toby3d.me/website/indieauth/internal/testing/sqltest"
repository "source.toby3d.me/website/indieauth/internal/ticket/repository/sqlite3" 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) { func TestCreate(t *testing.T) {
t.Parallel() t.Parallel()
db, cleanup := sqltest.Open(t) ticket := domain.TestTicket(t)
model := repository.NewTicket(ticket)
db, mock, cleanup := sqltest.Open(t)
t.Cleanup(cleanup) t.Cleanup(cleanup)
ticket := domain.TestTicket(t) createTable(t, mock)
require.NoError(t, repository.NewSQLite3TicketRepository(db, domain.TestConfig(t)). mock.ExpectExec(regexp.QuoteMeta(`INSERT INTO tickets`)).
Create(context.Background(), ticket)) WithArgs(
sqltest.Time{},
model.Resource,
model.Subject,
model.Ticket,
).
WillReturnResult(sqlmock.NewResult(1, 1))
results := make([]*repository.Ticket, 0) if err := repository.NewSQLite3TicketRepository(db, domain.TestConfig(t)).
require.NoError(t, db.Select(&results, "SELECT * FROM tickets;")) Create(context.Background(), ticket); err != nil {
require.Len(t, results, 1) t.Error(err)
}
result := new(domain.Ticket)
results[0].Populate(result)
assert.Equal(t, ticket.Ticket, result.Ticket)
} }
func TestGetAndDelete(t *testing.T) { func TestGetAndDelete(t *testing.T) {
t.Parallel() t.Parallel()
db, cleanup := sqltest.Open(t) ticket := domain.TestTicket(t)
model := repository.NewTicket(ticket)
db, mock, cleanup := sqltest.Open(t)
t.Cleanup(cleanup) t.Cleanup(cleanup)
ticket := domain.TestTicket(t) createTable(t, mock)
_, err := db.NamedExec(repository.QueryTable+repository.QueryCreate, repository.NewTicket(ticket)) mock.ExpectBegin()
require.NoError(t, err) 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)). result, err := repository.NewSQLite3TicketRepository(db, domain.TestConfig(t)).
GetAndDelete(context.Background(), ticket.Ticket) GetAndDelete(context.Background(), ticket.Ticket)
require.NoError(t, err) if err != nil {
assert.Equal(t, ticket.Ticket, result.Ticket) t.Fatal(err)
}
results := make([]*repository.Ticket, 0) if result.Ticket != ticket.Ticket {
require.NoError(t, db.Select(&results, "SELECT * FROM tickets;")) t.Errorf("GetAndDelete(%s) = %+v, want %+v", ticket.Ticket, result, ticket)
assert.Empty(t, results) }
}
func createTable(tb testing.TB, mock sqlmock.Sqlmock) {
tb.Helper()
mock.ExpectExec(regexp.QuoteMeta(repository.QueryTable)).
WillReturnResult(sqlmock.NewResult(1, 1))
} }