mengstack-api/internal/testutil/db.go
MengStack Dev df809f1045
Some checks failed
CI / Build & Test (push) Failing after 1m31s
feat: user CRUD API + dashboard stats + kernel infrastructure
- Add user management endpoints (list/create/get/update/delete) with pagination and search
- Add dashboard stats endpoint with tenant/user/online counts and growth metrics
- Add tenant resolver middleware for multi-tenant request scoping
- Add i18n kernel with zh/en message files and AcceptLanguage middleware
- Add WebSocket hub/handler for real-time communication
- Add job scheduler kernel with cron support
- Add plugin sandbox for isolated execution
- Add storage kernel (local filesystem)
- Add event bus kernel for pub/sub
- Add cache kernel abstraction
- Add database migration runner and version upgrade checker
- Add rate limiting middleware with Redis backend
- Add SQL migrations for rbac, audit_logs, settings, notifications, examples
- Extend user repository with list/delete/count operations
- Register all module routes with tenant resolver
2026-10-03 03:42:58 +08:00

98 lines
2.2 KiB
Go

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
}