e2e/workspace-pinning.spec.ts
Rama main · réplica de lectura del repositorio original.
import { test, expect } from "@playwright/test";
import pg from "pg";
import { TestApiClient } from "./fixtures";
test("workspace unread stays visible before pinning and after unpinning", async ({ page }, testInfo) => {
const viewer = new TestApiClient();
const owner = new TestApiClient();
const run = `${Date.now()}-${process.pid}`;
const viewerEmail = `workspace-pin-viewer-${run}@localhost`;
const login = await viewer.login(viewerEmail, "Workspace pin viewer");
const home = await viewer.ensureWorkspace("Pin home", `pin-home-${run}`);
await viewer.markUserOnboarded();
await owner.login(`workspace-pin-owner-${run}@localhost`, "Workspace pin owner");
const target = await owner.ensureWorkspace("Pin target", `pin-target-${run}`);
try {
await owner.addMemberByEmail(viewerEmail);
const db = new pg.Client(process.env.DATABASE_URL);
await db.connect();
try {
await db.query(
`INSERT INTO inbox_item (workspace_id, recipient_type, recipient_id, type, title)
VALUES ($1, 'member', $2, 'mention', 'Workspace unread regression')`,
[target.id, login.user.id],
);
} finally {
await db.end();
}
await page.addInitScript((token) => {
localStorage.setItem("multica_token", token!);
localStorage.setItem("multica:chat:isOpen", "false");
}, viewer.getToken());
await page.setViewportSize({ width: 1280, height: 820 });
await page.goto(`/${home.slug}/issues`, { waitUntil: "domcontentloaded" });
const trigger = page.getByRole("button", { name: "Switch workspace" });
await expect(trigger).toBeVisible({ timeout: 30000 });
await trigger.click();
const menu = page.getByRole("menu");
const row = menu.getByRole("menuitem", { name: /Pin target/ });
const dot = row.locator(".bg-brand");
// A DOM-only assertion misses the inline span collapsing to zero size.
await expect(dot).toBeVisible();
const setPin = async (label: string) => {
await row.hover();
const response = page.waitForResponse((response) =>
response.url().endsWith(`/api/workspaces/${target.id}/pin`)
&& response.request().method() === "PUT",
);
await row.getByRole("button", { name: label, exact: true }).click();
expect((await response).status()).toBe(200);
await expect(menu).toBeVisible();
await expect(page).toHaveURL(new RegExp(`/${home.slug}/issues$`));
};
await setPin("Pin workspace");
await page.mouse.move(600, 450);
await expect(row.locator(".icon-pin.fill-current.text-brand")).toBeVisible();
await setPin("Unpin workspace");
await page.mouse.move(600, 450);
await expect(dot).toBeVisible();
await page.keyboard.press("Escape");
await page.reload({ waitUntil: "domcontentloaded" });
await trigger.click();
await expect(dot).toBeVisible();
await page.screenshot({
path: testInfo.outputPath("workspace-unread-restored.png"),
clip: { x: 0, y: 0, width: 620, height: 470 },
});
} finally {
await owner.deleteWorkspace();
await viewer.deleteWorkspace();
}
});