Files
kandev/apps/web/e2e/tests/github/mobile-task-view-access.spec.ts
T
2026-09-12 10:06:05 +02:00

97 lines
4.2 KiB
TypeScript

import { test, expect } from "../../fixtures/test-base";
import { MobileGitHubPage } from "../../pages/mobile-github-page";
import { MobileKanbanPage } from "../../pages/mobile-kanban-page";
// @covers AC-UI-MOBILE-TASK-VIEWS-001.1
// @covers AC-UI-MOBILE-TASK-VIEWS-001.2
test("GitHub app navigation opens shared task views and preserves browser Back", async ({
testPage,
apiClient,
seedData,
}) => {
await apiClient.mockGitHubReset();
await apiClient.mockGitHubSetUser("test-user");
const { settings } = await apiClient.getUserSettings();
expect(typeof settings.sidebar_active_view_id).toBe("string");
const view = {
id: "github-mobile-task-view",
name: "My mobile tasks",
filters: [],
sort: { key: "updatedAt", direction: "desc" },
group: "none",
collapsedGroups: [],
};
await apiClient.saveUserSettings({ sidebar_views: [view], sidebar_active_view_id: view.id });
const task = await apiClient.seedTask(seedData.workspaceId, "Task reachable from GitHub", {
workflow_id: seedData.workflowId,
workflow_step_id: seedData.startStepId,
});
try {
const github = new MobileGitHubPage(testPage);
await github.goto();
const opener = testPage.getByTestId("app-nav-trigger");
await opener.tap();
await testPage
.getByTestId("app-nav-sheet")
.getByRole("button", { name: "Task views", exact: true })
.tap();
const drawer = testPage.getByRole("dialog", { name: "Tasks", exact: true });
await expect(drawer).toBeVisible();
await expect(testPage.getByTestId("app-nav-sheet")).toBeHidden();
await expect(testPage.locator('[role="dialog"]:visible')).toHaveCount(1);
await expect(
drawer.getByTestId("sidebar-view-chip").filter({ hasText: view.name }),
).toHaveAttribute("data-active", "true");
await expect(drawer.getByTestId("sidebar-new-view")).toBeVisible();
await testPage.keyboard.press("Escape");
await expect(drawer).toBeHidden();
await expect(opener).toBeFocused();
await opener.tap();
await testPage
.getByTestId("app-nav-sheet")
.getByRole("button", { name: "Task views", exact: true })
.tap();
await drawer.locator(`[data-task-row-id="${task.task_id}"]`).tap();
await expect(testPage).toHaveURL(new RegExp(`/t/${task.task_id}`));
await testPage.goBack();
await expect(testPage).toHaveURL(/\/github$/);
await expect(github.mobileMenuButton).toBeVisible();
// The task remains selected in shared state, but GitHub has no task-only providers.
await opener.tap();
await testPage
.getByTestId("app-nav-sheet")
.getByRole("button", { name: "Task views", exact: true })
.tap();
await expect(drawer.getByTestId("sidebar-filter-bar")).toBeVisible();
await drawer.getByRole("button", { name: "New", exact: true }).tap();
await expect(drawer).toBeHidden();
await expect(testPage.getByRole("dialog")).toBeVisible();
await expect(testPage.getByRole("dialog")).not.toHaveAccessibleName("Tasks");
const titleInput = testPage.getByTestId("create-task-dialog").getByTestId("task-title-input");
await titleInput.fill("Draft survives phone rotation");
await testPage.setViewportSize({ width: 851, height: 393 });
await expect(titleInput).toHaveValue("Draft survives phone rotation");
} finally {
await apiClient.saveUserSettings({
sidebar_views: (settings.sidebar_views ?? []) as unknown[],
sidebar_active_view_id: settings.sidebar_active_view_id as string,
});
}
});
// @covers AC-UI-MOBILE-TASK-VIEWS-001.1
// @covers AC-UI-MOBILE-TASK-VIEWS-001.2
test("Kanban navigation can open empty task views and return focus", async ({ testPage }) => {
const kanban = new MobileKanbanPage(testPage);
await kanban.goto();
await kanban.mobileMenuButton.tap();
await kanban.menuCard.getByRole("button", { name: "Task views", exact: true }).tap();
const drawer = testPage.getByRole("dialog", { name: "Tasks", exact: true });
await expect(drawer.getByTestId("sidebar-filter-bar")).toBeVisible();
await expect(drawer.locator('[data-slot="task-switcher-empty-state"]')).toBeVisible();
await expect(kanban.menuCard).toBeHidden();
await testPage.keyboard.press("Escape");
await expect(drawer).toBeHidden();
await expect(kanban.mobileMenuButton).toBeFocused();
});