Files
kandev/apps/web/e2e/tests/task/large-file-tree-virtualization.spec.ts
T
2026-09-07 13:45:08 +01:00

86 lines
2.9 KiB
TypeScript

import { test, expect } from "../../fixtures/test-base";
import {
LARGE_FILE_TREE_FOLDER,
LARGE_FILE_TREE_COUNT,
largeFileTreePath,
scrollToLastLargeFile,
setupLargeFileTreeTask,
} from "./large-file-tree-virtualization-helpers";
test.describe("Large file tree virtualization", () => {
test("mounts a bounded row window and reaches the last file", async ({
testPage,
apiClient,
seedData,
backend,
}) => {
test.setTimeout(120_000);
const session = await setupLargeFileTreeTask({
testPage,
apiClient,
seedData,
backend,
title: "Large file tree virtualization",
});
await session.clickTab("Files");
const folder = session.fileTreeNode(LARGE_FILE_TREE_FOLDER);
await expect(folder).toBeVisible({ timeout: 15_000 });
await expect(session.fileTreeNode(largeFileTreePath(0))).toHaveCount(0);
await folder.click();
await expect(session.fileTreeNode(largeFileTreePath(0))).toBeVisible({ timeout: 15_000 });
await expect
.poll(() => session.visibleFileTreeNodes().count(), { timeout: 5_000 })
.toBeLessThan(80);
const viewport = session.fileTreeScrollViewport();
await expect(viewport).toBeVisible();
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 });
await session.fileTreeNode(lastFile).click();
await expect(testPage.getByTestId("preview-tab-file-editor")).toBeVisible({ timeout: 15_000 });
});
test("reveals the create input after scrolling away from its folder", async ({
testPage,
apiClient,
seedData,
backend,
}) => {
test.setTimeout(120_000);
const session = await setupLargeFileTreeTask({
testPage,
apiClient,
seedData,
backend,
title: "Large file tree create reveal",
});
await session.clickTab("Files");
const folder = session.fileTreeNode(LARGE_FILE_TREE_FOLDER);
await expect(folder).toBeVisible({ timeout: 15_000 });
await folder.click();
await expect(session.fileTreeNode(largeFileTreePath(0))).toBeVisible({ timeout: 15_000 });
const viewport = session.fileTreeScrollViewport();
await viewport.evaluate((element) => {
element.scrollTop = element.scrollHeight;
element.dispatchEvent(new Event("scroll", { bubbles: true }));
});
const createMenu = testPage.getByTestId("files-create-menu");
await expect(createMenu).toBeVisible({ timeout: 15_000 });
await createMenu.click();
await testPage.getByRole("menuitem", { name: "New file" }).click();
const input = testPage.getByPlaceholder("filename...");
await expect(input).toBeVisible({ timeout: 15_000 });
await expect(input).toBeFocused({ timeout: 5_000 });
});
});