import { describe, expect, it } from "vitest"; import { commissionPrice, commissionRequestSchema } from "./request"; const request = { teams: [{ members: ["a", "b", "c", "d"].map((characterKey) => ({ characterKey, weaponKey: `weapon-${characterKey}`, artifactKey: "artifact", })) }], weapons: [{ characterKey: "a", weaponKeys: ["weapon-a", "weapon-b", "weapon-c"] }], constellations: [{ characterKey: "a", levels: [0, 2] }], }; describe("commission request pricing and shape", () => { it("accepts one complete team without either comparison type", () => { const teamOnly = { teams: request.teams, weapons: [], constellations: [] }; const parsed = commissionRequestSchema.safeParse(teamOnly); expect(parsed.success).toBe(true); if (parsed.success) { expect(commissionPrice(parsed.data)).toBe(100); expect(parsed.data.teams[0].members[0]).toMatchObject({ constellation: "0", refinement: "1" }); } }); it("keeps selected team constellation and refinement ranges", () => { const selected = { ...request, teams: [{ members: request.teams[0].members.map((member, index) => index === 0 ? { ...member, constellation: "0-6", refinement: "1-5" } : member) }] }; expect(commissionRequestSchema.parse(selected).teams[0].members[0]).toMatchObject({ constellation: "0-6", refinement: "1-5", }); expect(commissionRequestSchema.safeParse({ ...selected, teams: [{ members: selected.teams[0].members.map((member, index) => index === 0 ? { ...member, refinement: "6" } : member) }] }).success).toBe(false); }); it("keeps each compared weapon's refinement and defaults older requests to R1", () => { const selected = { ...request, weapons: [{ characterKey: "a", weaponKeys: ["weapon-a", "weapon-b"], refinements: { "weapon-a": "5", "weapon-b": "2" } }] }; expect(commissionRequestSchema.parse(selected).weapons[0].refinements).toEqual({ "weapon-a": "5", "weapon-b": "2", }); expect(commissionPrice(commissionRequestSchema.parse(selected))).toBe(180); expect(commissionRequestSchema.parse(request).weapons[0].refinements).toBeUndefined(); expect(commissionRequestSchema.safeParse({ ...selected, weapons: [{ ...selected.weapons[0], refinements: { "weapon-a": "6" } }] }).success).toBe(false); expect(commissionRequestSchema.safeParse({ ...selected, weapons: [{ ...selected.weapons[0], refinements: { "weapon-c": "3" } }] }).success).toBe(false); }); it("prices independent request types together", () => { expect(commissionPrice(commissionRequestSchema.parse(request))).toBe(200); expect(commissionPrice(commissionRequestSchema.parse({ teams: [], weapons: [], constellations: [{ characterKey: "a", levels: [0, 1] }] }))).toBe(140); expect(commissionPrice(commissionRequestSchema.parse({ teams: [], weapons: [], constellations: [{ characterKey: "a", levels: [0] }] }))).toBe(120); expect(commissionPrice(commissionRequestSchema.parse({ teams: [], weapons: [ { characterKey: "a", weaponKeys: ["weapon-a", "weapon-b"] }, ], constellations: [] }))).toBe(140); expect(commissionPrice({ teams: [], weapons: [{ characterKey: "a", weaponKeys: ["weapon-a", "", ""] }], constellations: [] })).toBe(120); expect(commissionPrice(commissionRequestSchema.parse({ teams: request.teams.concat(request.teams), weapons: [], constellations: [] }))).toBe(200); expect(commissionPrice({ teams: [], weapons: [], constellations: [] })).toBe(0); }); it("requires four distinct team characters and valid comparison choices", () => { expect(commissionRequestSchema.safeParse({ ...request, teams: [{ members: [ ...request.teams[0].members.slice(0, 3), request.teams[0].members[0], ] }] }).success).toBe(false); expect(commissionRequestSchema.safeParse({ ...request, weapons: [{ characterKey: "a", weaponKeys: ["weapon-a"] }] }).success).toBe(false); expect(commissionRequestSchema.safeParse({ ...request, constellations: [{ characterKey: "a", levels: [0, 0] }] }).success).toBe(false); expect(commissionRequestSchema.safeParse({ ...request, constellations: [{ characterKey: "a", levels: [] }] }).success).toBe(false); }); });