CoompanionApp/server/domain.test.ts

90 lines
3.1 KiB
TypeScript
Raw Permalink Normal View History

2026-02-03 13:48:56 +01:00
import { expect, test } from "bun:test";
import {
approveTakeover,
bankerAdjust,
disconnectPlayer,
joinSession,
requestTakeover,
setBlackout,
startSession,
transfer,
} from "./domain";
import { createSession, removeSession } from "./store";
function setupSession() {
const { session, banker } = createSession("Avery");
return { session, banker };
}
test("createSession seeds banker with lobby status", () => {
const { session, banker } = setupSession();
expect(session.status).toBe("lobby");
expect(banker.role).toBe("banker");
expect(session.players.get(banker.id)).toBeDefined();
expect(session.code.length).toBe(5);
removeSession(session.id);
});
test("joinSession reuses player when id is provided", () => {
const { session, banker } = setupSession();
const player = joinSession(session, "Rosa");
const rejoin = joinSession(session, "Rosa II", player.id);
expect(rejoin.id).toBe(player.id);
expect(rejoin.name).toBe("Rosa II");
expect(session.players.size).toBe(2);
removeSession(session.id);
});
test("transfer moves balances between players", () => {
const { session, banker } = setupSession();
startSession(session, banker.id);
const player = joinSession(session, "Sam");
const other = joinSession(session, "Riley");
const before = player.balance;
transfer(session, player.id, other.id, 200, "Rent");
expect(player.balance).toBe(before - 200);
removeSession(session.id);
});
test("blackout blocks money movement", () => {
const { session, banker } = setupSession();
startSession(session, banker.id);
const player = joinSession(session, "Kai");
setBlackout(session, banker.id, true, "City outage");
const other = joinSession(session, "Pax");
expect(() => transfer(session, player.id, other.id, 50, "Loan")).toThrow();
removeSession(session.id);
});
test("blackout does not block banker actions", () => {
const { session, banker } = setupSession();
startSession(session, banker.id);
const player = joinSession(session, "Zuri");
setBlackout(session, banker.id, true, "City outage");
expect(() => bankerAdjust(session, banker.id, player.id, 75, "Override")).not.toThrow();
removeSession(session.id);
});
test("banker can adjust balances", () => {
const { session, banker } = setupSession();
startSession(session, banker.id);
const player = joinSession(session, "Luna");
bankerAdjust(session, banker.id, player.id, 120, "Bonus");
expect(player.balance).toBeGreaterThan(1500);
removeSession(session.id);
});
test("takeover approval assigns dummy to requester", () => {
const { session, banker } = setupSession();
startSession(session, banker.id);
const original = joinSession(session, "Ghost");
disconnectPlayer(session, original.id);
const requester = joinSession(session, "Jules");
requestTakeover(session, requester.id, original.id);
const assignedId = approveTakeover(session, banker.id, original.id, requester.id);
expect(assignedId).toBe(original.id);
expect(session.players.get(original.id)?.isDummy).toBe(false);
expect(session.players.get(requester.id)).toBeUndefined();
removeSession(session.id);
});