test: cover map object editing flow

This commit is contained in:
Nico 2026-06-03 02:14:41 -07:00
parent 6f57b485d8
commit 2a7fa1871f
3 changed files with 42 additions and 6 deletions

View File

@ -138,6 +138,7 @@ export default function LocationMapBottomSheet({
<label>
Type
<select
aria-label="Object type"
value={selectedObject.type}
onChange={(event) => onObjectField("type", event.target.value)}
>
@ -149,6 +150,7 @@ export default function LocationMapBottomSheet({
<label>
Zone
<select
aria-label="Linked zone"
value={objectZoneId(selectedObject)}
onChange={(event) => onZoneLinkChange(event.target.value)}
>

View File

@ -210,6 +210,7 @@ export default function LocationMapCanvas({
height="38"
rx="10"
onPointerDown={(event) => startDrag(event, object, "resize")}
onClick={(event) => event.stopPropagation()}
/>
) : null}
</g>

View File

@ -1,5 +1,5 @@
import { expect, test, type Page } from "@playwright/test";
import { mockConfig, seedAuthStorage } from "./helpers/e2e";
import { confirmSlide, mockConfig, seedAuthStorage } from "./helpers/e2e";
const adminHousehold = { id: 1, name: "Map House", role: "admin", invite_code: "ABCD1234" };
const memberHousehold = { ...adminHousehold, role: "member" };
@ -253,7 +253,37 @@ test("admin creates a map from zones, saves a draft, and publishes it", async ({
await page.getByRole("button", { name: "Edit Objects" }).click();
const bakeryObject = page.locator(".location-map-object", { hasText: "Bakery" }).locator("rect").first();
await bakeryObject.click();
const moveBox = await bakeryObject.boundingBox();
expect(moveBox).not.toBeNull();
if (!moveBox) throw new Error("Bakery map object could not be moved");
await page.mouse.move(moveBox.x + moveBox.width / 2, moveBox.y + moveBox.height / 2);
await page.mouse.down();
await page.mouse.move(moveBox.x + moveBox.width / 2 + 60, moveBox.y + moveBox.height / 2 + 40, {
steps: 8,
});
await page.mouse.up();
const resizeHandle = page.locator(".location-map-resize-handle");
await expect(resizeHandle).toBeVisible();
const resizeBox = await resizeHandle.boundingBox();
expect(resizeBox).not.toBeNull();
if (!resizeBox) throw new Error("Resize handle was not measurable");
await page.mouse.move(resizeBox.x + resizeBox.width / 2, resizeBox.y + resizeBox.height / 2);
await page.mouse.down();
await page.mouse.move(resizeBox.x + resizeBox.width / 2 + 45, resizeBox.y + resizeBox.height / 2 + 35, {
steps: 8,
});
await page.mouse.up();
await page.getByRole("textbox", { name: "Label" }).fill("Bread Wall");
await page.getByRole("button", { name: "Duplicate" }).click();
await expect(page.getByRole("textbox", { name: "Label" })).toHaveValue("Bread Wall Copy");
await page.getByLabel("Linked zone").selectOption("502");
await page.getByRole("textbox", { name: "Label" }).fill("Temporary Freezer");
await page.getByRole("button", { name: "Delete" }).click();
await confirmSlide(page);
await expect(page.locator(".location-map-object", { hasText: "Temporary Freezer" })).toHaveCount(0);
await expect(page.locator(".location-map-status")).toHaveText("Unsaved Draft");
await page.getByRole("button", { name: "Preview Draft" }).click();
await expect(page.locator(".location-map-object", { hasText: "Bread Wall" })).toBeVisible();
@ -266,11 +296,14 @@ test("admin creates a map from zones, saves a draft, and publishes it", async ({
await expect(page.locator(".location-map-status")).toHaveText("Draft");
expect(savedPayload).not.toBeNull();
expect(savedPayload?.objects).toEqual(
expect.arrayContaining([
expect.objectContaining({ label: "Bread Wall", zone_id: 501, x: 28, y: 28 }),
])
);
const savedObjects = savedPayload?.objects as Array<Record<string, unknown>>;
const savedBreadWall = savedObjects.find((object) => object.label === "Bread Wall");
expect(savedBreadWall).toEqual(expect.objectContaining({ zone_id: 501 }));
expect(Number(savedBreadWall?.x)).toBeGreaterThan(28);
expect(Number(savedBreadWall?.y)).toBeGreaterThan(28);
expect(Number(savedBreadWall?.width)).toBeGreaterThan(300);
expect(Number(savedBreadWall?.height)).toBeGreaterThan(180);
expect(savedObjects.some((object) => object.label === "Temporary Freezer")).toBe(false);
await page.getByRole("button", { name: "Publish" }).click();
await expect(page.locator(".location-map-status")).toHaveText("Published");