Files
kandev/apps/web/e2e/tests/task/task-title-hover-surfaces.spec.ts
T
2026-08-24 19:24:15 +00:00

96 lines
3.2 KiB
TypeScript

import { test, expect } from "../../fixtures/test-base";
import type { Page } from "@playwright/test";
import type { ApiClient } from "../../helpers/api-client";
import type { SeedData } from "../../fixtures/test-base";
import { dwell } from "../../helpers/causal-waits";
/**
* The title preview is intentionally a Kanban-only affordance. These tests
* keep the non-Kanban surfaces from regressing back to title/subtask popovers.
*/
const PARENT_TITLE = "Surface hover parent with a title long enough to clamp";
const CHILD_ONE_TITLE = "Surface child one with its own long title";
const CHILD_TWO_TITLE = "Surface child two";
async function seedParentWithSubtasks(apiClient: ApiClient, seedData: SeedData) {
await apiClient.saveUserSettings({
workspace_id: seedData.workspaceId,
enable_preview_on_click: false,
});
const parent = await apiClient.createTask(seedData.workspaceId, PARENT_TITLE, {
workflow_id: seedData.workflowId,
workflow_step_id: seedData.startStepId,
repository_ids: [seedData.repositoryId],
});
await apiClient.createTask(seedData.workspaceId, CHILD_ONE_TITLE, {
workflow_id: seedData.workflowId,
workflow_step_id: seedData.startStepId,
repository_ids: [seedData.repositoryId],
parent_id: parent.id,
workspace_mode: "inherit_parent",
});
await apiClient.createTask(seedData.workspaceId, CHILD_TWO_TITLE, {
workflow_id: seedData.workflowId,
workflow_step_id: seedData.startStepId,
repository_ids: [seedData.repositoryId],
parent_id: parent.id,
workspace_mode: "inherit_parent",
});
}
async function assertNoTitlePreview(testPage: Page) {
await dwell(
testPage,
300,
"negative-assertion",
"non-Kanban task titles must not open a title preview",
);
await expect(testPage.getByTestId("task-title-hover-card")).toHaveCount(0);
}
test.describe("Task title hover card on non-Kanban surfaces", () => {
test("the /tasks rich list does not show a title preview for parent tasks", async ({
testPage,
apiClient,
seedData,
}) => {
test.setTimeout(120_000);
await seedParentWithSubtasks(apiClient, seedData);
await testPage.goto("/tasks");
await testPage.waitForLoadState("networkidle");
const parentRow = testPage
.getByTestId("tasks-list")
.getByTestId("tasks-list-row")
.filter({ hasText: PARENT_TITLE })
.first();
await expect(parentRow).toBeVisible({ timeout: 45_000 });
await parentRow.getByTestId("tasks-list-row-title").hover();
await assertNoTitlePreview(testPage);
});
test("the AppSidebar task row does not show a title preview for parent tasks", async ({
testPage,
apiClient,
seedData,
}) => {
test.setTimeout(120_000);
await seedParentWithSubtasks(apiClient, seedData);
await testPage.goto("/tasks");
await testPage.waitForLoadState("networkidle");
const sidebarRow = testPage
.getByTestId("app-sidebar")
.getByTestId("sidebar-task-item")
.filter({ hasText: PARENT_TITLE })
.first();
await expect(sidebarRow).toBeVisible({ timeout: 45_000 });
await sidebarRow.getByText(PARENT_TITLE, { exact: false }).first().hover();
await assertNoTitlePreview(testPage);
});
});