✅ Used SQLMock for ticket repository tests
This commit is contained in:
parent
4fd5941ab3
commit
73dabf32cc
|
@ -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) {
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue