import { eq } from "drizzle-orm"; import { describe, expect, it } from "vitest"; import { db } from "../../db"; import { partyMember } from "../../db/schema"; import { getPartyForUser, leaveParty } from "../../party-data"; import { createParty, createUser, joinParty } from "../../test/factories"; describe("party data lifecycle", () => { it("moves a leaving user to a fresh party and clears stale memberships", async () => { const user = await createUser("Leave Tester"); const otherA = await createUser("Other A"); const otherB = await createUser("Other B"); const firstParty = await createParty(otherA.id); const secondParty = await createParty(otherB.id); await joinParty(firstParty.partyId, user.id); await joinParty(secondParty.partyId, user.id); const result = await leaveParty(db, user.id, { createReplacementParty: true, }); expect(result?.affectedPartyIds).toEqual( expect.arrayContaining([firstParty.partyId, secondParty.partyId]), ); expect(result?.replacementPartyId).toBeTruthy(); const memberships = await db .select({ id: partyMember.id, partyId: partyMember.partyId }) .from(partyMember) .where(eq(partyMember.userId, user.id)); expect(memberships).toHaveLength(1); expect(memberships[0]?.partyId).toBe(result?.replacementPartyId); const currentParty = await getPartyForUser(user.id); expect(currentParty?.id).toBe(result?.replacementPartyId); }); });