Some checks failed
CI / Build & Test (push) Failing after 1m31s
- 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
98 lines
2.2 KiB
Go
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
|
|
}
|