sendou.ink/app/features/top-search/XRankPlacementRepository.server.test.ts
Kalle 400f5ce301
Denormalize peak XP to SplatoonPlayer table (#2741)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 22:15:20 +02:00

94 lines
2.2 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, test } from "vitest";
import { db } from "~/db/sql";
import { dbReset } from "~/utils/Test";
import * as XRankPlacementRepository from "./XRankPlacementRepository.server";
let placementCounter = 0;
const createSplatoonPlayer = async (splId: string) => {
const result = await db
.insertInto("SplatoonPlayer")
.values({ splId })
.returning("id")
.executeTakeFirstOrThrow();
return result.id;
};
const createXRankPlacement = async ({
playerId,
power,
}: {
playerId: number;
power: number;
}) => {
placementCounter++;
await db
.insertInto("XRankPlacement")
.values({
playerId,
power,
badges: "[]",
bannerSplId: 1,
mode: "SZ",
month: 1,
year: 2024,
name: "Test Player",
nameDiscriminator: "0000",
rank: placementCounter,
region: "WEST",
title: "Test",
weaponSplId: 0,
})
.execute();
};
describe("refreshAllPeakXp", () => {
beforeEach(() => {
placementCounter = 0;
dbReset();
});
afterEach(() => {
dbReset();
});
test("sets peakXp to max power for each player", async () => {
const player1Id = await createSplatoonPlayer("player1");
const player2Id = await createSplatoonPlayer("player2");
await createXRankPlacement({ playerId: player1Id, power: 2500 });
await createXRankPlacement({ playerId: player1Id, power: 2700 });
await createXRankPlacement({ playerId: player1Id, power: 2600 });
await createXRankPlacement({ playerId: player2Id, power: 3000 });
await createXRankPlacement({ playerId: player2Id, power: 2800 });
await XRankPlacementRepository.refreshAllPeakXp();
const players = await db
.selectFrom("SplatoonPlayer")
.select(["id", "peakXp"])
.orderBy("id", "asc")
.execute();
expect(players[0].peakXp).toBe(2700);
expect(players[1].peakXp).toBe(3000);
});
test("sets peakXp to null for player with no placements", async () => {
const playerId = await createSplatoonPlayer("player1");
await XRankPlacementRepository.refreshAllPeakXp();
const player = await db
.selectFrom("SplatoonPlayer")
.select("peakXp")
.where("id", "=", playerId)
.executeTakeFirstOrThrow();
expect(player.peakXp).toBeNull();
});
});