Ctrl K
ComunidadGuías…

e2e/workspace-pinning.spec.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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();
  }
});