71 lines
4.1 KiB
TypeScript
71 lines
4.1 KiB
TypeScript
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);
|
|
});
|
|
});
|