Renders/maps
Map list generator page Act
Open the map list generator page
await mapListPage.goto();
Clear map pool
await mapListPage.clearMapPool();
Assert
create map list button is disabled
await expect(mapListPage.locators.createMapListButton).toBeDisabled();
Act
Toggle mode “Museum d'Alfonsino”, “Splat Zones”
await mapListPage.toggleMode("Museum d'Alfonsino", "Splat Zones");Toggle mode “Hagglefish Market”, “Splat Zones”
await mapListPage.toggleMode("Hagglefish Market", "Splat Zones");Toggle mode “Manta Maria”, “Tower Control”
await mapListPage.toggleMode("Manta Maria", "Tower Control");
Assert
stage checkbox “Manta Maria” is checked
await expect(mapListPage.stageCheckbox("Manta Maria")).toBeChecked();
Act
Reload with persisted pool
await mapListPage.reloadWithPersistedPool();
Assert
the picker opens on the first mode that has stages
stage checkbox “Museum d'Alfonsino” is checked
await expect(mapListPage.stageCheckbox("Museum d'Alfonsino")).toBeChecked();
Act
Create map list
await mapListPage.createMapList();
Arrange
items = generated map list items
const items = mapListPage.locators.generatedMapListItems;
Assert
items count is GENERATED_MAP_LIST_LENGTH
await expect(items).toHaveCount(GENERATED_MAP_LIST_LENGTH);
items reads Array.from( { length: GENERATED_MAP_LIST_LENGTH }, () => /^(SZ (Museum d'Alfo…
await expect(items).toHaveText(
Array.from(
{ length: GENERATED_MAP_LIST_LENGTH },
() => /^(SZ (Museum d'Alfonsino|Hagglefish Market)|TC Manta Maria)$/,
),
);items.filter({ hasText: "Manta Maria" }).first() is visible
await expect(
items.filter({ hasText: "Manta Maria" }).first(),
).toBeVisible();
Source
test("generates a map list from a custom map pool", async ({ page }) => {
const mapListPage = new MapListGeneratorPage(page);
await mapListPage.goto();
await mapListPage.clearMapPool();
await expect(mapListPage.locators.createMapListButton).toBeDisabled();
await mapListPage.toggleMode("Museum d'Alfonsino", "Splat Zones");
await mapListPage.toggleMode("Hagglefish Market", "Splat Zones");
await mapListPage.toggleMode("Manta Maria", "Tower Control");
await expect(mapListPage.stageCheckbox("Manta Maria")).toBeChecked();
await mapListPage.reloadWithPersistedPool();
// the picker opens on the first mode that has stages
await expect(mapListPage.stageCheckbox("Museum d'Alfonsino")).toBeChecked();
await mapListPage.createMapList();
const items = mapListPage.locators.generatedMapListItems;
await expect(items).toHaveCount(GENERATED_MAP_LIST_LENGTH);
await expect(items).toHaveText(
Array.from(
{ length: GENERATED_MAP_LIST_LENGTH },
() => /^(SZ (Museum d'Alfonsino|Hagglefish Market)|TC Manta Maria)$/,
),
);
await expect(
items.filter({ hasText: "Manta Maria" }).first(),
).toBeVisible();
})
Renders/plans
Map planner page Act
Open the map planner page
await planner.goto();
Assert
no error page
await expectNoErrorPage(page);
image shapes count is 0
await expect(planner.locators.imageShapes).toHaveCount(0);
Act
Set background “Museum d'Alfonsino”
await planner.setBackground("Museum d'Alfonsino");
Assert
image shapes count is 1
await expect(planner.locators.imageShapes).toHaveCount(1);
Act
Open weapon category “Shooters”
await planner.openWeaponCategory("Shooters");Drag weapon to canvas “Splattershot”
await planner.dragWeaponToCanvas("Splattershot");
Assert
image shapes count is 2
await expect(planner.locators.imageShapes).toHaveCount(2);
Source
test("sets a stage background and adds a weapon to the canvas", async ({
page,
}) => {
const planner = new MapPlannerPage(page);
await planner.goto();
await expectNoErrorPage(page);
await expect(planner.locators.imageShapes).toHaveCount(0);
await planner.setBackground("Museum d'Alfonsino");
await expect(planner.locators.imageShapes).toHaveCount(1);
await planner.openWeaponCategory("Shooters");
await planner.dragWeaponToCanvas("Splattershot");
await expect(planner.locators.imageShapes).toHaveCount(2);
})Renders/plans
Map planner page Act
Open the map planner page
await planner.goto();
Set background “Museum d'Alfonsino”
await planner.setBackground("Museum d'Alfonsino");
Assert
the page URL is /stage=/
await expect(page).toHaveURL(/stage=/);
Act
Open weapon category “Shooters”
await planner.openWeaponCategory("Shooters");Drag weapon to canvas “Splattershot”
await planner.dragWeaponToCanvas("Splattershot");
Assert
image shapes count is 2
await expect(planner.locators.imageShapes).toHaveCount(2);
Act
Reload with persisted plan 2
await planner.reloadWithPersistedPlan(2);
Assert
image shapes count is 2
await expect(planner.locators.imageShapes).toHaveCount(2);
stage select has value String(stagesObj.MUSEUM_D_ALFONSINO)
await expect(planner.locators.stageSelect).toHaveValue(
String(stagesObj.MUSEUM_D_ALFONSINO),
);
Source
test("restores the plan and the selected stage after a reload", async ({
page,
}) => {
const planner = new MapPlannerPage(page);
await planner.goto();
await planner.setBackground("Museum d'Alfonsino");
await expect(page).toHaveURL(/stage=/);
await planner.openWeaponCategory("Shooters");
await planner.dragWeaponToCanvas("Splattershot");
await expect(planner.locators.imageShapes).toHaveCount(2);
await planner.reloadWithPersistedPlan(2);
await expect(planner.locators.imageShapes).toHaveCount(2);
await expect(planner.locators.stageSelect).toHaveValue(
String(stagesObj.MUSEUM_D_ALFONSINO),
);
})Renders/plans
Map planner page Act
Open the map planner page
await planner.goto();
Set background “Museum d'Alfonsino”
await planner.setBackground("Museum d'Alfonsino");Open weapon category “Shooters”
await planner.openWeaponCategory("Shooters");Drag weapon to canvas “Splattershot”
await planner.dragWeaponToCanvas("Splattershot");
Assert
image shapes count is 2
await expect(planner.locators.imageShapes).toHaveCount(2);
Act
Download plan file → download
const download = await planner.downloadPlanFile();
Assert
download.suggestedFilename() is “plan.tldr”
expect(download.suggestedFilename()).toBe("plan.tldr");
Act
Drag weapon to canvas “Splattershot”
await planner.dragWeaponToCanvas("Splattershot");
Assert
image shapes count is 3
await expect(planner.locators.imageShapes).toHaveCount(3);
Act
Open plan file download.path()
await planner.openPlanFile(await download.path());
Assert
image shapes count is 2
await expect(planner.locators.imageShapes).toHaveCount(2);
open file error toast count is 0
await expect(planner.locators.openFileErrorToast).toHaveCount(0);
Source
test("restores a downloaded plan file when it is opened", async ({
page,
}) => {
const planner = new MapPlannerPage(page);
await planner.goto();
await planner.setBackground("Museum d'Alfonsino");
await planner.openWeaponCategory("Shooters");
await planner.dragWeaponToCanvas("Splattershot");
await expect(planner.locators.imageShapes).toHaveCount(2);
const download = await planner.downloadPlanFile();
expect(download.suggestedFilename()).toBe("plan.tldr");
await planner.dragWeaponToCanvas("Splattershot");
await expect(planner.locators.imageShapes).toHaveCount(3);
await planner.openPlanFile(await download.path());
await expect(planner.locators.imageShapes).toHaveCount(2);
await expect(planner.locators.openFileErrorToast).toHaveCount(0);
})Renders/plans
Map planner page Act
Open the map planner page
await planner.goto();
Set background “Museum d'Alfonsino”
await planner.setBackground("Museum d'Alfonsino");
Assert
image shapes count is 1
await expect(planner.locators.imageShapes).toHaveCount(1);
Act
Open plan file name “plan.tldr” mime type “application/json” buffer Buffer.from("not a plan")
await planner.openPlanFile({
name: "plan.tldr",
mimeType: "application/json",
buffer: Buffer.from("not a plan"),
});
Assert
toasts render hidden in e2e runs
open file error toast is in the page
await expect(planner.locators.openFileErrorToast).toBeAttached();
image shapes count is 1
await expect(planner.locators.imageShapes).toHaveCount(1);
Source
test("shows an error when the opened plan file is invalid", async ({
page,
}) => {
const planner = new MapPlannerPage(page);
await planner.goto();
await planner.setBackground("Museum d'Alfonsino");
await expect(planner.locators.imageShapes).toHaveCount(1);
await planner.openPlanFile({
name: "plan.tldr",
mimeType: "application/json",
buffer: Buffer.from("not a plan"),
});
// toasts render hidden in e2e runs
await expect(planner.locators.openFileErrorToast).toBeAttached();
await expect(planner.locators.imageShapes).toHaveCount(1);
})MapListGeneratorPage.gotoe2e/pages/maps/map-list-generator-page.ts:22
No JSDoc
async goto() {
await navigate({ page: this.page, url: MAPS_URL });
}MapListGeneratorPage.clearMapPoole2e/pages/maps/map-list-generator-page.ts:45
No JSDoc
async clearMapPool() {
await this.locators.clearButton.click();
await this.page.getByTestId("confirm-button").click();
}MapListGeneratorPage.locators.createMapListButtone2e/pages/maps/map-list-generator-page.ts:13
No JSDoc
page.getByRole("button", {
name: "Create map list",
})MapListGeneratorPage.toggleModee2e/pages/maps/map-list-generator-page.ts:40
No JSDoc
async toggleMode(stageName: string, modeName: string) {
await this.page.getByRole("tab", { name: modeName }).click();
await this.stageCheckbox(stageName).click();
}MapListGeneratorPage.stageCheckboxe2e/pages/maps/map-list-generator-page.ts:34
stageCheckbox(stageName: string) {
return this.page
.getByRole("tabpanel")
.getByRole("checkbox", { name: stageName, exact: true });
}MapListGeneratorPage.reloadWithPersistedPoole2e/pages/maps/map-list-generator-page.ts:27
async reloadWithPersistedPool() {
await expect(this.page).toHaveURL(/pool=/);
await this.page.reload();
await expectIsHydrated(this.page);
}MapListGeneratorPage.createMapListe2e/pages/maps/map-list-generator-page.ts:50
No JSDoc
async createMapList() {
await this.locators.createMapListButton.click();
}MapListGeneratorPage.locators.generatedMapListItemse2e/pages/maps/map-list-generator-page.ts:16
No JSDoc
page
.locator("ol[class*='mapList']")
.getByRole("listitem")MapListGeneratorPagee2e/pages/maps/map-list-generator-page.ts:5
No JSDoc
MapPlannerPage.gotoe2e/pages/plans/map-planner-page.ts:29
No JSDoc
async goto() {
await navigate({ page: this.page, url: PLANNER_URL });
await expect(this.locators.canvas).toBeVisible();
}expectNoErrorPagee2e/helpers/playwright.ts:741
export async function expectNoErrorPage(page: Page) {
await expect(page.getByTestId("error-page")).toHaveCount(0);
}MapPlannerPage.locators.imageShapese2e/pages/plans/map-planner-page.ts:17
No JSDoc
page.locator(".tl-shape[data-shape-type='image']")MapPlannerPage.setBackgrounde2e/pages/plans/map-planner-page.ts:34
No JSDoc
async setBackground(stageName: string) {
await this.locators.stageSelect.selectOption({ label: stageName });
await this.locators.setBackgroundButton.click();
}MapPlannerPage.openWeaponCategorye2e/pages/plans/map-planner-page.ts:112
No JSDoc
async openWeaponCategory(categoryName: string) {
await this.page.getByText(categoryName, { exact: true }).click();
}MapPlannerPage.dragWeaponToCanvase2e/pages/plans/map-planner-page.ts:117
async dragWeaponToCanvas(weaponName: string) {
const weaponButton = this.page.getByRole("button", {
name: weaponName,
exact: true,
});
await weaponButton.scrollIntoViewIfNeeded();
const sourceBox = await weaponButton.boundingBox();
const canvasBox = await this.locators.canvas.boundingBox();
if (!sourceBox || !canvasBox) {
throw new Error("Missing bounding box for drag");
}
await this.page.mouse.move(
// …MapPlannerPagee2e/pages/plans/map-planner-page.ts:9
No JSDoc
MapPlannerPage.reloadWithPersistedPlane2e/pages/plans/map-planner-page.ts:40
async reloadWithPersistedPlan(expectedImageShapeCount: number) {
await expect
.poll(
() =>
this.page.evaluate(
({ dbName, storeName }) =>
new Promise<number>((resolve) => {
const openRequest = indexedDB.open(dbName);
openRequest.onerror = () => resolve(0);
openRequest.onsuccess = () => {
const db = openRequest.result;
if (!db.objectStoreNames.contains(storeName)) {
db.close();
resolve(0);
// …MapPlannerPage.locators.stageSelecte2e/pages/plans/map-planner-page.ts:18
No JSDoc
page.getByLabel("Select stage")MapPlannerPage.downloadPlanFilee2e/pages/plans/map-planner-page.ts:93
No JSDoc
async downloadPlanFile() {
await this.locators.planFileMenuButton.click();
const downloadPromise = this.page.waitForEvent("download");
await this.page
.getByRole("menuitem", { name: "Download plan file" })
.click();
return downloadPromise;
}MapPlannerPage.openPlanFilee2e/pages/plans/map-planner-page.ts:102
No JSDoc
async openPlanFile(
file: string | { name: string; mimeType: string; buffer: Buffer },
) {
await this.locators.planFileMenuButton.click();
const fileChooserPromise = this.page.waitForEvent("filechooser");
await this.page.getByRole("menuitem", { name: "Open plan file" }).click();
const fileChooser = await fileChooserPromise;
await fileChooser.setFiles(file);
}MapPlannerPage.locators.openFileErrorToaste2e/pages/plans/map-planner-page.ts:25
No JSDoc
page.getByText("Couldn't open the plan file")