Files
kandev/apps/web/e2e/tests/task/mobile-large-file-tree-virtualization.spec.ts
T

83 lines
3.3 KiB
TypeScript

import { test, expect } from "../../fixtures/test-base";
import { assertNoDocumentHorizontalOverflow } from "../../helpers/layout-assertions";
import {
LARGE_FILE_TREE_COUNT,
LARGE_FILE_TREE_FOLDER,
expectContiguousVisibleFileTreeRows,
expectVisibleFileTreePaths,
largeFileTreePath,
scrollToLastLargeFile,
setupLargeFileTreeTask,
visibleFileTreePaths,
waitForFileTreeLayoutSettle,
} from "./large-file-tree-virtualization-helpers";
test.describe("Mobile large file tree virtualization", () => {
test("keeps the row window bounded and preserves touch actions", async ({
testPage,
apiClient,
seedData,
backend,
}) => {
test.setTimeout(120_000);
const session = await setupLargeFileTreeTask({
testPage,
apiClient,
seedData,
backend,
title: "Mobile large file tree virtualization",
});
await testPage.getByRole("button", { name: "Files", exact: true }).tap();
const folder = session.fileTreeNode(LARGE_FILE_TREE_FOLDER);
const viewport = session.fileTreeScrollViewport();
await expect(folder).toBeVisible({ timeout: 15_000 });
await expect(viewport).toBeVisible({ timeout: 15_000 });
await waitForFileTreeLayoutSettle(testPage);
await expectContiguousVisibleFileTreeRows(viewport);
const collapsedPaths = await visibleFileTreePaths(viewport);
await testPage.getByRole("button", { name: "Chat", exact: true }).tap();
await expect(viewport).toBeHidden();
await testPage.getByRole("button", { name: "Files", exact: true }).tap();
await expect(folder).toBeVisible({ timeout: 15_000 });
await expectContiguousVisibleFileTreeRows(viewport);
await expectVisibleFileTreePaths(viewport, collapsedPaths);
await folder.tap();
await expect(session.fileTreeNode(largeFileTreePath(0))).toBeVisible({ timeout: 15_000 });
await expectContiguousVisibleFileTreeRows(viewport);
await expect
.poll(() => session.visibleFileTreeNodes().count(), { timeout: 5_000 })
.toBeLessThan(80);
const firstActions = session.fileTreeNodeActions(largeFileTreePath(0));
await expect(firstActions).toBeVisible();
const firstActionsBox = await firstActions.boundingBox();
expect(firstActionsBox).not.toBeNull();
expect(firstActionsBox!.width).toBeGreaterThanOrEqual(44);
expect(firstActionsBox!.height).toBeGreaterThanOrEqual(44);
await scrollToLastLargeFile(
session.fileTreeNode(largeFileTreePath(LARGE_FILE_TREE_COUNT - 1)),
viewport,
);
const lastFile = largeFileTreePath(LARGE_FILE_TREE_COUNT - 1);
await expect(session.fileTreeNode(lastFile)).toBeVisible({ timeout: 15_000 });
const lastActions = session.fileTreeNodeActions(lastFile);
await expect(lastActions).toBeVisible();
const lastActionsBox = await lastActions.boundingBox();
expect(lastActionsBox).not.toBeNull();
expect(lastActionsBox!.width).toBeGreaterThanOrEqual(44);
expect(lastActionsBox!.height).toBeGreaterThanOrEqual(44);
await expectContiguousVisibleFileTreeRows(viewport);
await assertNoDocumentHorizontalOverflow(testPage, "mobile large file tree");
await session.fileTreeNode(lastFile).tap();
const viewer = testPage.getByTestId("mobile-file-viewer-panel");
await expect(viewer).toBeVisible({ timeout: 15_000 });
await expect(viewer).toContainText(lastFile);
});
});