// services/api/test/reset.ts // e2e 共用隔离工具:每个 e2e spec 的 beforeAll 调用 resetDb(),防止 spec 间 // 唯一约束冲突与脏数据。 // 实现:SET FOREIGN_KEY_CHECKS=0 包裹逐表 TRUNCATE(users 被 sessions/audit_logs // 引用,即便子表已清空,存在 FK 约束本身即令 TRUNCATE 失败,必须关检查); // 表序仍按 FK 安全顺序排列(子表在前),关检查失败时也不至于中途卡死。 // 顺序 await 在 Prisma 连接池上复用同一空闲连接,会话级 FOREIGN_KEY_CHECKS // 对后续 TRUNCATE 生效;finally 恢复检查并断开,失败也不泄漏连接。 // TODO(Task 11): 增加 MinIO `photo-live/dev` 前缀对象清理(同一函数内追加)。 import { PrismaClient } from '@photo/db-cn'; export const RESET_TABLES: readonly string[] = [ 'audit_logs', 'sessions', 'users', ]; export async function resetDb(): Promise { const prisma = new PrismaClient(); try { await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 0'); for (const table of RESET_TABLES) { await prisma.$executeRawUnsafe(`TRUNCATE TABLE ${table}`); } } finally { await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 1'); await prisma.$disconnect(); } }