generated from nhcarrigan/template
balance: add crafting daily challenge type to unblock progression-stuck players (closes #167)
This commit is contained in:
@@ -144,6 +144,34 @@ describe("craft route", () => {
|
||||
expect(body.bonusType).toBe("gold_income");
|
||||
});
|
||||
|
||||
it("updates crafting challenge progress and awards crystals when dailyChallenges is defined", async () => {
|
||||
const state = makeState({
|
||||
dailyChallenges: {
|
||||
date: "2024-01-15",
|
||||
challenges: [
|
||||
{
|
||||
completed: false,
|
||||
id: "2024-01-15_crafting",
|
||||
label: "Craft 1 recipe",
|
||||
progress: 0,
|
||||
rewardCrystals: 75,
|
||||
target: 1,
|
||||
type: "crafting",
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
vi.mocked(prisma.gameState.findUnique).mockResolvedValueOnce({ state } as never);
|
||||
vi.mocked(prisma.gameState.update).mockResolvedValueOnce({} as never);
|
||||
const res = await post({ recipeId: TEST_RECIPE_ID });
|
||||
expect(res.status).toBe(200);
|
||||
const updateArg = vi.mocked(prisma.gameState.update).mock.calls[0]![0] as {
|
||||
data: { state: GameState };
|
||||
};
|
||||
expect(updateArg.data.state.dailyChallenges?.challenges[0]?.completed).toBe(true);
|
||||
expect(updateArg.data.state.resources.crystals).toBe(75);
|
||||
});
|
||||
|
||||
it("returns 500 when the database throws", async () => {
|
||||
vi.mocked(prisma.gameState.findUnique).mockRejectedValueOnce(new Error("DB error"));
|
||||
const res = await post({ recipeId: TEST_RECIPE_ID });
|
||||
|
||||
@@ -55,15 +55,28 @@ describe("generateDailyChallenges", () => {
|
||||
expect(day2.some((c) => c.type === "clicks")).toBe(true);
|
||||
});
|
||||
|
||||
it("generates different challenges for different dates", async () => {
|
||||
it("always includes a crafting challenge regardless of date", async () => {
|
||||
vi.setSystemTime(LA_MIDNIGHT_2024_01_15);
|
||||
const { generateDailyChallenges } = await import("../../src/services/dailyChallenges.js");
|
||||
const day1 = generateDailyChallenges("2024-01-15");
|
||||
const day2 = generateDailyChallenges("2024-01-16");
|
||||
// The 2 non-clicks types should vary by seed between dates
|
||||
const day1NonClicks = day1.filter((c) => c.type !== "clicks").map((c) => c.type);
|
||||
const day2NonClicks = day2.filter((c) => c.type !== "clicks").map((c) => c.type);
|
||||
expect(day1NonClicks).not.toEqual(day2NonClicks);
|
||||
expect(day1.some((c) => c.type === "crafting")).toBe(true);
|
||||
expect(day2.some((c) => c.type === "crafting")).toBe(true);
|
||||
});
|
||||
|
||||
it("progression challenge slot varies across different dates", async () => {
|
||||
vi.setSystemTime(LA_MIDNIGHT_2024_01_15);
|
||||
const { generateDailyChallenges } = await import("../../src/services/dailyChallenges.js");
|
||||
// 2024-01-01 picks bossesDefeated, 2024-01-02 picks prestige (verified by seed)
|
||||
const day1 = generateDailyChallenges("2024-01-01");
|
||||
const day2 = generateDailyChallenges("2024-01-02");
|
||||
const day1ProgressionType = day1.find((c) => {
|
||||
return c.type !== "clicks" && c.type !== "crafting";
|
||||
})?.type;
|
||||
const day2ProgressionType = day2.find((c) => {
|
||||
return c.type !== "clicks" && c.type !== "crafting";
|
||||
})?.type;
|
||||
expect(day1ProgressionType).not.toBe(day2ProgressionType);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user