1
0
Fork 0
polaris-task-force/tests/int/kill-tracking.int.spec.ts

141 lines
5.4 KiB
TypeScript

import { getPayload, Payload } from "payload";
import config from "@/payload.config";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import { classifyKillCategory, parseKillPayload, processPlayerKill } from "@/lib/arma-bridge/processSyncEvents";
let payload: Payload;
const RUN = `kill-${Date.now().toString(36)}`;
describe("Kill tracking", () => {
let userId: number;
let profileId: number;
beforeAll(async () => {
const payloadConfig = await config;
payload = await getPayload({ config: payloadConfig });
const user = await payload.create({
collection: "users",
data: {
username: `${RUN}-killer`,
discordUsername: `${RUN}-killer-discord`,
displayName: `${RUN} Killer`,
steamId: `${RUN}-steam-001`,
password: "Test1234",
},
overrideAccess: true,
depth: 0,
});
userId = user.id;
const profiles = await payload.find({
collection: "profiles",
where: { user: { equals: userId } },
limit: 1,
depth: 0,
overrideAccess: true,
});
profileId = profiles.docs[0].id;
});
afterAll(async () => {
if (profileId) {
await payload.delete({ collection: "profiles", id: profileId, overrideAccess: true }).catch(() => {});
}
if (userId) {
await payload.delete({ collection: "users", id: userId, overrideAccess: true }).catch(() => {});
}
});
describe("classifyKillCategory", () => {
it("classifies infantry kills", () => {
expect(classifyKillCategory("O_T_Soldier_AT_F")).toBe("infantryKills");
expect(classifyKillCategory("B_Soldier_GL_F")).toBe("infantryKills");
expect(classifyKillCategory(null)).toBe("infantryKills");
expect(classifyKillCategory("")).toBe("infantryKills");
});
it("classifies vehicle kills", () => {
expect(classifyKillCategory("B_T_LTV_01_recon_F")).toBe("vehicleKills");
expect(classifyKillCategory("O_T_MRAP_01_hmg_F")).toBe("vehicleKills");
});
it("classifies armor kills", () => {
expect(classifyKillCategory("B_T_MBT_01_cannon_F")).toBe("armorKills");
expect(classifyKillCategory("O_T_APC_Wheeled_02_rcws_F")).toBe("armorKills");
expect(classifyKillCategory("I_LT_01_AT_F")).toBe("armorKills");
});
it("classifies air kills", () => {
expect(classifyKillCategory("B_Heli_Light_01_armed_F")).toBe("airKills");
expect(classifyKillCategory("O_T_VTOL_02_infantry_dynamicLoadout_F")).toBe("airKills");
expect(classifyKillCategory("B_Plane_Fighter_01_stealth_F")).toBe("airKills");
});
});
describe("parseKillPayload", () => {
it("parses valid kill payload", () => {
const result = parseKillPayload([
"Qi Fu", "", "[Capt.] J. Fraley", "76561198091303179",
"[Capt.] J. Fraley", "76561198091303179", "O_T_Soldier_AT_F", "B_Officer_Parade_Veteran_F",
]);
expect(result).toEqual({
victimName: "Qi Fu",
killerName: "[Capt.] J. Fraley",
killerSteamId: "76561198091303179",
victimVehicle: "O_T_Soldier_AT_F",
killerVehicle: "B_Officer_Parade_Veteran_F",
});
});
it("returns null for invalid payload", () => {
expect(parseKillPayload(null)).toBeNull();
expect(parseKillPayload("string")).toBeNull();
expect(parseKillPayload([])).toBeNull();
expect(parseKillPayload([1, 2, 3])).toBeNull();
});
});
describe("processPlayerKill", () => {
it("increments infantryKills for soldier victim", async () => {
const before = await payload.findByID({ collection: "profiles", id: profileId, depth: 0, overrideAccess: true });
const beforeCount = (before.progression?.scoreboard as Record<string, number>)?.infantryKills ?? 0;
await processPlayerKill(payload, {
id: 999001,
payload: ["Qi Fu", "", `${RUN} Killer`, `${RUN}-steam-001`,
`${RUN} Killer`, `${RUN}-steam-001`, "O_T_Soldier_AT_F", "B_Officer_Parade_Veteran_F"],
occurredAt: new Date().toISOString(),
});
const after = await payload.findByID({ collection: "profiles", id: profileId, depth: 0, overrideAccess: true });
const afterCount = (after.progression?.scoreboard as Record<string, number>)?.infantryKills ?? 0;
expect(afterCount).toBe(beforeCount + 1);
});
it("increments armorKills for armored victim", async () => {
const before = await payload.findByID({ collection: "profiles", id: profileId, depth: 0, overrideAccess: true });
const beforeCount = (before.progression?.scoreboard as Record<string, number>)?.armorKills ?? 0;
await processPlayerKill(payload, {
id: 999002,
payload: ["Tank", "", `${RUN} Killer`, `${RUN}-steam-001`,
`${RUN} Killer`, `${RUN}-steam-001`, "B_T_MBT_01_cannon_F", "B_T_MBT_01_cannon_F"],
occurredAt: new Date().toISOString(),
});
const after = await payload.findByID({ collection: "profiles", id: profileId, depth: 0, overrideAccess: true });
const afterCount = (after.progression?.scoreboard as Record<string, number>)?.armorKills ?? 0;
expect(afterCount).toBe(beforeCount + 1);
});
it("ignores events for unknown Steam IDs", async () => {
await processPlayerKill(payload, {
id: 999003,
payload: ["Victim", "", "Unknown Player", "00000000000000000",
"Unknown Player", "00000000000000000", "O_T_Soldier_AT_F", "B_Soldier_F"],
occurredAt: new Date().toISOString(),
});
});
});
});