Skip to content

chore(cicd): add e2e integration tests #84#85

Merged
timoa merged 6 commits intomainfrom
fix/84-e2e-integration-tests
Mar 4, 2026
Merged

chore(cicd): add e2e integration tests #84#85
timoa merged 6 commits intomainfrom
fix/84-e2e-integration-tests

Conversation

@timoa
Copy link
Copy Markdown
Owner

@timoa timoa commented Mar 4, 2026

Description

Add the E2E tests suite + the first three tests:

  • Open an existing workflow (sample) from the files sidebar
  • Create an empty workflow from the sidebar and open it from the files sidebar
  • Use the command "Workflow Editor: Open with Workflow Editor"

Type of change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that changes existing behaviour)
  • Documentation update
  • Refactor/code quality improvement
  • Dependency update

Checklist

Code quality

  • My commit messages follow Conventional Commits (e.g. feat:, fix:, docs:, chore:)
  • I have not introduced any TypeScript types without justification
  • I have not left debug code, console.log, or commented-out blocks

Testing

  • I have tested the changes locally by pressing F5 in VSCode to launch the Extension Development Host
  • I have run pnpm test, and all tests pass
  • I have run pnpm lint, and there are no lint errors
  • I have added or updated tests to cover my changes (if applicable)

Build & compatibility

  • I have run pnpm run compile and pnpm run webpack without errors
  • The extension works in VSCode (and ideally Cursor/Windsurf)

Documentation

  • I have updated the README.md if my change adds a new feature, keyboard shortcut, or changes existing behaviour
  • I have updated or added JSDoc comments for non-obvious logic (if applicable)

Screenshots/recordings

Summary by CodeRabbit

  • Tests

    • Added a full end-to-end test suite with automated scenarios exercising the workflow editor, a Mocha-based test runner, and local scripts to execute E2E tests.
    • Included sample fixtures and a temporary workspace harness for running and reporting E2E results.
  • Chores

    • CI updated with a dedicated E2E job to build the project and run E2E tests.
    • Project configurations and test discovery adjusted to include E2E tests and exclude them from unit test runs.

@timoa timoa self-assigned this Mar 4, 2026
@timoa timoa added the enhancement New feature or request label Mar 4, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 4, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds end-to-end testing: a new GitHub Actions e2e job, package scripts and test deps, an E2E test runner (using @vscode/test-electron) with Mocha suites, a sample fixture, and TypeScript/test-config updates to include E2E tests and exclude them from Vitest. (34 words)

Changes

Cohort / File(s) Summary
Workflow CI
/.github/workflows/pull-request.yml
Adds an e2e job (depends on ci) that hardens the runner, checks out code, sets up Node/pnpm, caches pnpm store, builds extension + webview, and runs E2E tests under xvfb-run.
Package manifest
package.json
Adds test:e2e script and new deps/devDeps: mocha, @types/mocha, @vscode/test-electron; minor test:watch formatting change.
E2E runner & suites
src/test/e2e/runTest.ts, src/test/e2e/suite/index.ts, src/test/e2e/suite/extension.test.ts
Adds VS Code E2E runner that creates a temp workspace, copies fixtures, sets env vars, launches VS Code via @vscode/test-electron, and runs Mocha-based tests that open/create workflows and assert webview/tab state.
Fixtures
src/test/e2e/fixtures/sample.yml
Adds a sample workflow fixture used by the new E2E tests.
TypeScript & test config
tsconfig.json, vitest.config.ts
Includes src/test/**/* in TypeScript include, narrows test exclusion patterns to target src/lib/**/*.test.*, and excludes src/test/e2e/** from Vitest discovery.

Sequence Diagram(s)

sequenceDiagram
    participant PR as Pull Request
    participant GH as GitHub Actions
    participant CI as ci job
    participant E2E as e2e job
    participant Runner as `@vscode/test-electron`
    participant VSCode as VS Code (Electron)
    participant Suite as Mocha Suite

    PR->>GH: trigger pull-request workflow
    GH->>CI: run ci job (install, build)
    CI-->>GH: build completed
    GH->>E2E: start e2e job (depends on ci)
    E2E->>Runner: prepare temp workspace & copy fixtures
    E2E->>Runner: launch VS Code with extension and workspace (xvfb-run)
    Runner->>VSCode: start Electron with extension loaded
    VSCode->>Suite: run Mocha E2E tests (activate, open files, invoke commands)
    Suite->>VSCode: inspect webview/tabs and report results
    Suite-->>Runner: tests finished
    Runner->>E2E: cleanup temp workspace
    E2E-->>GH: report job results
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 I hopped a temp dir and tucked fixtures in neat,

Launched headless VS Code on silent feet,
Tabs glowed like carrots, webviews came to play,
Mocha tapped rhythms as tests ran away,
I swept up the crumbs and closed every file,
CI cheered — the workflow passed with a smile.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: adding an E2E integration tests suite to the CI/CD pipeline.
Description check ✅ Passed The PR description follows the template with all required sections completed, including detailed description of changes, type of change selected, and comprehensive checklist items marked.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/84-e2e-integration-tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov
Copy link
Copy Markdown

codecov bot commented Mar 4, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.68%. Comparing base (b70290b) to head (5e77255).
⚠️ Report is 29 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main      #85   +/-   ##
=======================================
  Coverage   93.68%   93.68%           
=======================================
  Files           8        8           
  Lines         269      269           
  Branches      101      101           
=======================================
  Hits          252      252           
  Misses          1        1           
  Partials       16       16           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
src/test/e2e/suite/index.ts (1)

12-17: Consider recursive test file discovery.

The current implementation only discovers *.test.js files in the immediate __dirname directory. If tests are organized in subdirectories in the future, they won't be discovered.

This is fine for the current structure but may need adjustment as the test suite grows.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/test/e2e/suite/index.ts` around lines 12 - 17, The current test discovery
only collects files in testsRoot using readdirSync and misses nested test files;
update the discovery to recursively walk testsRoot (or use a glob like
fast-glob) to gather all files matching *.test.js under subdirectories, then
call mocha.addFile for each discovered path (references: testsRoot, files,
mocha.addFile). Implement a recursive helper that uses fs.readdirSync with
Dirent (or a glob) to descend into directories and push matching filenames so
future nested test suites are discovered.
src/test/e2e/suite/extension.test.ts (1)

8-9: Consider failing fast if environment variables are missing.

The empty string fallback for E2E_WORKSPACE_DIR and E2E_FIXTURES_DIR could lead to confusing test failures if the runner doesn't set them. An early assertion would make debugging easier.

💡 Suggested improvement
-const workspaceDir = process.env.E2E_WORKSPACE_DIR ?? '';
-const fixturesDir = process.env.E2E_FIXTURES_DIR ?? '';
+const workspaceDir = process.env.E2E_WORKSPACE_DIR;
+const fixturesDir = process.env.E2E_FIXTURES_DIR;
+
+if (!workspaceDir || !fixturesDir) {
+  throw new Error('E2E_WORKSPACE_DIR and E2E_FIXTURES_DIR environment variables must be set');
+}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/test/e2e/suite/extension.test.ts` around lines 8 - 9, The test currently
falls back to empty strings for workspaceDir and fixturesDir which can mask
missing environment configuration; change the top-level setup in
extension.test.ts to immediately fail when process.env.E2E_WORKSPACE_DIR or
process.env.E2E_FIXTURES_DIR are missing by checking workspaceDir and
fixturesDir and throwing an informative error (or using your test framework's
assertion) that names the missing variable(s) so the runner fails fast and
points to the misconfiguration.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/test/e2e/runTest.ts`:
- Line 17: The extensionDevelopmentPath is currently resolving four parent
levels from __dirname which, after compilation (out/test/e2e), walks outside the
project root; update the path resolution in runTest.ts (the
extensionDevelopmentPath constant) to traverse three parent directories instead
of four (i.e., use path.resolve(__dirname, '..', '..', '..') ) so it correctly
points to the project root where the compiled extension lives.

---

Nitpick comments:
In `@src/test/e2e/suite/extension.test.ts`:
- Around line 8-9: The test currently falls back to empty strings for
workspaceDir and fixturesDir which can mask missing environment configuration;
change the top-level setup in extension.test.ts to immediately fail when
process.env.E2E_WORKSPACE_DIR or process.env.E2E_FIXTURES_DIR are missing by
checking workspaceDir and fixturesDir and throwing an informative error (or
using your test framework's assertion) that names the missing variable(s) so the
runner fails fast and points to the misconfiguration.

In `@src/test/e2e/suite/index.ts`:
- Around line 12-17: The current test discovery only collects files in testsRoot
using readdirSync and misses nested test files; update the discovery to
recursively walk testsRoot (or use a glob like fast-glob) to gather all files
matching *.test.js under subdirectories, then call mocha.addFile for each
discovered path (references: testsRoot, files, mocha.addFile). Implement a
recursive helper that uses fs.readdirSync with Dirent (or a glob) to descend
into directories and push matching filenames so future nested test suites are
discovered.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 453e4fbe-47fa-4fb1-a37a-a0b88c6b2042

📥 Commits

Reviewing files that changed from the base of the PR and between b70290b and d8756c8.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (8)
  • .github/workflows/pull-request.yml
  • package.json
  • src/test/e2e/fixtures/sample.yml
  • src/test/e2e/runTest.ts
  • src/test/e2e/suite/extension.test.ts
  • src/test/e2e/suite/index.ts
  • tsconfig.json
  • vitest.config.ts

Comment thread src/test/e2e/runTest.ts Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/test/e2e/suite/extension.test.ts`:
- Around line 10-12: The tests use a fixed sleep helper named wait(ms) which
causes flaky E2E failures; replace it with a polling-based helper (e.g.,
waitForCondition or waitForTab) that repeatedly checks a predicate (such as
presence of a tab/title via the same API your tests use) at short intervals
until a timeout instead of sleeping a fixed duration. Update calls that
currently use wait(...) (notably the assertions around opening tabs in
extension.test.ts) to call waitForCondition(() => { /* check tab exists/active
*/ }, { timeout: 5000, interval: 100 }) and fail if the predicate never becomes
true; keep the original wait as deprecated or remove it after replacing all
usages.
- Around line 7-8: Add a fail-fast assertion in the test suite setup to ensure
E2E env vars are set: check that workspaceDir and fixturesDir (and the other
env-derived vars declared around lines 15-19) are non-empty in the suiteSetup
function, and throw or call assert.fail with a clear message if any are missing
so tests stop immediately and do not operate on unintended relative paths;
update suiteSetup to validate these variables before any test files or fixtures
are used.
- Around line 14-15: Add a note to the testing docs (03-testing.mdc) explicitly
exempting E2E tests that run with Mocha/@vscode/test-electron by clarifying that
files under the E2E glob (src/test/e2e/**/*.test.ts) are run via the separate
test:e2e command and not by the general test runner; reference the existing E2E
suite symbol (suite('Workflow Editor E2E', ...) and its suiteSetup usage) as an
example so maintainers understand the exception and update the .cursor/rules
glob guidance to exclude or document that E2E tests are handled differently.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c7e71ae3-0d32-4e4b-9134-23438b3fc028

📥 Commits

Reviewing files that changed from the base of the PR and between d8756c8 and 80f77ce.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (4)
  • package.json
  • src/test/e2e/runTest.ts
  • src/test/e2e/suite/extension.test.ts
  • src/test/e2e/suite/index.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/test/e2e/suite/index.ts
  • src/test/e2e/runTest.ts
  • package.json

Comment thread src/test/e2e/suite/extension.test.ts Outdated
Comment on lines +10 to +12
function wait(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Replace fixed sleeps with condition-based waits to reduce E2E flakiness.

Line 33/57/89 (and other fixed delays) rely on timing assumptions and can intermittently fail on slower CI runners. Prefer polling until the expected tab appears (with timeout).

Suggested fix
-function wait(ms: number): Promise<void> {
-  return new Promise((resolve) => setTimeout(resolve, ms));
-}
+function wait(ms: number): Promise<void> {
+  return new Promise((resolve) => setTimeout(resolve, ms));
+}
+
+async function waitFor(condition: () => boolean, timeoutMs = 10000, intervalMs = 100): Promise<void> {
+  const start = Date.now();
+  while (Date.now() - start < timeoutMs) {
+    if (condition()) return;
+    await wait(intervalMs);
+  }
+  throw new Error(`Timed out after ${timeoutMs}ms`);
+}
-    await wait(2000);
+    await waitFor(() =>
+      vscode.window.tabGroups.all
+        .flatMap((g) => g.tabs)
+        .some((tab) => tab.input instanceof vscode.TabInputWebview && tab.label === 'sample.yml')
+    );

Also applies to: 18-19, 24-25, 33-34, 57-58, 82-83, 89-90

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/test/e2e/suite/extension.test.ts` around lines 10 - 12, The tests use a
fixed sleep helper named wait(ms) which causes flaky E2E failures; replace it
with a polling-based helper (e.g., waitForCondition or waitForTab) that
repeatedly checks a predicate (such as presence of a tab/title via the same API
your tests use) at short intervals until a timeout instead of sleeping a fixed
duration. Update calls that currently use wait(...) (notably the assertions
around opening tabs in extension.test.ts) to call waitForCondition(() => { /*
check tab exists/active */ }, { timeout: 5000, interval: 100 }) and fail if the
predicate never becomes true; keep the original wait as deprecated or remove it
after replacing all usages.

Comment on lines +14 to +15
suite('Workflow Editor E2E', () => {
suiteSetup(async () => {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# Check the actual content of the E2E test file
head -n 30 src/test/e2e/suite/extension.test.ts

Repository: timoa/workflow-editor

Length of output: 1140


🏁 Script executed:

# Check for test framework configuration in package.json
rg -A 5 -B 5 '"test"|"e2e"' package.json

Repository: timoa/workflow-editor

Length of output: 461


🏁 Script executed:

# Search for vitest and mocha configuration files
fd -e "config.ts" -e "config.js" | head -20

Repository: timoa/workflow-editor

Length of output: 133


🏁 Script executed:

# Check what test framework is being used across src/
rg "suite\(|test\(|describe\(|it\(" src/ | head -20

Repository: timoa/workflow-editor

Length of output: 1789


🏁 Script executed:

# Check package.json for `@vscode/test-electron` dependency
rg '@vscode/test-electron|mocha' package.json

Repository: timoa/workflow-editor

Length of output: 157


🏁 Script executed:

# Check for any documentation about E2E tests
find . -name "*.md" -o -name "*.mdc" | xargs rg -l "e2e|E2E" 2>/dev/null | head -10

Repository: timoa/workflow-editor

Length of output: 79


🏁 Script executed:

# Look at the E2E runner script
cat src/test/e2e/runTest.js 2>/dev/null || cat out/test/e2e/runTest.ts 2>/dev/null || find . -name "runTest.*" -type f

Repository: timoa/workflow-editor

Length of output: 90


🏁 Script executed:

# Check cursor rules for any E2E exception documentation
cat .cursor/rules/*.mdc 2>/dev/null | grep -A 10 -B 2 -i "e2e\|mocha"

Repository: timoa/workflow-editor

Length of output: 47


🏁 Script executed:

# Read the runTest.ts file to understand the E2E setup
cat src/test/e2e/runTest.ts

Repository: timoa/workflow-editor

Length of output: 1708


🏁 Script executed:

# Check if there are any comments in cursor rules about E2E or test framework distinctions
cat .cursor/rules/*.mdc | head -100

Repository: timoa/workflow-editor

Length of output: 5168


E2E tests correctly use Mocha via @vscode/test-electron, but the exception should be explicitly documented.

This file appropriately uses Mocha with @vscode/test-electron for VS Code extension E2E testing—this is the standard pattern for extension test runners and cannot use Vitest. However, the .cursor/rules files use broad globs (src/**/*.test.{ts,tsx}) that technically match this path without acknowledging the E2E exception. Add a clarification to 03-testing.mdc noting that src/test/e2e/**/*.test.ts is exempt and runs via the separate test:e2e command with Mocha/test-electron.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/test/e2e/suite/extension.test.ts` around lines 14 - 15, Add a note to the
testing docs (03-testing.mdc) explicitly exempting E2E tests that run with
Mocha/@vscode/test-electron by clarifying that files under the E2E glob
(src/test/e2e/**/*.test.ts) are run via the separate test:e2e command and not by
the general test runner; reference the existing E2E suite symbol
(suite('Workflow Editor E2E', ...) and its suiteSetup usage) as an example so
maintainers understand the exception and update the .cursor/rules glob guidance
to exclude or document that E2E tests are handled differently.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
.github/workflows/pull-request.yml (1)

94-98: Consider adding timeout-minutes for the E2E job.

E2E tests involving VS Code can occasionally hang (e.g., waiting for UI elements). Without an explicit timeout, the job defaults to 6 hours. Adding a reasonable timeout improves reliability and prevents CI queue blockage.

⏱️ Suggested improvement
   e2e:
     name: E2E Tests
     runs-on: ubuntu-latest
     needs: ci
+    timeout-minutes: 30
     steps:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/pull-request.yml around lines 94 - 98, The E2E job named
"e2e" currently has no timeout, which can let VS Code UI tests hang and consume
CI resources; add a timeout-minutes field to the e2e job definition (e.g.,
timeout-minutes: 60 or another team-agreed value) so the job is forcibly
canceled after that period, placing the new key directly under the e2e job
mapping alongside name and runs-on.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In @.github/workflows/pull-request.yml:
- Around line 94-98: The E2E job named "e2e" currently has no timeout, which can
let VS Code UI tests hang and consume CI resources; add a timeout-minutes field
to the e2e job definition (e.g., timeout-minutes: 60 or another team-agreed
value) so the job is forcibly canceled after that period, placing the new key
directly under the e2e job mapping alongside name and runs-on.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e0d2ec5f-078e-4379-b9c3-f86ca9a955d7

📥 Commits

Reviewing files that changed from the base of the PR and between 364ef39 and f8a3720.

📒 Files selected for processing (1)
  • .github/workflows/pull-request.yml

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
src/test/e2e/suite/index.ts (1)

29-31: Make test execution order deterministic.

collectTestFiles() relies on directory iteration order, which can vary across environments and introduce flaky, order-dependent runs. Sort file paths before registering them with Mocha.

Suggested patch
-  for (const file of collectTestFiles(testsRoot)) {
+  const testFiles = collectTestFiles(testsRoot).sort((a, b) => a.localeCompare(b));
+  for (const file of testFiles) {
     mocha.addFile(file);
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/test/e2e/suite/index.ts` around lines 29 - 31,
collectTestFiles(testsRoot) yields non-deterministic iteration order; make test
registration deterministic by sorting the file paths before calling
mocha.addFile. Replace the direct loop over collectTestFiles(testsRoot) with
iterating over a sorted list (e.g., convert the iterable/array returned by
collectTestFiles into an array and sort it) and then call mocha.addFile for each
entry so test execution order is stable; reference collectTestFiles, testsRoot
and mocha.addFile when making the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/test/e2e/suite/index.ts`:
- Around line 29-31: collectTestFiles(testsRoot) yields non-deterministic
iteration order; make test registration deterministic by sorting the file paths
before calling mocha.addFile. Replace the direct loop over
collectTestFiles(testsRoot) with iterating over a sorted list (e.g., convert the
iterable/array returned by collectTestFiles into an array and sort it) and then
call mocha.addFile for each entry so test execution order is stable; reference
collectTestFiles, testsRoot and mocha.addFile when making the change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 41909248-4f3c-4eb0-8a9b-66df47118d94

📥 Commits

Reviewing files that changed from the base of the PR and between f8a3720 and 59eab9a.

📒 Files selected for processing (2)
  • src/test/e2e/suite/extension.test.ts
  • src/test/e2e/suite/index.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/test/e2e/suite/extension.test.ts

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 4, 2026

🩺 React Doctor

react-doctor v0.0.29

�[32m✔�[39m Select projects to scan �[2m›�[22m workflow-visual-editor
�[33mNo feature branch or uncommitted changes detected. Running full scan.�[39m

�[2mScanning /home/runner/work/workflow-editor/workflow-editor...�[22m


  �[33m⚠�[39m Enforce a clickable non-interactive element has at least one keyboard event listener.�[33m (20)�[39m
�[2m    Visible, non-interactive elements with click handlers must have one of `keyup`, `keydown`, or `keypress` listener.�[22m
�[2m    src/components/ConfirmDialog.tsx: 30, 37�[22m
�[2m    src/components/RunScriptDialog.tsx: 111, 118�[22m
�[2m    src/webview/components/PasteYamlDialog.tsx: 21, 28�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 1017�[22m
�[2m    src/webview/App.tsx: 533�[22m
�[2m    src/webview/components/SourceCodeDialog.tsx: 160, 167�[22m
�[2m    src/webview/components/ConfirmDialog.tsx: 30, 37�[22m
�[2m    src/webview/components/RunScriptDialog.tsx: 123, 130�[22m
�[2m    src/components/PasteYamlDialog.tsx: 21, 28�[22m
�[2m    src/components/JobPropertyPanel.tsx: 1017�[22m
�[2m    src/App.tsx: 489�[22m
�[2m    src/components/SourceCodeDialog.tsx: 146, 153�[22m

  �[33m⚠�[39m Static HTML elements with event handlers require a role.�[33m (10)�[39m
�[2m    Add a role attribute to this element, or use a semantic HTML element instead.�[22m
�[2m    src/components/ConfirmDialog.tsx: 37�[22m
�[2m    src/components/RunScriptDialog.tsx: 118�[22m
�[2m    src/webview/components/PasteYamlDialog.tsx: 28�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 1017�[22m
�[2m    src/webview/components/SourceCodeDialog.tsx: 167�[22m
�[2m    src/webview/components/ConfirmDialog.tsx: 37�[22m
�[2m    src/webview/components/RunScriptDialog.tsx: 130�[22m
�[2m    src/components/PasteYamlDialog.tsx: 28�[22m
�[2m    src/components/JobPropertyPanel.tsx: 1017�[22m
�[2m    src/components/SourceCodeDialog.tsx: 153�[22m

  �[33m⚠�[39m Array index "idx" used as key — causes bugs when list is reordered or filtered�[33m (12)�[39m
�[2m    Use a stable unique identifier: `key={item.id}` or `key={item.slug}` — index keys break on reorder/filter�[22m
�[2m    src/webview/components/TriggerNode.tsx: 26�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 885�[22m
�[2m    src/webview/App.tsx: 649�[22m
�[2m    src/components/TriggerPropertyPanel.tsx: 144�[22m
�[2m    src/webview/components/SourceCodeDialog.tsx: 220�[22m
�[2m    src/components/TriggerBadge.tsx: 64�[22m
�[2m    src/webview/components/TriggerPropertyPanel.tsx: 144�[22m
�[2m    src/components/TriggerNode.tsx: 26�[22m
�[2m    src/webview/components/TriggerBadge.tsx: 64�[22m
�[2m    src/components/JobPropertyPanel.tsx: 885�[22m
�[2m    src/App.tsx: 632�[22m
�[2m    src/components/SourceCodeDialog.tsx: 206�[22m

  �[33m⚠�[39m "@codemirror/view" is a heavy library — use React.lazy() or next/dynamic for code splitting�[33m (8)�[39m
�[2m    Use `const Component = dynamic(() => import('library'), { ssr: false })` from next/dynamic or React.lazy()�[22m
�[2m    src/components/RunScriptDialog.tsx: 2, 3�[22m
�[2m    src/webview/components/SourceCodeDialog.tsx: 2, 3�[22m
�[2m    src/webview/components/RunScriptDialog.tsx: 2, 3�[22m
�[2m    src/components/SourceCodeDialog.tsx: 2, 3�[22m

  �[33m⚠�[39m A form label must be associated with a control.�[33m (45)�[39m
�[2m    Either give the label a `htmlFor` attribute with the id of the associated control, or wrap the label around the control.�[22m
�[2m    src/components/WorkflowPropertyPanel.tsx: 71, 81, 92�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 200, 212, 219, 277, 359, 401, 426, 494, 851, 874, 915�[22m
�[2m    src/components/TriggerPropertyPanel.tsx: 130, 158, 175, 219, 263, 325, 369, 414�[22m
�[2m    src/webview/components/WorkflowPropertyPanel.tsx: 71, 81, 92�[22m
�[2m    src/webview/components/TriggerPropertyPanel.tsx: 130, 158, 175, 219, 263, 325, 369, 414, 432�[22m
�[2m    src/components/JobPropertyPanel.tsx: 200, 212, 219, 277, 359, 401, 426, 494, 851, 874, 915�[22m

  �[33m⚠�[39m Component "JobPropertyPanel" is 1016 lines — consider breaking it into smaller focused components�[33m (6)�[39m
�[2m    Extract logical sections into focused components: `<UserHeader />`, `<UserActions />`, etc.�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 40�[22m
�[2m    src/webview/App.tsx: 56�[22m
�[2m    src/components/TriggerPropertyPanel.tsx: 48�[22m
�[2m    src/webview/components/TriggerPropertyPanel.tsx: 48�[22m
�[2m    src/components/JobPropertyPanel.tsx: 40�[22m
�[2m    src/App.tsx: 56�[22m

  �[33m⚠�[39m 3 setState calls in a single useEffect — consider using useReducer or deriving state�[33m (3)�[39m
�[2m    Combine into useReducer: `const [state, dispatch] = useReducer(reducer, initialState)`�[22m
�[2m    src/webview/components/JobPropertyPanel.tsx: 139�[22m
�[2m    src/webview/App.tsx: 105�[22m
�[2m    src/components/JobPropertyPanel.tsx: 139�[22m

  �[33m⚠�[39m Component "AppInner" has 13 useState calls — consider useReducer for related state�[33m (2)�[39m
�[2m    Group related state: `const [state, dispatch] = useReducer(reducer, { field1, field2, ... })`�[22m
�[2m    src/webview/App.tsx: 56�[22m
�[2m    src/App.tsx: 56�[22m

  �[2m┌────────────────────────────────────────────────────┐�[22m
  �[2m│�[22m �[32m┌─────┐�[39m                                            �[2m│�[22m
  �[2m│�[22m �[32m│ ◠ ◠ │�[39m                                            �[2m│�[22m
  �[2m│�[22m �[32m│  ▽  │�[39m                                            �[2m│�[22m
  �[2m│�[22m �[32m└─────┘�[39m                                            �[2m│�[22m
  �[2m│�[22m React Doctor �[2m(www.react.doctor)�[22m                    �[2m│�[22m
  �[2m│�[22m                                                    �[2m│�[22m
  �[2m│�[22m �[32m94�[39m / 100  �[32mGreat�[39m                                    �[2m│�[22m
  �[2m│�[22m                                                    �[2m│�[22m
  �[2m│�[22m �[32m███████████████████████████████████████████████�[39m�[2m░░░�[22m �[2m│�[22m
  �[2m│�[22m                                                    �[2m│�[22m
  �[2m│�[22m �[33m⚠ 106 warnings�[39m  �[2macross 20/67 files�[22m  �[2min 735ms�[22m       �[2m│�[22m
  �[2m└────────────────────────────────────────────────────┘�[22m

�[2m  Full diagnostics written to /tmp/react-doctor-2ca16988-64e1-444e-8f9d-2edc69f0de8d�[22m

�[2m  Share your results: �[36mhttps://www.react.doctor/share?p=workflow-visual-editor&s=94&w=106&f=20�[39m�[22m

@timoa timoa merged commit d8ca9ab into main Mar 4, 2026
9 checks passed
@timoa timoa deleted the fix/84-e2e-integration-tests branch March 4, 2026 12:05
@timoa-bot
Copy link
Copy Markdown

timoa-bot bot commented Mar 4, 2026

🎉 This PR is included in version 1.2.37 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

@timoa-bot timoa-bot bot added the released label Mar 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant