package database import ( "strings" "testing" ) func TestAssertTestDatabaseName(t *testing.T) { t.Parallel() cases := []struct { name string wantErr string }{ {name: "hfb_sys_test", wantErr: ""}, {name: "hfb_sys_test_order", wantErr: ""}, {name: "hfb_e2e_flow", wantErr: ""}, {name: "", wantErr: "必须包含数据库名"}, {name: "hfb-sys-test", wantErr: "只允许字母、数字、下划线"}, {name: "hfb_sys", wantErr: "需包含 test 或 e2e"}, {name: strings.Repeat("test_", 20), wantErr: "超过 MySQL 上限"}, } for _, item := range cases { err := assertTestDatabaseName(item.name) if item.wantErr == "" { if err != nil { t.Fatalf("%q: unexpected error %v", item.name, err) } continue } if err == nil || !strings.Contains(err.Error(), item.wantErr) { t.Fatalf("%q: error = %v, want containing %q", item.name, err, item.wantErr) } } } func TestGooseUpSQL(t *testing.T) { t.Parallel() raw := "-- +goose Up\nCREATE TABLE t (id INT);\n-- +goose Down\nDROP TABLE t;\n" got := strings.TrimSpace(gooseUpSQL(raw)) if got != "CREATE TABLE t (id INT);" { t.Fatalf("gooseUpSQL = %q", got) } } func TestNewDryRunDB(t *testing.T) { t.Parallel() if NewDryRunDB() == nil { t.Fatal("NewDryRunDB returned nil") } } func TestNewTestDBTruncatesBetweenCalls(t *testing.T) { db := NewTestDB() if err := db.Exec("INSERT INTO users (phone) VALUES ('13900001111')").Error; err != nil { t.Fatalf("insert user: %v", err) } var n int64 if err := db.Raw("SELECT COUNT(*) FROM users").Scan(&n).Error; err != nil { t.Fatal(err) } if n != 1 { t.Fatalf("users count = %d, want 1", n) } db = NewTestDB() if err := db.Raw("SELECT COUNT(*) FROM users").Scan(&n).Error; err != nil { t.Fatal(err) } if n != 0 { t.Fatalf("users count after reset = %d, want 0", n) } } func TestNewTestDBKeepsSchemaFingerprint(t *testing.T) { db := NewTestDB() var fingerprint string if err := db.Raw("SELECT v FROM " + schemaMetaTable + " WHERE k = 'fingerprint'").Scan(&fingerprint).Error; err != nil { t.Fatalf("read fingerprint: %v", err) } if fingerprint == "" { t.Fatal("expected schema fingerprint to survive truncate") } } func TestNewTestDBResetsAutoIncrement(t *testing.T) { db := NewTestDB() if err := db.Exec("INSERT INTO users (phone) VALUES ('13900002222')").Error; err != nil { t.Fatal(err) } db = NewTestDB() if err := db.Exec("INSERT INTO users (phone) VALUES ('13900003333')").Error; err != nil { t.Fatal(err) } var id uint64 if err := db.Raw("SELECT id FROM users WHERE phone = '13900003333'").Scan(&id).Error; err != nil { t.Fatal(err) } if id != 1 { t.Fatalf("id after reset = %d, want 1", id) } }