Skip to content

Conversation

@chrisgleissner
Copy link
Owner

Increase UI code coverage to over 80% and integrate E2E test coverage reporting with Codecov.

The existing Vitest suites for RegionAuthoringPanel and EventLog were failing due to UI changes, leading to unreliable coverage. E2E coverage was entirely absent. This PR stabilizes existing tests, adds new unit tests for audio notifications, and implements Playwright instrumentation to capture and upload E2E coverage, aligning with the project's goal of robust code quality metrics.


Open in Cursor Open in Web

Integrates Playwright E2E test coverage collection and reporting into the CI workflow. This includes adding necessary dependencies, configuring Vite for instrumentation, and updating scripts and CI jobs to capture and merge coverage data. The `.gitignore` and `PLANS.md` files are also updated to reflect these changes.

Co-authored-by: chrisgleissner <chrisgleissner@gmail.com>
@cursor
Copy link

cursor bot commented Nov 21, 2025

Cursor Agent can help with this pull request. Just @cursor in comments and I'll start working on changes in this branch.
Learn more about Cursor Agents

@chrisgleissner chrisgleissner marked this pull request as ready for review November 21, 2025 10:07
Copilot AI review requested due to automatic review settings November 21, 2025 10:07
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR implements comprehensive test coverage improvements, bringing UI coverage to over 80% and integrating E2E test coverage reporting with Codecov. The changes stabilize previously failing tests (RegionAuthoringPanel and EventLog) that had fallen out of sync with UI changes, add new unit tests for audio notifications in SettingsPanel, and introduce Playwright instrumentation to capture and upload E2E coverage.

Key changes:

  • Stabilized existing Vitest test suites and added new audio notification test coverage
  • Integrated vite-plugin-istanbul for E2E test instrumentation via environment variables
  • Added scripts and CI workflow updates to merge and upload E2E coverage to Codecov

Reviewed Changes

Copilot reviewed 15 out of 17 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
vite.config.ts Added Istanbul plugin for E2E coverage instrumentation when VITE_E2E_COVERAGE=1
tsconfig.json Added "node" types to support Node.js APIs in scripts
tests/settingspanel.vitest.tsx Added comprehensive tests for audio notification preferences (load, toggle, volume, test sounds)
tests/region-authoring-panel.vitest.tsx Fixed test to properly track added regions to avoid ID collision issues
tests/eventlog.vitest.tsx Completely rewrote tests to match new table-based EventLog UI with Name/Details columns
tests/e2e/helpers.ts Added coverage collection hook and EVENT_LABEL_MAP for new event labels
tests/e2e/05-monitor-execution.web.e2e.ts Updated event assertions to match new user-friendly labels
src/components/RegionAuthoringPanel.tsx Refactored to use stable counter-based ID generation instead of timestamp-only IDs
src/components/EventLog.tsx Added aria-label accessibility attributes to expand/collapse button
scripts/mergeE2eCoverage.js New script to merge raw E2E coverage JSON files into lcov format
scripts/cleanE2eCoverage.js New script to prepare E2E coverage directory before test runs
playwright.config.ts Passed VITE_E2E_COVERAGE env var to webServer for instrumentation
package.json Added cross-env, istanbul libraries, vite-plugin-istanbul, @types/node, and test:e2e:cov script
.github/workflows/build-and-test.yaml Added Playwright browser installation and E2E coverage collection to CI
doc/developer.md Documented new test:e2e:cov command
PLANS.md Added task tracking for coverage uplift work
.gitignore Excluded coverage-e2e directory from version control

Issue: E2E tests failing with 'Cannot find package vite-plugin-istanbul'
Root cause: Package listed in devDependencies but not installed in node_modules

Changes:
- Run 'bun install' to install missing dependencies including vite-plugin-istanbul
- Add 'test:ui' script for running unit tests without coverage
- Add 'test:all' script that runs both unit tests (vitest) and E2E tests (playwright)

Test results:
- Unit tests: 28 files, 239 tests passed ✅
- E2E tests: 65 passed, 5 skipped ✅
- test:all successfully runs both test suites sequentially
Issue 3 was marked as 'needs documentation' after investigation showed
OCR requires specific configuration to work.

Changes:
- Updated doc/userManual.md with detailed OCR setup instructions
- Clarified that 'None' is now the default OCR mode (Issue 10)
- Added example JSON configuration with all required fields
- Explained difference between Local (Tesseract) and Vision (GPT-4) modes
- Added step-by-step requirements checklist
- Updated tenIssuesProgress.md to mark Issue 3 complete

OCR configuration requirements:
1. Set ocr_mode to 'local' or 'vision' (not 'none')
2. Define at least one region and add to ocr_region_ids
3. Configure success_keywords, failure_keywords, or ocr_termination_pattern
4. OCR runs during termination checks, results logged to stdout

Status: 8/10 issues complete (up from 7/10)
…onConditionsEditor, RegionAuthoringPanel

- ActionRecorder: 0% → 98.93% (21 new tests covering all handlers, state, coordinate transforms)
- TerminationConditionsEditor: 65% → 100% (8 new tests for OCR modes, timeouts, region cleanup)
- RegionAuthoringPanel: 76% → 90% (5 new tests for redefine, duplicate validation, edge cases)
- Overall coverage: 78.28% → 92.56% statements (target: 90%+)

Tests cover:
- Click and text input recording with buffering
- Keyboard event handling and special keys
- OCR mode selection (none/local/vision)
- Failure/success keyword configuration
- Action/heartbeat timeout settings
- Region redefine workflow
- Duplicate ID/name prevention
- Empty region handling
Coverage improved from 78.28% to 92.56% statements (exceeds 90% target):
- ActionRecorder: 0% → 98.93% (21 tests)
- TerminationConditionsEditor: 65% → 100% (8 new tests)
- RegionAuthoringPanel: 76% → 90% (5 new tests)
- Verified stable across 3 consecutive runs (273 tests passing)

Task complete: Issue 3 (OCR docs) + 90%+ coverage verified
Detailed summary of coverage improvements:
- Overall metrics (before/after for all coverage types)
- Component-specific improvements with test counts
- Test implementation details for all 34 new tests
- Verification results (3 consecutive stable runs)
- Testing strategy and architecture alignment
- Follow-up opportunities for further improvement
- Added missing newlines at the end of files in package.json and App.css.
- Improved formatting in EventLog.tsx for better readability.
- Standardized spacing and indentation in RegionAuthoringPanel.tsx.
- Refactored tests in actionrecorder.vitest.tsx for clarity and consistency.
- Updated e2e tests for UI refinements to enhance readability.
- Adjusted spacing in region-authoring-panel.vitest.tsx to maintain consistency.
- Cleaned up whitespace in termination-conditions-editor.vitest.tsx for better code quality.
- Vitest: 75% of CPU cores (6 workers on 8-core machine)
- Playwright: 75% of CPU cores for web tests, sequential for Tauri tests
- Configure via VITEST_MAX_WORKERS and PLAYWRIGHT_WORKERS env vars
- CI defaults: 2 workers for stability

Performance improvement:
- Unit tests: ~11-13s (was ~18s sequential, 35-40% faster)
- E2E tests: ~36-46s with parallel web tests
- Total: ~47-58s for full suite (273 unit + 65 E2E tests)

Verified stable across 3 consecutive runs:
- Run 1: 29 files/273 tests (11.12s) + 65 E2E (36.3s) ✓
- Run 2: 29 files/273 tests (10.78s) + 65 E2E (41.1s) ✓
- Run 3: 29 files/273 tests (12.90s) + 65 E2E (45.7s) ✓
- Corrected default parallelism: 75% of CPU cores (not 50%)
- Added actual measured timings from 3 consecutive runs
- Removed references to non-existent test:all:fast script
- Updated CI default: 2 workers (not 1) for better stability
- Performance: ~28-35% faster than sequential baseline
Fixed issues:
1. YAML syntax error: incorrect indentation in build-and-test.yaml
   - All steps after 'Checkout' had wrong indentation (8 spaces instead of 6)
   - This caused workflow parsing to fail on line 32

2. Duplicate CI builds on PR branches:
   - Changed push trigger from '**' (all branches) to 'main' only
   - PRs will now trigger CI once via pull_request event
   - Pushes to main will trigger CI via push event
   - This prevents 3x builds: push to branch + PR open + PR update

Result: Single CI run per PR commit, valid workflow YAML
@codecov
Copy link

codecov bot commented Nov 21, 2025

Codecov Report

❌ Patch coverage is 84.61538% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 61.64%. Comparing base (aa0f9e5) to head (f21c8b1).
⚠️ Report is 30 commits behind head on main.

Files with missing lines Patch % Lines
src/components/RegionAuthoringPanel.tsx 81.81% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main      #14      +/-   ##
==========================================
+ Coverage   60.90%   61.64%   +0.74%     
==========================================
  Files          15       47      +32     
  Lines        4041     6404    +2363     
  Branches        0      824     +824     
==========================================
+ Hits         2461     3948    +1487     
- Misses       1580     2312     +732     
- Partials        0      144     +144     

☔ 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.

chrisgleissner and others added 6 commits November 21, 2025 13:20
The CI container only has Bun installed (not npm/npx), so 'npx playwright install'
was failing with 'command not found'. Changed to 'bunx playwright install' to use
Bun's equivalent command.

Audited all workflows and confirmed:
- No other npx/npm/yarn references exist
- All test commands correctly use 'bun run'
- All other Bun commands are properly formatted
- YAML syntax valid across all 5 workflow files
The CI Docker container doesn't have Node.js installed (only Bun), so the
test:e2e:cov script was failing when trying to run 'node ./scripts/cleanE2eCoverage.js'
and 'node ./scripts/mergeE2eCoverage.js'.

Changed to 'bun ./scripts/*.js' which works identically since:
- Bun fully supports Node.js APIs (node:fs, node:path, etc.)
- Both scripts use only standard Node APIs
- Tested locally and confirmed both scripts work with Bun

This ensures E2E coverage collection works in CI.
Documents the investigation and fixes for CI build failures:
- npx → bunx fix for Playwright browser installation
- node → bun fix for E2E coverage scripts
- Comprehensive audit of all 5 workflow files
- Verification that no other command/dependency issues exist
- Testing results for both fixes
The test suite was hanging indefinitely when starting due to the webServer
env configuration always setting VITE_E2E_COVERAGE to an empty string when
undefined. This caused Playwright's web server launcher to behave differently
than expected.

Root cause: Setting env var to empty string ('') is different from not setting
it at all in process environment inheritance.

Solution: Only include the env block when VITE_E2E_COVERAGE is actually defined,
using spread operator with conditional evaluation.

Before: env: { VITE_E2E_COVERAGE: process.env.VITE_E2E_COVERAGE || '' }
After: ...(process.env.VITE_E2E_COVERAGE && { env: { VITE_E2E_COVERAGE: ... } })

This matches the behavior in main branch which had no env block at all.
Copy link
Contributor

Copilot AI commented Nov 21, 2025

@chrisgleissner I've opened a new pull request, #15, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 4 commits November 21, 2025 16:45
Co-authored-by: chrisgleissner <3969147+chrisgleissner@users.noreply.github.com>
Added both GitHub Actions step-level timeout (timeout-minutes) and shell-level
timeout (timeout command) to prevent test steps from hanging indefinitely in CI.

- UI tests: 5 minute timeout (typically complete in ~15s)
- E2E tests: 10 minute timeout (typically complete in ~45s)

This will force failing/hung runs to terminate rather than hanging for 6+ hours.
The existing '|| true' flag ensures timeouts don't fail the build.

Previous runs hung for 4.5+ hours and could not be cancelled via UI or CLI.
Root cause: CI was configured to use 2 workers with fullyParallel: true,
causing resource contention and hangs when starting the web server with
coverage instrumentation.

Changes:
- CI workers: 2 → 1 (matches main branch behavior)

CI logs showed hang immediately after '[coverage] prepared' message,
which is when Playwright starts the web server and attempts to run tests
in parallel. Single worker + sequential execution eliminates this race condition.

Local development still benefits from parallelism (75% of CPU cores).
@chrisgleissner chrisgleissner merged commit ffdc32c into main Nov 21, 2025
6 checks passed
@chrisgleissner chrisgleissner deleted the cursor/boost-code-coverage-and-integrate-e2e-tests-a547 branch November 21, 2025 20:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants