test: 测试库改为模板克隆并纳入完整租号 e2e
每个包不再重复 DROP+迁移,清空改用 DELETE 并重置自增,go test ./... 从约 6 分钟降到十几秒。租号全链路改走 NewTestDB,去掉依赖额外 DSN 才会跑的过渡测试。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -18,27 +18,7 @@ import (
|
||||
|
||||
func openDistributionE2EDB(t *testing.T) *gorm.DB {
|
||||
t.Helper()
|
||||
db := database.NewTestDB()
|
||||
sqlDB, err := db.DB()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
sqlDB.SetMaxOpenConns(1)
|
||||
|
||||
if err := database.MigrateRentalTransactionTestSchema(db); err != nil {
|
||||
t.Fatalf("migrate rental transaction schema failed: %v", err)
|
||||
}
|
||||
if err := database.AutoMigrateIfMissing(db,
|
||||
&model.Role{}, &model.Permission{}, &model.AdminUserRole{}, &model.RolePermission{},
|
||||
&model.PaymentMerchantConfig{},
|
||||
&model.DistributionSiteMember{}, &model.DistributionRuleVersion{}, &model.DistributionOrderFinancial{},
|
||||
&model.DistributionOrderParty{}, &model.DistributionSitePaymentChannel{},
|
||||
&model.DistributionSettlementBatch{}, &model.DistributionSettlementItem{},
|
||||
&model.WithdrawalRequest{},
|
||||
); err != nil {
|
||||
t.Fatalf("auto migrate distribution schema failed: %v", err)
|
||||
}
|
||||
return db
|
||||
return database.NewTestDB()
|
||||
}
|
||||
|
||||
// TestE2EScenario1_MainSiteReceive_SubSiteMarkupSell_Settlement
|
||||
|
||||
@@ -2,22 +2,14 @@ package e2e
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
mysqldriver "github.com/go-sql-driver/mysql"
|
||||
"gorm.io/driver/mysql"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
|
||||
"hfb_sys/backend/internal/auditlog"
|
||||
"hfb_sys/backend/internal/database"
|
||||
"hfb_sys/backend/internal/model"
|
||||
"hfb_sys/backend/internal/modules/adminfinance"
|
||||
"hfb_sys/backend/internal/modules/dispute"
|
||||
@@ -254,102 +246,7 @@ func (c fixedConfig) FindValue(ctx context.Context, key string) (string, error)
|
||||
|
||||
func openE2EDB(t *testing.T) *gorm.DB {
|
||||
t.Helper()
|
||||
|
||||
rawDSN := os.Getenv("HFB_E2E_DSN")
|
||||
if rawDSN == "" {
|
||||
t.Skip("设置 HFB_E2E_DSN 后运行完整租号链路 e2e 测试")
|
||||
}
|
||||
cfg, err := mysqldriver.ParseDSN(rawDSN)
|
||||
if err != nil {
|
||||
t.Fatalf("解析 HFB_E2E_DSN 失败: %v", err)
|
||||
}
|
||||
dbName := cfg.DBName
|
||||
assertSafeTestDBName(t, dbName)
|
||||
|
||||
serverCfg := cfg.Clone()
|
||||
serverCfg.DBName = ""
|
||||
serverDB, err := sql.Open("mysql", serverCfg.FormatDSN())
|
||||
if err != nil {
|
||||
t.Fatalf("连接 MySQL server 失败: %v", err)
|
||||
}
|
||||
defer serverDB.Close()
|
||||
if _, err := serverDB.Exec("DROP DATABASE IF EXISTS `" + dbName + "`"); err != nil {
|
||||
t.Fatalf("删除测试库失败: %v", err)
|
||||
}
|
||||
if _, err := serverDB.Exec("CREATE DATABASE `" + dbName + "` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); err != nil {
|
||||
t.Fatalf("创建测试库失败: %v", err)
|
||||
}
|
||||
|
||||
cfg.ParseTime = true
|
||||
cfg.MultiStatements = true
|
||||
sqlDB, err := sql.Open("mysql", cfg.FormatDSN())
|
||||
if err != nil {
|
||||
t.Fatalf("连接测试库失败: %v", err)
|
||||
}
|
||||
t.Cleanup(func() { _ = sqlDB.Close() })
|
||||
applyMigrations(t, sqlDB)
|
||||
|
||||
gormDB, err := gorm.Open(mysql.New(mysql.Config{Conn: sqlDB}), &gorm.Config{
|
||||
Logger: logger.Default.LogMode(logger.Silent),
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("打开 gorm 连接失败: %v", err)
|
||||
}
|
||||
return gormDB
|
||||
}
|
||||
|
||||
func assertSafeTestDBName(t *testing.T, dbName string) {
|
||||
t.Helper()
|
||||
if dbName == "" {
|
||||
t.Fatal("HFB_E2E_DSN 必须包含数据库名")
|
||||
}
|
||||
if !regexp.MustCompile(`^[A-Za-z0-9_]+$`).MatchString(dbName) {
|
||||
t.Fatalf("测试库名只允许字母、数字、下划线: %q", dbName)
|
||||
}
|
||||
lower := strings.ToLower(dbName)
|
||||
if !strings.Contains(lower, "test") && !strings.Contains(lower, "e2e") {
|
||||
t.Fatalf("拒绝重置非测试库 %q,库名需包含 test 或 e2e", dbName)
|
||||
}
|
||||
}
|
||||
|
||||
func applyMigrations(t *testing.T, db *sql.DB) {
|
||||
t.Helper()
|
||||
_, currentFile, _, ok := runtime.Caller(0)
|
||||
if !ok {
|
||||
t.Fatal("无法定位当前测试文件")
|
||||
}
|
||||
migrationDir := filepath.Join(filepath.Dir(currentFile), "..", "..", "migrations")
|
||||
entries, err := os.ReadDir(migrationDir)
|
||||
if err != nil {
|
||||
t.Fatalf("读取迁移目录失败: %v", err)
|
||||
}
|
||||
for _, entry := range entries {
|
||||
if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".sql") {
|
||||
continue
|
||||
}
|
||||
name := entry.Name()
|
||||
migrationPath := filepath.Join(migrationDir, name)
|
||||
raw, err := os.ReadFile(migrationPath)
|
||||
if err != nil {
|
||||
t.Fatalf("读取迁移 %s 失败: %v", name, err)
|
||||
}
|
||||
sqlText := gooseUpSQL(string(raw))
|
||||
if _, err := db.Exec(sqlText); err != nil {
|
||||
t.Fatalf("执行迁移 %s 失败: %v", name, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func gooseUpSQL(raw string) string {
|
||||
upIndex := strings.Index(raw, "-- +goose Up")
|
||||
if upIndex >= 0 {
|
||||
raw = raw[upIndex+len("-- +goose Up"):]
|
||||
}
|
||||
downIndex := strings.Index(raw, "-- +goose Down")
|
||||
if downIndex >= 0 {
|
||||
raw = raw[:downIndex]
|
||||
}
|
||||
return raw
|
||||
return database.NewTestDB()
|
||||
}
|
||||
|
||||
func seedUsers(t *testing.T, db *gorm.DB) (model.User, model.User, uint64) {
|
||||
|
||||
Reference in New Issue
Block a user