feat: 迁移 Admin Repository 到 MySQL 8 (#79)
This commit is contained in:
@@ -1,22 +1,63 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"database/sql"
|
||||
"encoding/hex"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"cmautobuy/admin/config"
|
||||
"cmautobuy/admin/model"
|
||||
)
|
||||
|
||||
func newSybTestDB(t *testing.T) *sql.DB {
|
||||
t.Helper()
|
||||
db, err := Open(t.TempDir())
|
||||
if os.Getenv("CMAUTOBUY_MYSQL_TEST") != "1" {
|
||||
t.Skip("未启用真实 MySQL 8 集成测试")
|
||||
}
|
||||
cfg, err := config.LoadDatabaseFromEnv()
|
||||
if err != nil {
|
||||
t.Fatalf("打开测试库失败: %v", err)
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(func() { db.Close() })
|
||||
if err := Migrate(db); err != nil {
|
||||
t.Fatalf("迁移失败: %v", err)
|
||||
if !strings.HasSuffix(cfg.Name, "_test") {
|
||||
t.Fatalf("MySQL 测试基础库名必须以 _test 结尾")
|
||||
}
|
||||
adminDB, err := OpenMySQL(cfg)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
random := make([]byte, 8)
|
||||
if _, err := rand.Read(random); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
databaseName := cfg.Name + "_" + hex.EncodeToString(random)
|
||||
quotedName := "`" + strings.ReplaceAll(databaseName, "`", "``") + "`"
|
||||
if _, err := adminDB.Exec("CREATE DATABASE " + quotedName + " CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci"); err != nil {
|
||||
adminDB.Close()
|
||||
t.Fatal(err)
|
||||
}
|
||||
cfg.Name = databaseName
|
||||
db, err := OpenMySQL(cfg)
|
||||
if err != nil {
|
||||
adminDB.Exec("DROP DATABASE " + quotedName)
|
||||
adminDB.Close()
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := MigrateMySQL(db); err != nil {
|
||||
db.Close()
|
||||
adminDB.Exec("DROP DATABASE " + quotedName)
|
||||
adminDB.Close()
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(func() {
|
||||
db.Close()
|
||||
if _, err := adminDB.Exec("DROP DATABASE " + quotedName); err != nil {
|
||||
t.Errorf("清理隔离 MySQL 测试库失败: %v", err)
|
||||
}
|
||||
adminDB.Close()
|
||||
})
|
||||
return db
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user