测试补充:验证域名审计失败事务回滚

增加 SQLite 审计触发器拒绝场景,覆盖域名新增、修改、删除失败时业务变更完整回滚。
This commit is contained in:
xuans 2026-09-29 16:59:22 +08:00
parent 82448c9ad1
commit e36794aed1

View File

@ -70,6 +70,44 @@ func TestProjectDomainRepositorySQLite(t *testing.T) {
if _, err := db.DB.ExecContext(context.Background(), Rebind(cfg.Driver, `UPDATE tasks SET status = 'success' WHERE id = ?`), "domain-active-task"); err != nil {
t.Fatal(err)
}
trigger := `CREATE TRIGGER reject_project_domain_audit BEFORE INSERT ON audit_logs BEGIN SELECT RAISE(ABORT, 'audit-failure'); END`
if _, err := db.DB.ExecContext(t.Context(), trigger); err != nil {
t.Fatal(err)
}
if err := writer.UpdateProjectDomain(t.Context(), "domain-manager", item); err == nil {
t.Fatal("审计失败时更新域名不应成功")
}
stored, err = NewSQLDomainRepository(db.DB).GetByID(t.Context(), item.ID)
if err != nil || stored.Name != "updated.example.test" {
t.Fatalf("审计失败后域名更新未回滚:%+v,%v", stored, err)
}
newItem, err := domain.NewDomain("audit-create.example.test", domain.CertificateSingle, nil)
if err != nil {
t.Fatal(err)
}
newItem.ID = "audit-create-domain"
newItem.ProjectID = "domain-project"
if err := writer.CreateProjectDomain(t.Context(), "domain-manager", newItem); err == nil {
t.Fatal("审计失败时创建域名不应成功")
}
if _, err := NewSQLDomainRepository(db.DB).GetByID(t.Context(), newItem.ID); !errors.Is(err, sql.ErrNoRows) {
t.Fatalf("审计失败后域名创建未回滚:%v", err)
}
if _, err := db.DB.ExecContext(t.Context(), `DROP TRIGGER reject_project_domain_audit`); err != nil {
t.Fatal(err)
}
if _, err := db.DB.ExecContext(t.Context(), trigger); err != nil {
t.Fatal(err)
}
if err := writer.DeleteProjectDomain(t.Context(), "domain-manager", item.ID); err == nil {
t.Fatal("审计失败时删除域名不应成功")
}
if _, err := NewSQLDomainRepository(db.DB).GetByID(t.Context(), item.ID); err != nil {
t.Fatalf("审计失败后域名删除未回滚:%v", err)
}
if _, err := db.DB.ExecContext(t.Context(), `DROP TRIGGER reject_project_domain_audit`); err != nil {
t.Fatal(err)
}
if err := writer.DeleteProjectDomain(t.Context(), "domain-manager", item.ID); err != nil {
t.Fatal(err)
}