datastore/internal/dal/impl_test.go
Luís Murta a52bca5882
Adapt API implementation with DAL interface
Swap direct access to the DB on the API server with an data abstraction
layer.
Implement each API type converter separately and revert changes to the
auto-generated server implementation types.

Add error return to DAL methods. Implement `Transactions`.

Add tools.go with oapi-codegen and mockgen.
https://www.jvt.me/posts/2022/06/15/go-tools-dependency-management/

Update go packages.

Issues #5, #12
2024-05-12 22:16:24 +01:00

165 lines
3.5 KiB
Go

package dal
import (
"database/sql"
"database/sql/driver"
"reflect"
"testing"
"time"
"git.rosemyrtle.work/personal-finance/server/internal/entity"
"github.com/DATA-DOG/go-sqlmock"
"github.com/shopspring/decimal"
)
func TestDalImpl_Transaction(t *testing.T) {
type fields struct {
Db *sql.DB
}
tests := []struct {
name string
fields fields
want entity.Transaction
wantErr bool
}{
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
d := &DalImpl{
Db: tt.fields.Db,
}
got, err := d.Transaction()
if (err != nil) != tt.wantErr {
t.Errorf("DalImpl.Transaction() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("DalImpl.Transaction() = %v, want %v", got, tt.want)
}
})
}
}
func TestDalImpl_Transactions(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatal(err)
}
date := time.Now()
type fields struct {
Db *sql.DB
}
type args struct {
rows [][]driver.Value
}
tests := []struct {
name string
fields fields
args args
want entity.Transactions
wantErr bool
}{
{"empty", fields{db}, args{}, nil, false},
{
"without category",
fields{db},
args{[][]driver.Value{
{1, date, "income", 1000},
{2, date, "expense", -10.50},
}},
entity.Transactions{
{Id: 1, Date: date, Description: "income", Value: decimal.NewFromInt(1000)},
{Id: 2, Date: date, Description: "expense", Value: decimal.NewFromFloat(-10.50)},
},
false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
dal := &DalImpl{
Db: tt.fields.Db,
}
mock.
// ExpectQuery("^SELECT .* FROM .*transactions t LEFT JOIN .*transactions_categorized tc ON t.id = tc.id$").
ExpectQuery("^SELECT .* FROM .*transactions t$").
WithoutArgs().
WillReturnRows(
mock.
// NewRows([]string{"category", "date", "description", "id", "amount"}).
NewRows([]string{"id", "date", "description", "amount"}).
AddRows(tt.args.rows...),
)
got, err := dal.Transactions()
if (err != nil) != tt.wantErr {
t.Errorf("DalImpl.Transactions() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("DalImpl.Transactions() = %v, want %v", got, tt.want)
}
})
}
}
func TestDalImpl_Bank(t *testing.T) {
type fields struct {
Db *sql.DB
}
tests := []struct {
name string
fields fields
want entity.Bank
wantErr bool
}{
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
d := &DalImpl{
Db: tt.fields.Db,
}
got, err := d.Bank()
if (err != nil) != tt.wantErr {
t.Errorf("DalImpl.Bank() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("DalImpl.Bank() = %v, want %v", got, tt.want)
}
})
}
}
func TestDalImpl_Banks(t *testing.T) {
type fields struct {
Db *sql.DB
}
tests := []struct {
name string
fields fields
want entity.Banks
wantErr bool
}{
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
d := &DalImpl{
Db: tt.fields.Db,
}
got, err := d.Banks()
if (err != nil) != tt.wantErr {
t.Errorf("DalImpl.Banks() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("DalImpl.Banks() = %v, want %v", got, tt.want)
}
})
}
}