test(cabana): cover My account profile, password and avatar
- account_internal_test: metadata subtitle reader and writer (NULL, blank, null, [], invalid JSON, non-objects, key preservation, NULL on the last key), the attachOne contract, avatar cap, unique-violation mapping, English fallbacks, and 401 for non-backend principals on all three routes - account_test (Postgres): profile payload incl. copied WinterCMS metadata and avatar rows, trimmed profile saves and metadata keys, the forbidden-key allow-list with unchanged rows, email rules, password rules, the failed attempt log, Bearer and cookie session effects, CSRF, avatar upload, refusals (SVG, HTML as PNG, size, part shape, 413, no bucket) with no row or blob left, replace and remove with blob cleanup - lagoon: TestBackendAdminMetadataColumn covers type, Winter row round trip, rollback of only the column and re-migrate - SPA: AccountView, the user menu account item and avatar image, setCurrentUser and profileInitials; lang fixture gains myaccount keys
This commit is contained in:
@@ -509,3 +509,97 @@ func TestBackendAdminEmailIndexRefusesCaseDuplicates(t *testing.T) {
|
||||
t.Fatal("unique lower(email) index missing")
|
||||
}
|
||||
}
|
||||
|
||||
// TestBackendAdminMetadataColumn covers 202610090001_backend_users_metadata:
|
||||
// WinterCMS's nullable jsonable metadata column, added last, round-tripping a
|
||||
// Winter-shaped row, and a rollback that drops only that column.
|
||||
func TestBackendAdminMetadataColumn(t *testing.T) {
|
||||
db, _ := dedicatedDB(t, "lagoon_admin_metadata")
|
||||
gdb, err := Use(t.Context(), db)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := Migrate(gdb, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
columnType := func() (string, string, bool) {
|
||||
var cols []struct {
|
||||
DataType string
|
||||
Nullable string
|
||||
}
|
||||
if err := gdb.Raw(`SELECT data_type, is_nullable AS nullable FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'backend_users' AND column_name = 'metadata'`).Scan(&cols).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(cols) == 0 {
|
||||
return "", "", false
|
||||
}
|
||||
return cols[0].DataType, cols[0].Nullable, true
|
||||
}
|
||||
if typ, nullable, ok := columnType(); !ok || typ != "text" || nullable != "YES" {
|
||||
t.Fatalf("metadata column type=%q nullable=%q present=%v", typ, nullable, ok)
|
||||
}
|
||||
if err := gdb.Exec(`INSERT INTO backend_users (first_name, last_name, login, email, password, permissions, metadata, is_activated, is_superuser, created_at, updated_at)
|
||||
VALUES ('Ada', 'Lovelace', 'ada', 'ada@example.test', 'winter-hash', '{}', '{"subtitle":"Editor","x":1}', TRUE, FALSE, NOW(), NOW())`).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var stored *string
|
||||
if err := gdb.Raw(`SELECT metadata FROM backend_users WHERE login = 'ada'`).Scan(&stored).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if stored == nil || *stored != `{"subtitle":"Editor","x":1}` {
|
||||
t.Fatalf("metadata = %v", stored)
|
||||
}
|
||||
|
||||
history, err := HistoryTableName("summercms.cabana")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var ids []string
|
||||
if err := gdb.Table(history).Order("id").Pluck("id", &ids).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(ids) == 0 || ids[len(ids)-1] != "202610090001_backend_users_metadata" {
|
||||
t.Fatalf("cabana history = %v", ids)
|
||||
}
|
||||
if last := BackendAdminMigrations[len(BackendAdminMigrations)-1].ID; last != "202610090001_backend_users_metadata" {
|
||||
t.Fatalf("last BackendAdminMigrations entry = %s", last)
|
||||
}
|
||||
|
||||
m, err := migrator(gdb, "summercms.cabana", BackendAdminMigrations)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := m.RollbackLast(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, _, ok := columnType(); ok {
|
||||
t.Fatal("metadata survived its rollback")
|
||||
}
|
||||
var rows []struct {
|
||||
Login string
|
||||
Email string
|
||||
}
|
||||
if err := gdb.Raw(`SELECT login, email FROM backend_users`).Scan(&rows).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(rows) != 1 || rows[0].Login != "ada" || rows[0].Email != "ada@example.test" {
|
||||
t.Fatalf("rows after rollback = %+v", rows)
|
||||
}
|
||||
if !indexOn(indexDefs(t, gdb, "backend_users"), "lower(email)") {
|
||||
t.Fatal("rolling back metadata dropped the email index")
|
||||
}
|
||||
|
||||
if err := Migrate(gdb, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if typ, _, ok := columnType(); !ok || typ != "text" {
|
||||
t.Fatalf("metadata was not added back: %q %v", typ, ok)
|
||||
}
|
||||
var restored *string
|
||||
if err := gdb.Raw(`SELECT metadata FROM backend_users WHERE login = 'ada'`).Scan(&restored).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if restored != nil {
|
||||
t.Fatalf("re-added metadata = %q, want NULL", *restored)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user