fiddy/apps/web/__tests__/test-helpers.ts
2026-02-11 23:45:15 -08:00

68 lines
2.8 KiB
TypeScript

import type { Pool, PoolClient } from "pg";
type CleanupArgs = {
groupId?: number | null;
userIds?: Array<number | null | undefined>;
emails?: Array<string | null | undefined>;
};
export function uniqueInviteCode(prefix = "T"): string {
const raw = `${prefix}${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
const cleaned = raw.toUpperCase().replace(/[^A-Z0-9]/g, "");
if (cleaned.length >= 8) return cleaned.slice(0, 8);
return cleaned.padEnd(8, "X");
}
export async function cleanupTestData(client: PoolClient, args: CleanupArgs) {
const groupId = args.groupId ?? null;
const userIds = (args.userIds || []).filter((id): id is number => Boolean(id));
const emails = (args.emails || []).filter((email): email is string => Boolean(email));
const safeQuery = async (text: string, params: Array<unknown>) => {
try {
await client.query(text, params);
} catch (error) {
if (typeof error === "object" && error && "code" in error && error.code === "42P01") return;
throw error;
}
};
if (groupId) {
await safeQuery(
"delete from entry_tags where entry_id in (select id from entries where group_id=$1)",
[groupId]
);
await safeQuery("delete from bucket_tags where bucket_id in (select id from buckets where group_id=$1)", [groupId]);
await safeQuery("delete from buckets where group_id=$1", [groupId]);
await safeQuery("delete from entries where group_id=$1", [groupId]);
await safeQuery("delete from tags where group_id=$1", [groupId]);
await safeQuery("delete from group_audit_log where group_id=$1", [groupId]);
await safeQuery("delete from group_invite_links where group_id=$1", [groupId]);
await safeQuery("delete from group_join_requests where group_id=$1", [groupId]);
await safeQuery("delete from group_settings where group_id=$1", [groupId]);
await safeQuery("delete from group_members where group_id=$1", [groupId]);
await safeQuery("delete from groups where id=$1", [groupId]);
}
for (const userId of userIds) {
await safeQuery("delete from user_settings where user_id=$1", [userId]);
await safeQuery("delete from sessions where user_id=$1", [userId]);
await safeQuery("delete from users where id=$1", [userId]);
}
for (const email of emails) {
await safeQuery("delete from sessions where user_id in (select id from users where email=$1)", [email]);
await safeQuery("delete from users where email=$1", [email]);
}
}
export async function cleanupTestDataFromPool(pool: Pool, args: CleanupArgs) {
const client = await pool.connect();
try {
await cleanupTestData(client, args);
} finally {
client.release();
}
}