check / check (push) Waiting to run
The main database, each webhook's event database and each archive file get their schema from SQL files under internal/db/migrations/, one directory per kind. Opening a file runs, in one transaction, each file that schema_migrations does not list. GORM stays for queries. AutoMigrate is gone, tests included. An event database holds only its own tables now, so the sweep that removed target rows copied into it is deleted. The association guard stays: without it a delivery write fails on the missing targets table. AutoMigrate also had GORM parse every model before a handle was shared. That is now done on its own: GORM races when two goroutines first use models that refer to each other. Model: opus-5-5
58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
package migrations_test
|
|
|
|
import (
|
|
"database/sql"
|
|
"log/slog"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
_ "modernc.org/sqlite"
|
|
"sneak.berlin/go/webhooker/internal/db/migrations"
|
|
"sneak.berlin/go/webhooker/internal/gormlog"
|
|
)
|
|
|
|
// TestApplyRunsEachFileOnce applies each kind of database file's
|
|
// migrations to a new file twice. The first time records every file.
|
|
// The second finds them all recorded and runs none, which is the only
|
|
// way it can succeed: 001_schema.sql creates tables that then exist.
|
|
func TestApplyRunsEachFileOnce(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
for _, dir := range []string{
|
|
migrations.Main, migrations.Events, migrations.Archive,
|
|
} {
|
|
t.Run(dir, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
sqlDB, err := sql.Open(
|
|
"sqlite", filepath.Join(t.TempDir(), "test.db"),
|
|
)
|
|
require.NoError(t, err)
|
|
|
|
t.Cleanup(func() { _ = sqlDB.Close() })
|
|
|
|
db, err := gorm.Open(
|
|
sqlite.Dialector{Conn: sqlDB},
|
|
&gorm.Config{
|
|
Logger: gormlog.New(slog.New(slog.DiscardHandler)),
|
|
},
|
|
)
|
|
require.NoError(t, err)
|
|
|
|
require.NoError(t, migrations.Apply(db, dir))
|
|
require.NoError(t, migrations.Apply(db, dir))
|
|
|
|
var versions string
|
|
|
|
require.NoError(t, sqlDB.QueryRowContext(t.Context(),
|
|
"SELECT group_concat(version) FROM schema_migrations",
|
|
).Scan(&versions))
|
|
assert.Equal(t, "0,1", versions)
|
|
})
|
|
}
|
|
}
|