Skip to content

[issues/510] Add manual QA environments (Ubuntu Docker, Cursor) and BATS tests for QA scripts#602

Merged
couimet merged 2 commits into
mainfrom
issues/510
May 26, 2026
Merged

[issues/510] Add manual QA environments (Ubuntu Docker, Cursor) and BATS tests for QA scripts#602
couimet merged 2 commits into
mainfrom
issues/510

Conversation

@couimet
Copy link
Copy Markdown
Owner

@couimet couimet commented May 25, 2026

Summary

Adds discoverable manual QA environments for platform-specific and IDE-specific test cases. Ubuntu TCs now have a Docker-based desktop environment with VS Code pre-configured. Cursor TCs get a guide file with copy-pasteable commands. Adds 808 lines of BATS tests achieving full branch coverage on resolve-qa-labels.js, the QA label resolution engine used by all QA scripts.

Changes

  • Ubuntu Docker QA: Dockerfile (Ubuntu 24.04 + XFCE + VS Code), entrypoint that generates TC checklist, builds extension, and launches noVNC desktop at localhost:6080
  • Cursor QA: guide file written to fixture workspace root with TC IDs, scenarios, and commands for assisted TCs
  • npm scripts: test:release:ubuntu, test:release:cursor for discoverable access to both environments
  • BATS tests: 129 tests (808 lines) covering all branches of resolve-qa-labels.js — argument parsing, YAML auto-discovery, parsing, JSON grouping, filtering, and output formats
  • .vscodeignore cleanup: excludes qa/, test-fixtures/, dev docs, temp files, and Docker artifacts from .vsix (was shipping 4MB+ of test data)
  • Docker volume for node_modules: isolates Linux-native binaries from host macOS install

Test Plan

  • All 1979 unit tests pass
  • All 129 BATS tests pass
  • Manual: pnpm test:release:ubuntu builds and launches Ubuntu desktop with extension installed
  • Manual: pnpm test:release:cursor prints guide and launches Cursor with fixture workspace
  • Manual: pnpm test:release:grep <id> works inside Ubuntu container

Related

Summary by CodeRabbit

  • Tests

    • Added comprehensive CLI QA suite for QA-label resolution, plus assisted integration tests for Copilot Chat and clipboard scenarios.
    • Added Ubuntu Docker and Cursor manual QA flows, helpers, and test-case generation.
  • Documentation

    • Updated testing docs and quick-reference with Ubuntu/Cursor workflows and per-test automation-status annotations.
    • Extended test-case schema to include non-automatable reason.
  • Chores

    • Broadened ignore rules and publishing excludes; added release QA scripts and release-test npm scripts.

Review Change Stack

…ATS tests for QA scripts

## Summary

Adds discoverable manual QA environments for platform-specific and IDE-specific test cases. Ubuntu TCs now have a Docker-based desktop environment with VS Code pre-configured. Cursor TCs get a guide file with copy-pasteable commands. Adds 808 lines of BATS tests achieving full branch coverage on resolve-qa-labels.js, the QA label resolution engine used by all QA scripts.

## Changes

- Ubuntu Docker QA: Dockerfile (Ubuntu 24.04 + XFCE + VS Code), entrypoint that generates TC checklist, builds extension, and launches noVNC desktop at localhost:6080
- Cursor QA: guide file written to fixture workspace root with TC IDs, scenarios, and commands for assisted TCs
- npm scripts: test:release:ubuntu, test:release:cursor for discoverable access to both environments
- BATS tests: 129 tests (808 lines) covering all branches of resolve-qa-labels.js — argument parsing, YAML auto-discovery, parsing, JSON grouping, filtering, and output formats
- .vscodeignore cleanup: excludes qa/, test-fixtures/, dev docs, temp files, and Docker artifacts from .vsix (was shipping 4MB+ of test data)
- Docker volume for node_modules: isolates Linux-native binaries from host macOS install

## Test Plan

- [ ] All 1979 unit tests pass
- [ ] All 129 BATS tests pass
- [ ] Manual: `pnpm test:release:ubuntu` builds and launches Ubuntu desktop with extension installed
- [ ] Manual: `pnpm test:release:cursor` prints guide and launches Cursor with fixture workspace
- [ ] Manual: `pnpm test:release:grep <id>` works inside Ubuntu container

## Related

- Closes #510
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 25, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 5fcb7ba4-4dfb-4c0c-88a6-718804f597a9

📥 Commits

Reviewing files that changed from the base of the PR and between 5bc61f0 and 13fe948.

📒 Files selected for processing (2)
  • packages/rangelink-vscode-extension/docker/entrypoint.sh
  • packages/rangelink-vscode-extension/scripts/qa-ubuntu-docker.sh

Walkthrough

Adds a QA schema field non_automatable_reason, propagates it through QA tooling, converts four manual tests to automated: assisted with integration tests, and provides Cursor and Ubuntu manual QA tooling (scripts, Dockerfile, entrypoint) plus packaging/config updates.

Changes

QA Automation: Assisted Conversion & Non-Automatable Reasons

Layer / File(s) Summary
QA schema and test-case updates
packages/rangelink-vscode-extension/qa/qa-test-cases-v1.1.0.yaml
Adds non_automatable_reason to schema; annotates platform-/ide-specific permanent manual cases and converts four reclassifiable cases to automated: assisted; adds cursor labels.
QA resolver: parse and propagate nonAutomatableReason
packages/rangelink-vscode-extension/scripts/resolve-qa-labels.js
Parses non_automatable_reason into nonAutomatableReason, accumulates reasonCounts, and includes reasons and per-case reason fields in JSON output and cursor/ubuntu lists.
Resolver test suite (Bats)
tests/shell/resolve-qa-labels.bats
Adds comprehensive end-to-end tests for CLI args, YAML discovery/loading, parsing/grouping/totals/reasons, cursor/ubuntu extraction, filtering semantics, and output formats.
Integration tests: Copilot Chat & clipboard assisted
packages/rangelink-vscode-extension/src/__integration-tests__/suite/builtInAiAssistants.test.ts
Adds three assisted GitHub Copilot Chat tests (bind → send cold/warm) and one assisted clipboard-preservation test (two rapid sends to Claude Code) with log assertions and human verdicts.
Ubuntu Docker QA environment
packages/rangelink-vscode-extension/docker/Dockerfile.ubuntu, packages/rangelink-vscode-extension/docker/entrypoint.sh
New Ubuntu XFCE VNC container with VS Code/Node/pnpm; entrypoint generates QA checklist from resolver output, builds/packages and installs the extension, starts VNC/noVNC, and launches the QA fixture workspace.
QA launcher scripts: Cursor and Ubuntu
packages/rangelink-vscode-extension/scripts/qa-cursor.sh, packages/rangelink-vscode-extension/scripts/qa-ubuntu-docker.sh
Add qa-cursor.sh to generate a Cursor QA guide and launch Cursor against the fixture; add qa-ubuntu-docker.sh to build/run the Ubuntu QA container, print Ubuntu TCs, and manage rebuild logic.
Release QA generators and docs
packages/rangelink-vscode-extension/scripts/generate-qa-issue.sh, packages/rangelink-vscode-extension/scripts/generate-qa-test-plan.sh, packages/rangelink-vscode-extension/scripts/generate-release-testing-instructions.sh
Update QA issue generation to include Cursor/Ubuntu sections and per-test nonAutomatableReason annotations; document the new schema field and adjust release testing instructions to single-issue grouping and per-test annotations.
NPM scripts, ignores, and TESTING.md
package.json, packages/rangelink-vscode-extension/package.json, packages/rangelink-vscode-extension/.vscodeignore, .gitignore, packages/rangelink-vscode-extension/TESTING.md
Add test:release:cursor and test:release:ubuntu scripts; expand .vscodeignore and .gitignore to exclude QA/dev/Docker artifacts and generated QA outputs; extend TESTING.md with manual QA environment docs for Ubuntu and Cursor.

Sequence Diagram(s)

(omitted)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 I hopped through YAML and script,
Marked tests where humans must sit,
Built containers, guides to view,
Assisted checks and labels too —
QA carrots for a brighter kit.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main changes: adding manual QA environments (Ubuntu Docker and Cursor) plus BATS tests for QA scripts, matching the core deliverables of the PR.
Linked Issues check ✅ Passed The PR fully addresses all three required outputs from issue #510: (1) non_automatable_reason field added to YAML schema, (2) the 10 permanent automated:false TCs annotated with appropriate platform-specific/ide-specific reasons, and (3) four reclassifiable TCs promoted to automated:assisted with new integration tests.
Out of Scope Changes check ✅ Passed All changes are directly aligned with issue #510 objectives: QA YAML updates, schema documentation, integration tests, supporting scripts (resolve-qa-labels.js, qa-ubuntu.sh, qa-cursor.sh), npm scripts, Docker infrastructure, documentation, and vscodeignore cleanup. No unrelated or extraneous changes detected.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issues/510

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 25, 2026

⚠️ QA Coverage Gap Detected

New manual QA environments for Ubuntu and Cursor IDE-specific tests were introduced, requiring additional test cases.

Suggested test cases:

  • Ubuntu Keybindings: Verify Ctrl+R keybindings in Ubuntu environment (manual — Requires a specific Linux environment to test keybindings.)
  • Cursor IDE Integration: Verify Cursor-specific test cases in Cursor IDE (manual — Requires manual verification in Cursor IDE as it cannot be tested in a headless mode.)

Generated by QA Gap Check (GPT-4o-mini via GitHub Models)

@couimet couimet changed the title [issues/510] Add manual QA environments (Ubuntu Docker, Cursor) and B…\ATS tests for QA scripts [issues/510] Add manual QA environments (Ubuntu Docker, Cursor) and BATS tests for QA scripts May 25, 2026
Copy link
Copy Markdown
Contributor

@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: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/rangelink-vscode-extension/docker/entrypoint.sh`:
- Line 70: The extension install command currently swallows failures via "||
true" so the container can report ready even if the VSIX failed to install;
change the entrypoint logic around the "DISPLAY=:1 code --install-extension
\"$VSIX\"" invocation to let failures surface: run the install command without
"|| true", capture its exit status, log a descriptive error including "$VSIX"
and the install stderr, and exit non‑zero (e.g., exit 1) when the install fails
so the container fails fast and CI/QA see the problem.

In `@packages/rangelink-vscode-extension/scripts/qa-ubuntu-docker.sh`:
- Line 75: The Docker run/publish in the QA script currently exposes noVNC to
all interfaces via the "-p 6080:6080" mapping; change that mapping to bind to
loopback only (e.g., use "127.0.0.1:6080:6080" or the equivalent "--publish
127.0.0.1:6080:6080") in the script line containing "-p 6080:6080" so the VNC
web UI is only accessible from localhost.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 79a7b9d2-9bdf-483f-856f-c1d758f6af5f

📥 Commits

Reviewing files that changed from the base of the PR and between b565d54 and 5bc61f0.

📒 Files selected for processing (16)
  • .gitignore
  • package.json
  • packages/rangelink-vscode-extension/.vscodeignore
  • packages/rangelink-vscode-extension/TESTING.md
  • packages/rangelink-vscode-extension/docker/Dockerfile.ubuntu
  • packages/rangelink-vscode-extension/docker/entrypoint.sh
  • packages/rangelink-vscode-extension/package.json
  • packages/rangelink-vscode-extension/qa/qa-test-cases-v1.1.0.yaml
  • packages/rangelink-vscode-extension/scripts/generate-qa-issue.sh
  • packages/rangelink-vscode-extension/scripts/generate-qa-test-plan.sh
  • packages/rangelink-vscode-extension/scripts/generate-release-testing-instructions.sh
  • packages/rangelink-vscode-extension/scripts/qa-cursor.sh
  • packages/rangelink-vscode-extension/scripts/qa-ubuntu-docker.sh
  • packages/rangelink-vscode-extension/scripts/resolve-qa-labels.js
  • packages/rangelink-vscode-extension/src/__integration-tests__/suite/builtInAiAssistants.test.ts
  • tests/shell/resolve-qa-labels.bats

Comment thread packages/rangelink-vscode-extension/docker/entrypoint.sh Outdated
Comment thread packages/rangelink-vscode-extension/scripts/qa-ubuntu-docker.sh Outdated
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

…ilure detection

Bind noVNC port to 127.0.0.1 so the auth-less VNC desktop is not exposed to the local network.
Surface extension install failures in the entrypoint instead of swallowing them with || true.

Ref: #602 (review)
@github-actions
Copy link
Copy Markdown

✅ CI / Integration Tests (with extensions) — run summary

Duration 9m 34s
Unit tests Ran in Test & Validate job
Integration tests passing 160
QA TC IDs exercised clipboard-preservation-011, clipboard-preservation-012, custom-ai-assistant-003, claude-code-001, claude-code-006, claude-code-007, gemini-code-assist-001, gemini-code-assist-005, gemini-code-assist-006
Report View run & artifacts

@github-actions
Copy link
Copy Markdown

✅ CI / Test & Validate — run summary

Duration 10m 7s
Unit tests passed 1979 / 1979
Integration tests passing 151
QA TC IDs exercised status-bar-menu-002, status-bar-menu-003, status-bar-menu-005, status-bar-menu-006, bind-to-destination-010, bind-to-destination-013, terminal-picker-001, terminal-picker-002, terminal-picker-003, terminal-picker-004, terminal-picker-005, terminal-picker-007, terminal-picker-008, terminal-picker-011, terminal-picker-012, terminal-picker-013, terminal-picker-014, terminal-picker-015, terminal-picker-016, file-picker-001, file-picker-002, file-picker-003, file-picker-004, file-picker-005, file-picker-009, file-picker-011, file-picker-012, clipboard-preservation-001, clipboard-preservation-002, clipboard-preservation-003, clipboard-preservation-004, clipboard-preservation-005, clipboard-preservation-006, clipboard-preservation-007, clipboard-preservation-008, clipboard-preservation-009, clipboard-preservation-010, clipboard-preservation-013, clipboard-preservation-014, clipboard-preservation-015, clipboard-preservation-016, send-file-path-001, send-file-path-002, send-file-path-004, send-file-path-005, send-file-path-006, send-file-path-007, send-file-path-008, send-file-path-010, send-file-path-011, send-file-path-012, dirty-buffer-warning-004, dirty-buffer-warning-006, dirty-buffer-warning-007, dirty-buffer-warning-019, send-terminal-selection-003, send-terminal-selection-006, send-terminal-selection-007, go-to-link-001, unbind-001, unbind-003, unbind-004, editor-binding-validation-004, full-line-navigation-001, full-line-navigation-002, char-navigation-001, char-navigation-002, full-line-link-generation-001, wrapped-link-navigation-001, wrapped-link-navigation-002, wrapped-link-navigation-003, wrapped-link-navigation-004, markdown-link-navigation-001, url-exclusion-001, stale-viewcolumn-001, hidden-tab-paste-001, hidden-tab-paste-002, full-line-selection-validation-001, core-send-commands-r-l-001, core-send-commands-r-l-002, core-send-commands-r-l-003, core-send-commands-r-c-001, core-send-commands-r-l-004, core-send-commands-r-c-002, core-send-commands-r-l-005, core-send-commands-r-p-001, core-send-commands-r-v-001, clickable-file-paths-001, clickable-file-paths-002, clickable-file-paths-003, clickable-file-paths-004, clickable-file-paths-005, clickable-file-paths-006, clickable-file-paths-007, clickable-file-paths-008, clickable-file-paths-009, clickable-file-paths-010, clickable-file-paths-011, clickable-file-paths-012, smart-padding-001, smart-padding-003, smart-padding-005, smart-padding-006, smart-padding-007, smart-padding-008, smart-padding-011, duplicate-tab-group-001, duplicate-tab-group-002, duplicate-tab-group-003, duplicate-tab-group-004, langswitch-binding-001, langswitch-binding-002, navigation-clamping-001, navigation-clamping-002, navigation-clamping-003, navigation-clamping-004, untitled-navigation-001, untitled-navigation-002, untitled-navigation-003, untitled-navigation-004, untitled-navigation-005, untitled-navigation-006, navigation-toast-settings-001, navigation-toast-settings-002, navigation-toast-settings-003, filename-fallback-navigation-001, filename-fallback-navigation-002, filename-fallback-navigation-003, filename-fallback-navigation-004, custom-ai-assistant-001, custom-ai-assistant-002, custom-ai-assistant-004, custom-ai-assistant-005, custom-ai-assistant-006, custom-ai-assistant-007, custom-ai-assistant-008, custom-ai-assistant-009, custom-ai-assistant-010, custom-ai-assistant-011, custom-ai-assistant-012, custom-ai-assistant-013, custom-ai-assistant-014, custom-ai-assistant-015, custom-ai-assistant-016, custom-ai-assistant-017, github-copilot-chat-001, release-notifier-001, release-notifier-002, status-bar-appearance-001, status-bar-appearance-002
Report View run & artifacts

@couimet couimet merged commit b59abaf into main May 26, 2026
5 checks passed
@couimet couimet deleted the issues/510 branch May 26, 2026 11:16
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.

Triage truly manual TCs that cannot convert to assisted mode

1 participant