deadhead-space-freight-tycoon/apps/web/e2e/12-5-discovery.e2e.ts

52 lines
2.0 KiB
TypeScript

import { expect, test } from "@playwright/test";
import {
addCredits,
advanceTo,
board,
dismissLogbook,
logbook,
nextMarsWindow,
playToDeal,
serverNow,
state,
tryDispatch,
} from "./support";
test.describe("end to end (Phase 12)", () => {
test("12.5: a first contact to Mars discovers it, opens its board and lets you lease there", async ({
page,
}) => {
const owner = await playToDeal(page);
const clipper = owner.ships.find((s) => s.modelId === "clipper")!;
const veteran = owner.pilots.find((p) => p.isVeteran)!;
// A date when the Clipper can reach Mars, Long Haul for the trip, and fuel money.
await advanceTo(page, nextMarsWindow(await serverNow(page)));
await page.goto("/pilots");
const raise = page.getByRole("button", { name: `Raise Long Haul for ${veteran.name}` });
while ((await state(page)).pilots.find((p) => p.id === veteran.id)!.skillPointsAvailable > 0) {
await raise.click();
}
await addCredits(page, 100_000);
// The board offers a first contact the Clipper can fly (decision 0.5.85).
const offer = (await board(page, "earth")).contracts.find(
(c) => c.firstContact && c.destinationId === "mars",
);
expect(offer, "a first contact to Mars on the Earth board").toBeDefined();
const flight = await tryDispatch(page, offer!.id, clipper.id, veteran.id);
expect(flight, "the Clipper and veteran can take it").not.toBeNull();
await advanceTo(page, flight!.arrivalAt);
await page.goto("/");
await expect(logbook(page)).toContainText("Discovered Mars!");
await dismissLogbook(page);
// Mars is discovered on the Locations screen and can be leased; its board is open without a bay (CR-002).
await page.goto("/locations");
await expect(page.getByRole("button", { name: "Lease bay at Mars" })).toBeEnabled();
const marsBoard = await page.request.get("/api/locations/mars/board");
expect(marsBoard.ok()).toBe(true);
expect((await state(page)).bays.map((b) => b.locationId)).toEqual(["earth"]);
});
});