import assert from 'node:assert/strict'; import { test } from 'node:test'; import { findInvalidTaskGraphs, MODES, playwrightTargets, } from './check-e2e-task-graphs.mjs'; const playwright = { technologies: ['playwright'] }; /** * Mirrors web-e2e as the Playwright plugin infers it without CI: an uncovered * mock webServer makes `e2e` non-parallel while `pnpm nx run web:serve` adds a * continuous dependency on the dev server. */ function graphWithE2eTarget(e2eTarget) { const node = (name, targets) => ({ name, type: 'app', data: { root: `apps/${name}`, targets }, }); return { nodes: { web: node('web', { serve: { executor: '@angular/build:dev-server', continuous: true, }, }), 'web-e2e': node('web-e2e', { e2e: { executor: 'nx:run-commands', options: { command: 'playwright test' }, metadata: playwright, ...e2eTarget, }, lint: { executor: '@nx/eslint:lint', parallelism: false, dependsOn: [{ projects: ['web'], target: 'serve' }], }, }), }, dependencies: { web: [], 'web-e2e': [] }, }; } test('checks only Playwright-inferred targets', () => { const graph = graphWithE2eTarget({ parallelism: false }); assert.deepEqual(playwrightTargets(graph), [ { project: 'web-e2e', target: 'e2e' }, ]); }); test('reports a non-parallel e2e target that depends on a continuous serve', async () => { const graph = graphWithE2eTarget({ parallelism: false, dependsOn: [{ projects: ['web'], target: 'serve' }], }); const failures = await findInvalidTaskGraphs(graph); assert.equal(failures.length, 1); assert.equal(failures[0].task, 'web-e2e:e2e'); assert.match(failures[0].message, /web-e2e:e2e -> web:serve/); }); test('accepts a non-parallel e2e target whose servers Playwright starts', async () => { const graph = graphWithE2eTarget({ parallelism: false, dependsOn: [] }); assert.deepEqual(await findInvalidTaskGraphs(graph), []); }); test('validates both the local and the CI plugin inference', () => { assert.deepEqual(MODES, { local: { CI: undefined }, ci: { CI: 'true' } }); });