mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-10-01 00:26:38 +08:00
3f80278dd4
Run Postgres id-sequence repair on every startup migration and add contract coverage plus a GitHub Actions Postgres job to catch schema-drift regressions before release.
79 lines
1.9 KiB
Go
79 lines
1.9 KiB
Go
package sqlite
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"testing"
|
|
|
|
"go-backend/internal/store"
|
|
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
func TestMigrateSchemaRunsPostgresIDRepairEvenAtCurrentVersion(t *testing.T) {
|
|
raw, err := sql.Open("sqlite", ":memory:")
|
|
if err != nil {
|
|
t.Fatalf("open sqlite: %v", err)
|
|
}
|
|
t.Cleanup(func() {
|
|
_ = raw.Close()
|
|
})
|
|
|
|
db := store.Wrap(raw, store.DialectPostgres)
|
|
if _, err := db.Exec(`CREATE TABLE schema_version (version INTEGER NOT NULL DEFAULT 0)`); err != nil {
|
|
t.Fatalf("create schema_version: %v", err)
|
|
}
|
|
if _, err := db.Exec(`INSERT INTO schema_version(version) VALUES(?)`, currentSchemaVersion); err != nil {
|
|
t.Fatalf("seed schema_version: %v", err)
|
|
}
|
|
|
|
called := 0
|
|
original := ensurePostgresIDDefaultsFn
|
|
ensurePostgresIDDefaultsFn = func(db *store.DB) error {
|
|
called++
|
|
return nil
|
|
}
|
|
t.Cleanup(func() {
|
|
ensurePostgresIDDefaultsFn = original
|
|
})
|
|
|
|
if err := migrateSchema(db); err != nil {
|
|
t.Fatalf("migrateSchema: %v", err)
|
|
}
|
|
if called != 1 {
|
|
t.Fatalf("expected postgres id repair to run once, got %d", called)
|
|
}
|
|
}
|
|
|
|
func TestMigrateSchemaReturnsPostgresIDRepairError(t *testing.T) {
|
|
raw, err := sql.Open("sqlite", ":memory:")
|
|
if err != nil {
|
|
t.Fatalf("open sqlite: %v", err)
|
|
}
|
|
t.Cleanup(func() {
|
|
_ = raw.Close()
|
|
})
|
|
|
|
db := store.Wrap(raw, store.DialectPostgres)
|
|
if _, err := db.Exec(`CREATE TABLE schema_version (version INTEGER NOT NULL DEFAULT 0)`); err != nil {
|
|
t.Fatalf("create schema_version: %v", err)
|
|
}
|
|
if _, err := db.Exec(`INSERT INTO schema_version(version) VALUES(?)`, currentSchemaVersion); err != nil {
|
|
t.Fatalf("seed schema_version: %v", err)
|
|
}
|
|
|
|
wantErr := errors.New("repair failed")
|
|
original := ensurePostgresIDDefaultsFn
|
|
ensurePostgresIDDefaultsFn = func(db *store.DB) error {
|
|
return wantErr
|
|
}
|
|
t.Cleanup(func() {
|
|
ensurePostgresIDDefaultsFn = original
|
|
})
|
|
|
|
err = migrateSchema(db)
|
|
if !errors.Is(err, wantErr) {
|
|
t.Fatalf("expected error %v, got %v", wantErr, err)
|
|
}
|
|
}
|