39 lines
1.4 KiB
TypeScript
39 lines
1.4 KiB
TypeScript
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);
|
|
});
|
|
});
|