50 lines
1.3 KiB
Go
50 lines
1.3 KiB
Go
package business
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/glebarez/sqlite"
|
|
"gorm.io/gorm"
|
|
"kra/internal/biz/business"
|
|
)
|
|
|
|
func TestBusinessTablesAvailabilityIsFreshAndPropagatesFailures(t *testing.T) {
|
|
db, err := gorm.Open(sqlite.Open(filepath.Join(t.TempDir(), "schema.db")), &gorm.Config{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
pool, err := db.DB()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { _ = pool.Close() })
|
|
check := func(want bool, names ...string) {
|
|
t.Helper()
|
|
got, err := businessTablesAvailable(db, names...)
|
|
if err != nil || got != want {
|
|
t.Fatalf("tables %v: got %v, %v; want %v", names, got, err, want)
|
|
}
|
|
}
|
|
check(true)
|
|
check(false, "first", "second")
|
|
for _, table := range []string{"first", "second"} {
|
|
if err := db.Exec("CREATE TABLE " + table + " (id INTEGER)").Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
check(true, "first", "second", "first")
|
|
check(false, "first", "missing")
|
|
check(false, "first') OR 1=1 --")
|
|
if err := db.Exec("DROP TABLE second").Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
check(false, "first", "second")
|
|
if err := pool.Close(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if available, err := businessTablesAvailable(db, "first"); available || err != business.ErrStorage {
|
|
t.Fatalf("connection error must not become a missing-table result: %v, %v", available, err)
|
|
}
|
|
}
|