Files
Gumble-Backend/internal/util/db/db_test.go
Zane Walker 7e940c83a7
Some checks failed
Build & Test / build-test (push) Has been cancelled
Build & Test / swagger-codegen-cli (push) Has been cancelled
CodeQL / Analyze (go) (push) Has been cancelled
(Feat): Initial Commit
2026-07-03 19:41:31 +05:30

191 lines
4.6 KiB
Go

package db_test
import (
"database/sql"
"fmt"
"testing"
"allaboutapps.dev/aw/go-starter/internal/models"
"allaboutapps.dev/aw/go-starter/internal/test"
"allaboutapps.dev/aw/go-starter/internal/util/db"
"github.com/aarondl/null/v8"
"github.com/aarondl/sqlboiler/v4/boil"
"github.com/aarondl/sqlboiler/v4/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestWithTransactionSuccess(t *testing.T) {
test.WithTestDatabase(t, func(sqlDB *sql.DB) {
ctx := t.Context()
count, err := models.Users().Count(ctx, sqlDB)
require.NoError(t, err)
assert.Positive(t, count)
err = db.WithTransaction(ctx, sqlDB, func(tx boil.ContextExecutor) error {
newUser := models.User{
IsActive: true,
Username: null.StringFrom("test"),
Scopes: types.StringArray{"cms"},
}
if err := newUser.Insert(ctx, tx, boil.Infer()); err != nil {
return fmt.Errorf("failed to insert user: %w", err)
}
newCount, err := models.Users().Count(ctx, tx)
require.NoError(t, err)
assert.Equal(t, count+1, newCount)
delCnt, err := models.Users().DeleteAll(ctx, tx)
if err != nil {
return fmt.Errorf("failed to delete all users: %w", err)
}
assert.Equal(t, newCount, delCnt)
newCount, err = models.Users().Count(ctx, tx)
require.NoError(t, err)
assert.Equal(t, int64(0), newCount)
return nil
})
require.NoError(t, err)
newCount, err := models.Users().Count(ctx, sqlDB)
require.NoError(t, err)
assert.Equal(t, int64(0), newCount)
})
}
func TestWithTransactionWithError(t *testing.T) {
test.WithTestDatabase(t, func(sqlDB *sql.DB) {
ctx := t.Context()
count, err := models.Users().Count(ctx, sqlDB)
require.NoError(t, err)
assert.Positive(t, count)
err = db.WithTransaction(ctx, sqlDB, func(tx boil.ContextExecutor) error {
newUser := models.User{
IsActive: true,
Username: null.StringFrom("test"),
Scopes: types.StringArray{"cms"},
}
err := newUser.Insert(ctx, tx, boil.Infer())
require.NoError(t, err)
newCount, err := models.Users().Count(ctx, tx)
require.NoError(t, err)
assert.Equal(t, count+1, newCount)
delCnt, err := models.Users().DeleteAll(ctx, tx)
require.NoError(t, err)
assert.Equal(t, newCount, delCnt)
newCount, err = models.Users().Count(ctx, tx)
require.NoError(t, err)
assert.Equal(t, int64(0), newCount)
newUser2 := models.User{
IsActive: true,
Username: null.StringFrom("test"),
}
return newUser2.Insert(ctx, tx, boil.Infer())
})
require.Error(t, err)
newCount, err := models.Users().Count(ctx, sqlDB)
require.NoError(t, err)
assert.Equal(t, count, newCount)
})
}
func TestWithTransactionWithPanic(t *testing.T) {
test.WithTestDatabase(t, func(sqlDB *sql.DB) {
ctx := t.Context()
count, err := models.Users().Count(ctx, sqlDB)
require.NoError(t, err)
assert.Positive(t, count)
panicFunc := func() {
_ = db.WithTransaction(ctx, sqlDB, func(tx boil.ContextExecutor) error {
newUser := models.User{
IsActive: true,
Username: null.StringFrom("test"),
Scopes: types.StringArray{"cms"},
}
err := newUser.Insert(ctx, tx, boil.Infer())
require.NoError(t, err)
newCount, err := models.Users().Count(ctx, tx)
require.NoError(t, err)
assert.Equal(t, count+1, newCount)
delCnt, err := models.Users().DeleteAll(ctx, tx)
require.NoError(t, err)
assert.Equal(t, newCount, delCnt)
newCount, err = models.Users().Count(ctx, tx)
require.NoError(t, err)
assert.Equal(t, int64(0), newCount)
panic("some panic")
})
}
require.Panics(t, panicFunc)
newCount, err := models.Users().Count(ctx, sqlDB)
require.NoError(t, err)
assert.Equal(t, count, newCount)
})
}
func TestDBTypeConversions(t *testing.T) {
i64 := int64(19)
res := db.NullIntFromInt64Ptr(&i64)
assert.Equal(t, 19, res.Int)
assert.True(t, res.Valid)
res = db.NullIntFromInt64Ptr(nil)
assert.False(t, res.Valid)
f := 19.9999
res2 := db.NullFloat32FromFloat64Ptr(&f)
assert.InDelta(t, float32(f), res2.Float32, 0.0001)
assert.True(t, res2.Valid)
res2 = db.NullFloat32FromFloat64Ptr(nil)
assert.False(t, res2.Valid)
i16 := int16(19)
res3 := db.NullIntFromInt16Ptr(&i16)
assert.Equal(t, 19, res3.Int)
assert.True(t, res3.Valid)
res4 := db.Int16PtrFromNullInt(res3)
require.NotEmpty(t, res4)
assert.Equal(t, i16, *res4)
res5 := db.Int16PtrFromNullInt(null.IntFromPtr(nil))
assert.Empty(t, res5)
i := 7
res6 := db.Int16PtrFromInt(i)
require.NotEmpty(t, res6)
assert.Equal(t, i, int(*res6))
res7 := db.NullStringIfEmpty("")
assert.False(t, res7.Valid)
s := "foo"
res8 := db.NullStringIfEmpty(s)
assert.True(t, res8.Valid)
assert.Equal(t, s, res8.String)
}