Files
webstudio/apps/builder/e2e/test-modules.test.ts
T
Oleg Isonen 0070fa66a1 ci: deduplicate builder E2E setup (#5917)
## What changed

- reuse the shared CI setup action in both Builder E2E jobs
- use one build command for CI and local E2E runs
- centralize shard filename parsing and suite-name formatting
- remove redundant suite-level shard filtering
- parse each E2E filename's shard metadata once

## Why

The merged image-asset PR introduced multiple owners for Builder E2E
setup, build dependencies, and shard filename semantics. Consolidating
them prevents CI and local behavior from drifting as the shard layout
evolves.

## Validation

- `pnpm --filter=@webstudio-is/builder test -- e2e/test-modules.test.ts`
- `pnpm --filter=@webstudio-is/builder typecheck`
- `pnpm lint`
- `pnpm e2e:builder:build`
- shell syntax and YAML parsing
- shard discovery returned shards 1–6
2026-07-18 10:43:56 +02:00

77 lines
2.4 KiB
TypeScript

import { expect, test } from "vitest";
import {
getE2eFileShards,
getE2eShards,
getE2eSuiteName,
getE2eTestModules,
isE2eTestInShard,
} from "./test-modules";
test("formats suite names using the shared shard filename syntax", () => {
expect(
getE2eSuiteName("pages-actions.[shard-2].[shard-5].[shard-6].e2e.ts")
).toBe("pages actions");
expect(getE2eSuiteName("asset-canvas-drag.[shard-4].e2e.ts")).toBe(
"asset canvas drag"
);
});
test("discovers every e2e module and filters ownership by shard tag", () => {
const files = [
"asset-folders-selection-actions.[shard-4].e2e.ts",
"pages-actions.[shard-2].[shard-5].[shard-6].e2e.ts",
"pages-drag.[shard-3].e2e.ts",
"navigator-drag.[shard-1].e2e.ts",
"helper.ts",
];
expect(getE2eTestModules(files)).toEqual([
"./tests/asset-folders-selection-actions.[shard-4].e2e.ts",
"./tests/navigator-drag.[shard-1].e2e.ts",
"./tests/pages-actions.[shard-2].[shard-5].[shard-6].e2e.ts",
"./tests/pages-drag.[shard-3].e2e.ts",
]);
expect(getE2eTestModules(files, "shard-3")).toEqual([
"./tests/pages-drag.[shard-3].e2e.ts",
]);
expect(getE2eTestModules(files, "shard-4")).toEqual([
"./tests/asset-folders-selection-actions.[shard-4].e2e.ts",
]);
expect(getE2eTestModules(files, "shard-5")).toEqual([
"./tests/pages-actions.[shard-2].[shard-5].[shard-6].e2e.ts",
]);
});
test("discovers the shard matrix from e2e filenames", () => {
expect(
getE2eShards([
"second.[shard-2].[shard-10].e2e.ts",
"first.[shard-1].e2e.ts",
"helper.ts",
])
).toEqual(["shard-1", "shard-2", "shard-10"]);
expect(() => getE2eShards(["unassigned.e2e.ts"])).toThrow(
"Every e2e file must have a shard tag"
);
});
test("partitions a multi-shard file by test registration order", () => {
const fileName = "pages-actions.[shard-2].[shard-5].[shard-6].e2e.ts";
expect(getE2eFileShards(fileName)).toEqual(["shard-2", "shard-5", "shard-6"]);
expect(
[0, 1, 2, 3, 4].filter((distributionIndex) =>
isE2eTestInShard({ fileName, shard: "shard-2", distributionIndex })
)
).toEqual([0, 3]);
expect(
[0, 1, 2, 3, 4].filter((distributionIndex) =>
isE2eTestInShard({ fileName, shard: "shard-5", distributionIndex })
)
).toEqual([1, 4]);
expect(
[0, 1, 2, 3, 4].filter((distributionIndex) =>
isE2eTestInShard({ fileName, shard: "shard-6", distributionIndex })
)
).toEqual([2]);
});