import { companyResponseSchema } from "@deadhead/schema"; import { describe, expect, it } from "vitest"; import { buildApp } from "../src/app"; import { createRecordingQueue } from "../src/jobs/queue"; import { useTestDatabase } from "./db"; import { call, getState, insertDispatch, signUp, signUpOwner, testContract, useTestApp, } from "./game"; import { testConfig } from "./helpers"; const database = useTestDatabase(); const testApp = useTestApp(database); describe("developer tools (Step 10K.11)", () => { it("advances the server clock", async () => { const guest = await signUp(testApp().app); const before = (await call(testApp().app, guest, "GET", "/api/time")).json().realTime as number; const response = await call(testApp().app, guest, "POST", "/api/test/advance-clock", { advanceMs: 600_000, }); expect(response.statusCode).toBe(200); const after = (await call(testApp().app, guest, "GET", "/api/time")).json().realTime as number; expect(after - before).toBeGreaterThanOrEqual(600_000); }); it("adds credits", async () => { const guest = await signUp(testApp().app); const start = (await getState(testApp().app, guest)).company.credits; const response = await call(testApp().app, guest, "POST", "/api/test/add-credits", { amount: 10_000, }); expect(companyResponseSchema.parse(response.json()).company.credits).toBe(start + 10_000); }); it("lands every flight when advanced to the last arrival", async () => { const { app, clock } = testApp(); const owner = await signUpOwner(app, database().db); const flight = await insertDispatch(database().db, { playerId: owner.playerId, shipId: owner.shipId, pilotId: owner.avatarId, departAt: clock.now, contract: testContract(), }); expect((await getState(app, owner)).activeDispatches).toHaveLength(1); await call(app, owner, "POST", "/api/test/advance-clock", { advanceMs: flight.arrivalAt - clock.now + 1000, }); expect((await getState(app, owner)).activeDispatches).toHaveLength(0); }); it("does not exist in production", async () => { const app = buildApp(testConfig({ NODE_ENV: "production" }), { database: database(), jobs: createRecordingQueue(), }); for (const [url, payload] of [ ["/api/test/clock-offset", { offsetMs: 1 }], ["/api/test/advance-clock", { advanceMs: 1000 }], ["/api/test/add-credits", { amount: 10_000 }], ] as const) { const response = await app.inject({ method: "POST", url, payload }); expect(response.statusCode, url).toBe(404); } await app.close(); }); });