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)?.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)?.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)?.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)?.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(), }); }); }); });