test: 测试库改为模板克隆并纳入完整租号 e2e
每个包不再重复 DROP+迁移,清空改用 DELETE 并重置自增,go test ./... 从约 6 分钟降到十几秒。租号全链路改走 NewTestDB,去掉依赖额外 DSN 才会跑的过渡测试。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestAssertTestDatabaseName(t *testing.T) {
|
||||
t.Parallel()
|
||||
cases := []struct {
|
||||
name string
|
||||
wantErr string
|
||||
}{
|
||||
{name: "hfb_sys_test", wantErr: ""},
|
||||
{name: "hfb_sys_test_order", wantErr: ""},
|
||||
{name: "hfb_e2e_flow", wantErr: ""},
|
||||
{name: "", wantErr: "必须包含数据库名"},
|
||||
{name: "hfb-sys-test", wantErr: "只允许字母、数字、下划线"},
|
||||
{name: "hfb_sys", wantErr: "需包含 test 或 e2e"},
|
||||
{name: strings.Repeat("test_", 20), wantErr: "超过 MySQL 上限"},
|
||||
}
|
||||
for _, item := range cases {
|
||||
err := assertTestDatabaseName(item.name)
|
||||
if item.wantErr == "" {
|
||||
if err != nil {
|
||||
t.Fatalf("%q: unexpected error %v", item.name, err)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if err == nil || !strings.Contains(err.Error(), item.wantErr) {
|
||||
t.Fatalf("%q: error = %v, want containing %q", item.name, err, item.wantErr)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestGooseUpSQL(t *testing.T) {
|
||||
t.Parallel()
|
||||
raw := "-- +goose Up\nCREATE TABLE t (id INT);\n-- +goose Down\nDROP TABLE t;\n"
|
||||
got := strings.TrimSpace(gooseUpSQL(raw))
|
||||
if got != "CREATE TABLE t (id INT);" {
|
||||
t.Fatalf("gooseUpSQL = %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewDryRunDB(t *testing.T) {
|
||||
t.Parallel()
|
||||
if NewDryRunDB() == nil {
|
||||
t.Fatal("NewDryRunDB returned nil")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewTestDBTruncatesBetweenCalls(t *testing.T) {
|
||||
db := NewTestDB()
|
||||
if err := db.Exec("INSERT INTO users (phone) VALUES ('13900001111')").Error; err != nil {
|
||||
t.Fatalf("insert user: %v", err)
|
||||
}
|
||||
var n int64
|
||||
if err := db.Raw("SELECT COUNT(*) FROM users").Scan(&n).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if n != 1 {
|
||||
t.Fatalf("users count = %d, want 1", n)
|
||||
}
|
||||
|
||||
db = NewTestDB()
|
||||
if err := db.Raw("SELECT COUNT(*) FROM users").Scan(&n).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if n != 0 {
|
||||
t.Fatalf("users count after reset = %d, want 0", n)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewTestDBKeepsSchemaFingerprint(t *testing.T) {
|
||||
db := NewTestDB()
|
||||
var fingerprint string
|
||||
if err := db.Raw("SELECT v FROM " + schemaMetaTable + " WHERE k = 'fingerprint'").Scan(&fingerprint).Error; err != nil {
|
||||
t.Fatalf("read fingerprint: %v", err)
|
||||
}
|
||||
if fingerprint == "" {
|
||||
t.Fatal("expected schema fingerprint to survive truncate")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewTestDBResetsAutoIncrement(t *testing.T) {
|
||||
db := NewTestDB()
|
||||
if err := db.Exec("INSERT INTO users (phone) VALUES ('13900002222')").Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
db = NewTestDB()
|
||||
if err := db.Exec("INSERT INTO users (phone) VALUES ('13900003333')").Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var id uint64
|
||||
if err := db.Raw("SELECT id FROM users WHERE phone = '13900003333'").Scan(&id).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if id != 1 {
|
||||
t.Fatalf("id after reset = %d, want 1", id)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user