test(03-04): cover framework database, routing and JWT boundaries

- Shared pgx/GORM pool, ICU locale fail, and isolated plugin migrations
- Seven-stage middleware order, missing-guard boot failure, typed 404s
- Adversarial JWT matrix including alg:none, empty secret, and no leak

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jakub Zych
2026-09-17 20:29:46 +02:00
parent f4fecc959f
commit 92255a46ed
10 changed files with 989 additions and 11 deletions

View File

@@ -10,7 +10,9 @@ import (
"git.golem15.com/golem15/summercms/backpack"
"git.golem15.com/golem15/summercms/bonfire"
"git.golem15.com/golem15/summercms/pact"
"git.golem15.com/golem15/summercms/party"
"github.com/go-gormigrate/gormigrate/v2"
"gorm.io/gorm"
)
@@ -123,3 +125,139 @@ func TestRollbackMissingPluginIsNamedError(t *testing.T) {
t.Fatalf("got %v", err)
}
}
type migPlugin struct {
id string
migrations []*gormigrate.Migration
}
func (p migPlugin) ID() string { return p.id }
func (p migPlugin) Requires() []string { return nil }
func (p migPlugin) Register(*backpack.App) error { return nil }
func (p migPlugin) Boot(*backpack.App) error { return nil }
func (p migPlugin) Migrations() []*gormigrate.Migration { return p.migrations }
func TestTwoPluginMigrationSetsIsolated(t *testing.T) {
db, _ := dedicatedDB(t, "lagoon_mig_iso")
gdb, err := Use(t.Context(), db)
if err != nil {
t.Fatal(err)
}
alpha := migPlugin{
id: "demo.alpha",
migrations: []*gormigrate.Migration{{
ID: "202609170001_create_alpha",
Migrate: func(tx *gorm.DB) error {
return tx.Exec(`CREATE TABLE lagoon_alpha (id BIGSERIAL PRIMARY KEY, name TEXT NOT NULL)`).Error
},
Rollback: func(tx *gorm.DB) error {
return tx.Exec(`DROP TABLE IF EXISTS lagoon_alpha`).Error
},
}},
}
beta := migPlugin{
id: "demo.beta",
migrations: []*gormigrate.Migration{
{
ID: "202609170001_create_beta",
Migrate: func(tx *gorm.DB) error {
return tx.Exec(`CREATE TABLE lagoon_beta (id BIGSERIAL PRIMARY KEY, name TEXT NOT NULL)`).Error
},
Rollback: func(tx *gorm.DB) error {
return tx.Exec(`DROP TABLE IF EXISTS lagoon_beta`).Error
},
},
{
ID: "202609170002_seed_beta",
Migrate: func(tx *gorm.DB) error {
return tx.Exec(`INSERT INTO lagoon_beta (name) VALUES ('seed')`).Error
},
Rollback: func(tx *gorm.DB) error {
return tx.Exec(`DELETE FROM lagoon_beta WHERE name = 'seed'`).Error
},
},
},
}
plugins := []party.Plugin{alpha, beta}
if err := Migrate(gdb, plugins); err != nil {
t.Fatal(err)
}
if err := Migrate(gdb, plugins); err != nil {
t.Fatalf("idempotent migrate: %v", err)
}
status, err := Status(gdb, plugins)
if err != nil {
t.Fatal(err)
}
if len(status) != 2 {
t.Fatalf("status rows = %+v", status)
}
if status[0].Plugin != "demo.alpha" || status[0].Table != "summer_migrations_demo_alpha" || strings.Join(status[0].IDs, ",") != "202609170001_create_alpha" {
t.Fatalf("alpha status = %+v", status[0])
}
if status[1].Plugin != "demo.beta" || status[1].Table != "summer_migrations_demo_beta" || strings.Join(status[1].IDs, ",") != "202609170001_create_beta,202609170002_seed_beta" {
t.Fatalf("beta status = %+v", status[1])
}
if !gdb.Migrator().HasTable("lagoon_alpha") || !gdb.Migrator().HasTable("lagoon_beta") {
t.Fatal("both plugin tables must exist after migrate")
}
var seedName string
if err := gdb.Raw(`SELECT name FROM lagoon_beta`).Scan(&seedName).Error; err != nil {
t.Fatal(err)
}
if seedName != "seed" {
t.Fatalf("seed = %q", seedName)
}
if err := RollbackLast(gdb, plugins, "demo.beta"); err != nil {
t.Fatal(err)
}
var n int64
if err := gdb.Table("lagoon_beta").Count(&n).Error; err != nil {
t.Fatal(err)
}
if n != 0 {
t.Fatalf("beta seed rollback left %d rows", n)
}
if !gdb.Migrator().HasTable("lagoon_alpha") || !gdb.Migrator().HasTable("lagoon_beta") {
t.Fatal("schema rollback must not run on the first beta RollbackLast")
}
status, err = Status(gdb, plugins)
if err != nil {
t.Fatal(err)
}
if strings.Join(status[0].IDs, ",") != "202609170001_create_alpha" {
t.Fatalf("alpha history changed: %+v", status[0])
}
if strings.Join(status[1].IDs, ",") != "202609170001_create_beta" {
t.Fatalf("beta history = %+v", status[1])
}
if err := RollbackLast(gdb, plugins, "demo.beta"); err != nil {
t.Fatal(err)
}
if gdb.Migrator().HasTable("lagoon_beta") {
t.Fatal("second beta rollback must drop lagoon_beta")
}
if !gdb.Migrator().HasTable("lagoon_alpha") {
t.Fatal("alpha table must survive beta rollback")
}
status, err = Status(gdb, plugins)
if err != nil {
t.Fatal(err)
}
if len(status[0].IDs) != 1 {
t.Fatalf("alpha history after beta down = %+v", status[0])
}
if len(status[1].IDs) != 0 {
t.Fatalf("beta history should be empty, got %+v", status[1])
}
}
var _ pact.HasMigrations = migPlugin{}