package testutil import ( "fmt" "os" "testing" "mengstack/internal/config" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" ) func TestDSN() string { host := envOr("TEST_DB_HOST", "127.0.0.1") port := envOr("TEST_DB_PORT", "5432") user := envOr("TEST_DB_USER", "postgres") pass := envOr("TEST_DB_PASSWORD", "postgres") dbname := envOr("TEST_DB_NAME", "mengstack_test") sslmode := envOr("TEST_DB_SSLMODE", "disable") return fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s TimeZone=Asia/Shanghai", host, port, user, pass, dbname, sslmode) } func NewTestDB(t *testing.T) *gorm.DB { t.Helper() dsn := TestDSN() db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) if err != nil { t.Skipf("test database not available: %v", err) } sqlDB, err := db.DB() if err != nil { t.Fatalf("get underlying db: %v", err) } t.Cleanup(func() { sqlDB.Close() }) return db } func CleanDB(t *testing.T, db *gorm.DB) { t.Helper() tables := []string{"user_roles", "role_permissions", "roles", "permissions", "notifications", "audit_logs", "settings", "examples", "users", "tenants"} for _, table := range tables { if err := db.Exec("DELETE FROM " + table).Error; err != nil { t.Logf("warning: clean table %s: %v", table, err) } } } func TestConfig() *config.Config { return &config.Config{ Server: config.ServerConfig{Port: 0, Mode: "test"}, Database: config.DatabaseConfig{ Host: envOr("TEST_DB_HOST", "127.0.0.1"), Port: parseIntEnv("TEST_DB_PORT", 5432), User: envOr("TEST_DB_USER", "postgres"), Password: envOr("TEST_DB_PASSWORD", "postgres"), DBName: envOr("TEST_DB_NAME", "mengstack_test"), SSLMode: envOr("TEST_DB_SSLMODE", "disable"), }, JWT: config.JWTConfig{ Secret: "test-secret-key-min-32-chars-long!", AccessExpiryMinutes: 30, RefreshExpiryDays: 7, Issuer: "mengstack-test", }, } } func envOr(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } func parseIntEnv(key string, fallback int) int { v := os.Getenv(key) if v == "" { return fallback } var n int fmt.Sscanf(v, "%d", &n) if n == 0 { return fallback } return n }