检查点:保留项目标识失败用例与隔离数据库夹具修正

This commit is contained in:
xuans 2026-09-28 20:58:27 +08:00
parent dcca17e371
commit fd767b23c3
2 changed files with 16 additions and 5 deletions

View File

@ -102,6 +102,9 @@ func TestProjectLifecycleAPIRejectsInvalidInput(t *testing.T) {
{http.MethodPost, "", `{"name":"` + strings.Repeat("a", 129) + `"}`},
{http.MethodPut, "/project-b", `{"name":"名称","owner_id":"forged"}`},
{http.MethodPut, "/project-b?ignored=1", `{"name":"名称"}`},
{http.MethodPut, "/UPPERCASE", `{"name":"名称"}`},
{http.MethodPut, "/" + strings.Repeat("a", 37), `{"name":"名称"}`},
{http.MethodDelete, "/UPPERCASE", `{"confirmation":"UPPERCASE"}`},
{http.MethodPut, "/project-b", strings.Repeat("x", 70*1024)},
{http.MethodDelete, "/project-b", `{}`},
{http.MethodDelete, "/project-b", `{"confirmation":"project-a"}`},

View File

@ -20,15 +20,15 @@ func TestProjectLifecycleSQLite(t *testing.T) {
cfg := config.Default(t.TempDir()).Database
cfg.DSN = filepath.Join(t.TempDir(), "project-lifecycle.db")
return cfg
})
}, nil)
}
func TestProjectLifecycleMySQLReal(t *testing.T) {
server := mysqltest.New(t)
checkProjectLifecycle(t, server.Database)
checkProjectLifecycle(t, server.Database, server.Admin())
}
func checkProjectLifecycle(t *testing.T, makeConfig func(*testing.T) config.DatabaseConfig) {
func checkProjectLifecycle(t *testing.T, makeConfig func(*testing.T) config.DatabaseConfig, admin *sql.DB) {
t.Helper()
run := func(name string, check func(*testing.T, *sql.DB, *SQLProjectMemberRepository, string)) {
t.Run(name, func(t *testing.T) {
@ -191,11 +191,19 @@ func checkProjectLifecycle(t *testing.T, makeConfig func(*testing.T) config.Data
if err != nil {
t.Fatal(err)
}
executor := db
trigger := `CREATE TRIGGER fail_project_audit BEFORE INSERT ON audit_logs BEGIN SELECT RAISE(ABORT, 'audit-failure'); END`
if driver == "mysql" {
trigger = `CREATE TRIGGER fail_project_audit BEFORE INSERT ON audit_logs FOR EACH ROW SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='audit-failure'`
// 故障注入由隔离实例管理员执行,不提高业务权限或放宽二进制日志策略。
var schema string
if err := db.QueryRowContext(t.Context(), "SELECT DATABASE()").Scan(&schema); err != nil {
t.Fatal(err)
}
schema = "`" + strings.ReplaceAll(schema, "`", "``") + "`"
executor = admin
trigger = `CREATE TRIGGER ` + schema + `.fail_project_audit BEFORE INSERT ON ` + schema + `.audit_logs FOR EACH ROW SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='audit-failure'`
}
if _, err := db.ExecContext(t.Context(), trigger); err != nil {
if _, err := executor.ExecContext(t.Context(), trigger); err != nil {
t.Fatal(err)
}
switch action {