每个包不再重复 DROP+迁移,清空改用 DELETE 并重置自增,go test ./... 从约 6 分钟降到十几秒。租号全链路改走 NewTestDB,去掉依赖额外 DSN 才会跑的过渡测试。 Co-authored-by: Cursor <cursoragent@cursor.com>
102 lines
2.6 KiB
Go
102 lines
2.6 KiB
Go
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)
|
|
}
|
|
}
|