Skip to content

fix: restore lightspeed UI tests #2722

Closed
resoluteCoder wants to merge 5 commits into
ansible:mainfrom
resoluteCoder:AAP-67210
Closed

fix: restore lightspeed UI tests #2722
resoluteCoder wants to merge 5 commits into
ansible:mainfrom
resoluteCoder:AAP-67210

Conversation

@resoluteCoder
Copy link
Copy Markdown

@resoluteCoder resoluteCoder commented Apr 8, 2026

UI Test Changes — AAP-67210

Overview

Restored 13 of 14 skipped lightspeed UI tests. 1 remains skipped (test_vscode_widget — requires Copilot in test container).

Common changes across all tests

  • Removed @pytest.mark.skip(reason="See https://redhat.atlassian.net/browse/AAP-67210")
  • Removed close_editors fixture from web portal tests (test_81) — they never open VSCode editors, so the fixture added ~2 min overhead navigating to code-server unnecessarily.

ui_fixtures.py

  • browser_setup: Changed from scope="session" to scope="module" — isolates SSO cookies between test files. Without this, test_81 (web portal login tests) fails because test_80 leaves SSO cookies from the VSCode device login flow.

test_80_lightspeed.py

  • test_vscode_widget: Still skipped — requires Copilot extension for multi-provider widget test. Need guidance.
  • test_vscode_playbook_explanation: Removed skip and close_editors.
  • test_vscode_playbook_generation: Removed skip and close_editors.
  • test_vscode_role_generation: Removed skip and close_editors.
  • test_vscode_lightspeed_explorer: Removed skip and close_editors. Updated for redesigned sidebar:
    • Old UI had vscode-button elements and "Logged in as:" text in a webview.
    • New UI has tree item links ("Generate Playbook", "Explain Playbook", "Generate Role", "Explain Role").
    • Added Accounts menu check (click //a[@aria-label='Accounts'], verify "lightspeed-test-user" appears) to replace removed "Logged in as:" assertion.
  • vscode_login_wrapper: Changed to use device_login=True.

test_81_login.py

  • test_unsubed_login, test_unsubed_admin_login, test_no_wca_user_login: Removed skip and close_editors.
  • test_no_wca_admin_login, test_login_page, test_admin_portal_error: Removed skip.
  • test_sso_auth_flow: Removed skip. Changed expected button text from "Log in with Ansible Automation Platform" to "Log in with Red Hat" to match current staging UI.
  • test_vscode_rhsso_auth_flow: Removed skip. Added device_login=True. Removed dead commented-out code.

test_82_lightspeed_trial.py

  • test_vscode_trial_button: Removed skip and close_editors. Added device_login=True to vscode_login() call.

ui_utils.py

  • vscode_connect(): Simplified to device login only. Removed user_menu param and sidebar Connect button branch — both relied on UI that no longer exists. Only OAuth2 Device Flow path remains. Changed device_login default to True.
  • vscode_login(): Changed device_login default to True.
  • vscode_run_command_f1(): Uses F1 keyboard shortcut to open the command palette instead of clicking the command center UI element (action-item command-center-center), which broke in newer VSCode versions. Also fixed palette matching — was matching wrong commands because Enter fired before filtering completed. Now finds and clicks the correct item in the dropdown list. Falls back to Enter if not found.
  • vscode_explanation(): Replaced right-click context menu with vscode_run_command_f1.
  • vscode_playbook_generation(), vscode_role_generation(), vscode_trial_button(): Switched from vscode_run_command to vscode_run_command_f1.
  • sso_auth_flow(): Added credential selection based on no_sub, no_wca, admin_login flags. Previously always used LIGHTSPEED_USER/LIGHTSPEED_PASSWORD. Now uses env vars: NO_SUB_USER, NO_SUB_PASSWORD, NO_SUB_ADMIN, NO_WCA_USER, NO_WCA_PASSWORD, NO_WCA_ADMIN.
  • redhat_logout(): Added click for SSO logout confirmation page.

Testing

Ran all 13 restored tests 5 consecutive times locally — all passed every run. This was done to verify stability since the original tests were marked as broken/skipped and flakiness was a concern.


Open discussion

  • vscode_run_command_f1 vs vscode_run_command: The new vscode_run_command_f1 uses the F1 shortcut instead of clicking the command center UI element. This was needed because the command center XPath broke across VSCode versions. F1 is a more future-proof approach since it's a stable keyboard shortcut. Worth discussing whether to migrate vscode_run_command callers over to the F1 approach or keep both.
  • test_vscode_widget: Still skipped — requires Copilot to be installed in the test container alongside Lightspeed to test multi-provider suggestion widget behavior. Need team input on whether this test is still relevant or should be removed.
  • New env vars for credentials: The original sso_auth_flow() accepted no_sub, no_wca, and admin_login params but ignored them — it always used LIGHTSPEED_USER/LIGHTSPEED_PASSWORD. Since these tests were always skipped, this was never caught. We added separate env vars (NO_SUB_*, NO_WCA_*) so each test scenario uses the correct account. CI currently only provides LIGHTSPEED_USER, LIGHTSPEED_PASSWORD, and LIGHTSPEED_API_ENDPOINT — the new vars need to be added to CI secrets.

This PR restores 13 previously skipped Lightspeed UI tests by removing pytest skip decorators and updating test utilities. Changes include reducing browser_setup scope from session to module for SSO cookie isolation, defaulting device login for VS Code flows, consolidating to F1-based command palette interactions, and removing SaaS-related tests.

  • Updated browser_setup fixture scope from session to module to isolate SSO cookies between test modules
  • Removed @pytest.mark.skip from test_sso_auth_flow, test_admin_portal_error, and test_vscode_rhsso_auth_flow in test_81_login.py
  • Removed four SaaS-related login tests (test_unsubed_login, test_unsubed_admin_login, test_no_wca_user_login, test_no_wca_admin_login)
  • Removed test_82_lightspeed_trial.py file entirely
  • Updated vscode_login() to default device_login=True and removed **kwargs passthrough
  • Simplified vscode_connect() to always use F1-based command palette path and default device_login=True
  • Simplified sso_auth_flow() by removing optional admin_login, no_wca, and no_sub parameters
  • Added vscode_run_command_f1() helper for F1-based command palette interactions with fallback support
  • Replaced vscode_run_command() calls with vscode_run_command_f1() in test_80_lightspeed.py and ui_utils.py
  • Updated redhat_logout() to handle SSO logout confirmation click
  • Removed vscode_trial_button() helper function
  • Updated UI element selectors in test_vscode_lightspeed_explorer for redesigned Lightspeed sidebar buttons
  • Added explicit Accounts menu interaction and login validation in test_vscode_lightspeed_explorer
  • Updated SSO "login" button target from "Log in with Ansible Automation Platform" to "Log in with Red Hat"

related: AAP-67210

@hasys
Copy link
Copy Markdown
Contributor

hasys commented Apr 8, 2026

Thank you @resoluteCoder, great job on:

  • Fixing SSO cookie isolation with browser_setup scope change
  • Removing dead code and consolidating to device_login flow
  • 5 consecutive successful local test runs shows good validation
  • Well-documented PR with clear explanation of changes

Answers on your questions:
vscode_run_command_f1 vs vscode_run_command: The F1 approach looks more robust since it doesn't depend on UI element selectors that break across VS Code versions. The macOS tests are passing, which validates this approach works cross-platform. I support migrating all calls to vscode_run_command_f1 for consistency and stability.

test_vscode_widget: if we do not have Copilot subscription, I think we should remove multi-provider suggestion test for now and keep it in the git history if we need it later.

@goneri, @omaciel, @ssbarnea we don't have the Copilot subscription for tests, right?

New env vars for credentials: Looks like those tests do not tests the VS Code Ansible Plugin, but SaaS web page. We have stage/prod tests running every x hours on our side, I think those tests/credentials mentioning should be removed from the VS Code plugin test suite entirely.

@resoluteCoder
Copy link
Copy Markdown
Author

resoluteCoder commented Apr 9, 2026

@hasys I agree with removing the copilot test and migrating to f1 shortcut.

Should we do the f1 migration in another PR? Last I checked there were many other places that used the base run command.

@resoluteCoder
Copy link
Copy Markdown
Author

@hasys

To confirm — when you say remove the tests/credentials, does that include removing the _get_sso_credentials() helper, the no_sub/no_wca/admin_login params from sso_auth_flow(), and the NO_SUB_*/NO_WCA_* env var declarations in ui_utils.py? Or just the test functions themselves?

@hasys
Copy link
Copy Markdown
Contributor

hasys commented Apr 9, 2026

Should we do the f1 migration in another PR? Last I checked there were many other places that used the base run command.

Up to you, depending on the amount of work required.

To confirm — when you say remove the tests/credentials, does that include removing the get_sso_credentials() helper, the no_sub/no_wca/admin_login params from sso_auth_flow(), and the NO_SUB/NO_WCA_ env var declarations in ui_utils.py? Or just the test functions themselves?

My understanding of those tests - only regular user actually used to test the VS Code Plugin functionality, other users were testing the Lightspeed WEB UI/access, not the plugin itself. That's why they weren't active (probably test cases were just copied together with other tests from SaaS testing). So the goal is to reflect the reality, since only regular user is used to test the functional of VS Code, remove all others users and their mentions.

@resoluteCoder
Copy link
Copy Markdown
Author

@hasys

Alright sounds good. I'll make another PR for the f1 migration

I also removed the 4 SaaS related web portal login tests (unsubed/no_wca variants), the trial test, and the multi-provider widget test along with their associated credentials and helpers.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 10, 2026

📝 Walkthrough

Walkthrough

VSCode UI test suite refactored to consolidate authentication approaches and streamline command execution patterns. Fixture scope modified, test utilities simplified with updated signatures, login/SSO flows updated, and obsolete trial-related tests removed across five test files.

Changes

Cohort / File(s) Summary
Test Fixture Configuration
test/ui/fixtures/ui_fixtures.py
Changed browser_setup fixture scope from session to module, creating a new browser instance per test module instead of per session.
VSCode Integration & Auth Tests
test/ui/test_80_lightspeed.py, test/ui/test_81_login.py
Modified VSCode login/command execution to use F1-based palette approach; removed test_vscode_widget and four skipped login tests; unskipped three existing tests; updated SSO login target assertion and added Accounts menu interaction; updated UI selectors for Lightspeed explorer buttons.
UI Utilities Refactoring
test/ui/utils/ui_utils.py
Simplified sso_auth_flow, vscode_login, and vscode_connect function signatures by removing optional kwargs and conditional parameters; updated default device_login to True; added vscode_run_command_f1 helper for F1-palette command execution; replaced existing command calls to use new F1 approach; enhanced logout flow to handle SSO confirmation; removed vscode_trial_button.
Removed Test Module
test/ui/test_82_lightspeed_trial.py
Deleted entire module containing skipped trial button test and associated playbook payload constant.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Poem

🐰 Hopping through tests with focused aim,
We've trimmed the fat and changed the game,
F1 commands now lead the way,
While trial buttons fade to gray,
Simpler flows, cleaner sight—
The VSCode tests take flight! ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'fix: restore lightspeed UI tests' accurately summarizes the main objective: restoring previously skipped Lightspeed UI tests, plus related fixture and utility updates.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

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 (3)
test/ui/utils/ui_utils.py (2)

322-339: Consider removing the unused device_login parameter.

The device_login parameter is documented as "kept for compatibility" but is never used in the function body. Since vscode_connect now always uses the F1 command palette approach regardless of this parameter, consider removing it entirely in a follow-up to avoid confusion about its effect.

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

In `@test/ui/utils/ui_utils.py` around lines 322 - 339, The function vscode_login
has an unused parameter device_login which is documented as "kept for
compatibility" but never referenced; remove the device_login parameter from the
vscode_login signature and docstring, update any callers to stop passing that
argument (or keep backward-compatible forwarding in callers), and ensure the
flow still calls vscode_connect and sso_auth_flow and switches back to the main
window as implemented; reference the vscode_login function and related
vscode_connect and sso_auth_flow symbols when making the change.

718-718: Remove the unused POSITION_OF_ANSIBLE_EXPLAIN constant and related comment block.

The constant at line 33 and associated comment (lines 721-725) are no longer needed since the F1 command palette approach doesn't rely on counting DOWN key presses.

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

In `@test/ui/utils/ui_utils.py` at line 718, Remove the now-unused
POSITION_OF_ANSIBLE_EXPLAIN constant and its associated comment block (the
explanatory lines about counting DOWN key presses) from the module; search for
any references to POSITION_OF_ANSIBLE_EXPLAIN and delete or refactor them
(likely near the vscode_run_command_f1 usage) so nothing depends on that
constant, and run the tests to ensure no remaining references or docstrings
break.
test/ui/test_80_lightspeed.py (1)

117-125: Hardcoded username may be fragile.

The check for 'lightspeed-test-user' at line 123 is hardcoded. If the test credentials change, this assertion will fail. Consider deriving this from the LIGHTSPEED_USER environment variable used elsewhere:

💡 Suggested improvement
+import os
+
+LIGHTSPEED_USER = os.environ.get("LIGHTSPEED_USER", "")
+
 # In test_vscode_lightspeed_explorer:
     wait_displayed(
         driver,
-        "//*[contains(normalize-space(.), 'lightspeed-test-user')]",
+        f"//*[contains(normalize-space(.), '{LIGHTSPEED_USER}')]",
         timeout=5,
     )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/ui/test_80_lightspeed.py` around lines 117 - 125, The test is asserting
a hardcoded username string 'lightspeed-test-user' which is brittle; update the
assertion in the block using wait_displayed (after accounts_button.click()) to
derive the expected username from the LIGHTSPEED_USER environment variable
instead of the literal. Specifically, change the locator argument passed to
wait_displayed used in this test (the one that currently contains
"lightspeed-test-user") to use os.environ.get('LIGHTSPEED_USER') (or the
existing config accessor used elsewhere in tests), provide a sensible fallback
if necessary, and ensure the string is normalized to match the existing
XPath/normalize-space check so wait_displayed(driver,
"//*[contains(normalize-space(.), '{expected_username}')]") continues to work;
keep the rest of the flow (vscode_run_command_f1, accounts_button click)
unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@test/ui/test_80_lightspeed.py`:
- Around line 117-125: The test is asserting a hardcoded username string
'lightspeed-test-user' which is brittle; update the assertion in the block using
wait_displayed (after accounts_button.click()) to derive the expected username
from the LIGHTSPEED_USER environment variable instead of the literal.
Specifically, change the locator argument passed to wait_displayed used in this
test (the one that currently contains "lightspeed-test-user") to use
os.environ.get('LIGHTSPEED_USER') (or the existing config accessor used
elsewhere in tests), provide a sensible fallback if necessary, and ensure the
string is normalized to match the existing XPath/normalize-space check so
wait_displayed(driver, "//*[contains(normalize-space(.),
'{expected_username}')]") continues to work; keep the rest of the flow
(vscode_run_command_f1, accounts_button click) unchanged.

In `@test/ui/utils/ui_utils.py`:
- Around line 322-339: The function vscode_login has an unused parameter
device_login which is documented as "kept for compatibility" but never
referenced; remove the device_login parameter from the vscode_login signature
and docstring, update any callers to stop passing that argument (or keep
backward-compatible forwarding in callers), and ensure the flow still calls
vscode_connect and sso_auth_flow and switches back to the main window as
implemented; reference the vscode_login function and related vscode_connect and
sso_auth_flow symbols when making the change.
- Line 718: Remove the now-unused POSITION_OF_ANSIBLE_EXPLAIN constant and its
associated comment block (the explanatory lines about counting DOWN key presses)
from the module; search for any references to POSITION_OF_ANSIBLE_EXPLAIN and
delete or refactor them (likely near the vscode_run_command_f1 usage) so nothing
depends on that constant, and run the tests to ensure no remaining references or
docstrings break.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 7e56cdfe-5b39-4e09-852d-71256e66d15d

📥 Commits

Reviewing files that changed from the base of the PR and between be402d0 and 82682be.

📒 Files selected for processing (5)
  • test/ui/fixtures/ui_fixtures.py
  • test/ui/test_80_lightspeed.py
  • test/ui/test_81_login.py
  • test/ui/test_82_lightspeed_trial.py
  • test/ui/utils/ui_utils.py
💤 Files with no reviewable changes (1)
  • test/ui/test_82_lightspeed_trial.py

@resoluteCoder resoluteCoder requested a review from ssbarnea April 13, 2026 15:42
Copy link
Copy Markdown
Contributor

@hasys hasys left a comment

Choose a reason for hiding this comment

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

Looks good to me now, thank you @resoluteCoder

@resoluteCoder
Copy link
Copy Markdown
Author

Just a heads up on the ci/test (linux) failed test. I'm seeing those failures on current PRs as well as ones that have been merged. Not sure what's going on there 🤷

rockygeekz pushed a commit to rockygeekz/vscode-ansible that referenced this pull request Apr 17, 2026
## Summary

- **Remove the entire Python/Selenium UI test suite** (`test/ui/`,
`docker-compose.yml`, Selenium/Podman Python deps) — eliminates the
fragile `selenium-vscode` container, brittle XPath selectors, and DOM
mismatches between `code-server` and desktop VS Code.
- **Add a WebDriverIO test suite** (`test/wdio/`, `wdio.conf.ts`) using
`wdio-vscode-service`, which tests against real VS Code Electron. 30
tests across 7 spec files: smoke, commands, terminal, sidebar, webviews
(devfile, devcontainer, welcome page, LLM provider settings), MCP server
toggle, and Lightspeed (backed by an Express mock server with injected
auth session).
- **Dedicated CI runner** — WDIO tests run on their own `test
(linux-wdio)` matrix entry, independent of unit/e2e. No more cascading
failures from unrelated e2e issues blocking UI tests.
- **Update CI** (`ci.yaml`, `Taskfile.yml`) to run `task wdio` under
`xvfb-run` instead of the Selenium container, removing the Podman
dependency from Linux CI.
- **Add onboarding docs** — Cursor skill
(`.cursor/skills/wdio-testing/`) with architecture, patterns, and
gotchas; updated `test/README.md` and `docs/development/test_code.md`.

## Why

All 29 Selenium tests on `main` are currently **skipped** — zero tests
actually execute:

| File | Tests | Status | Skip Reason |
|------|-------|--------|-------------|
| `test_00_commands.py` | 2 | All skipped | Flaky on CI - extension
activation timing |
| `test_01_dev_webviews.py` | 2 | All skipped | Flaky on CI - extension
activation timing |
| `test_02_welcome_webviews.py` | 3 | All skipped | Flaky on CI -
extension activation timing |
| `test_03_llm_provider_webview.py` | 4 | All skipped | Flaky on CI -
extension activation timing |
| `test_50_mcp_server.py` | 4 | All skipped | Flaky on CI - extension
activation timing |
| `test_80_lightspeed.py` | 5 | All skipped | AAP-67210 |
| `test_81_login.py` | 8 | All skipped | AAP-67210 |
| `test_82_lightspeed_trial.py` | 1 | All skipped | AAP-67210 |
| **Total** | **29** | **0 running** | |

The Selenium suite had a **100% CI failure rate** for the last two weeks
on `main` (W15-W16) before the tests were skipped, and an accelerating
failure rate before that (5% → 16% → 38% → 100% over 8 weeks). Root
causes: `code-server` DOM divergence from real VS Code, fragile XPath
selectors, deeply nested iframe traversal, and container startup timing.
See [full
analysis](https://gist.github.com/cidrblock/eaa433824950742554bee78d217e3772).

WDIO with `wdio-vscode-service` provides stable Page Objects against the
real VS Code Electron shell, `browser.executeWorkbench()` for direct
access to the VS Code API, and zero container overhead.

## AAP-67210 Coverage

The 14 Lightspeed/SSO tests tracked by
[AAP-67210](https://redhat.atlassian.net/browse/AAP-67210) were all
skipped in Selenium. WDIO restores coverage for 5 of them using a mock
server approach, and adds 2 new tests (error/timeout handling) that
never existed:

| AAP-67210 Selenium Test | WDIO Status | WDIO Test |
|---|---|---|
| `test_vscode_widget` | **Covered** | `should have Lightspeed commands
registered` |
| `test_vscode_playbook_explanation` | **Covered** | `should open
playbook explanation webview` |
| `test_vscode_playbook_generation` | **Covered** | `should open
playbook generation webview` |
| `test_vscode_role_generation` | **Covered** | `should open role
generation webview` |
| `test_vscode_lightspeed_explorer` | **Partial** | Explorer view
covered via sidebar tests |
| `test_vscode_trial_button` | Deferred | Excluded from initial PR |
| `test_unsubed_login` | N/A | SSO flow — tests RH infra, not extension
|
| `test_unsubed_admin_login` | N/A | SSO flow |
| `test_no_wca_user_login` | N/A | SSO flow |
| `test_no_wca_admin_login` | N/A | SSO flow |
| `test_login_page` | N/A | SSO flow |
| `test_sso_auth_flow` | N/A | SSO flow |
| `test_admin_portal_error` | N/A | SSO flow |
| `test_vscode_rhsso_auth_flow` | N/A | SSO flow |

The 8 SSO login tests exercise Red Hat SSO infrastructure (external
OAuth pages), not extension code. They require live SSO credentials and
a running Lightspeed backend, which is why they were never functional in
CI.

## CI architecture

```
Before:
  test (linux) → task unit → task e2e → task ui (selenium, blocked by e2e)

After:
  test (linux)      → task unit → task e2e
  test (linux-wdio) → task build → task wdio    ← independent runner
```

The WDIO job skips `task package` (no `.vsix` needed) and runs only
`task build` → `task wdio`. Either job can be re-run independently.

## Test coverage comparison

| Area | Selenium (before) | WDIO (after) |
|---|---|---|
| Smoke / activation | implicit | 5 explicit tests |
| Commands | 1 (create playbook) | 1 (create playbook) |
| Terminal | 1 (flaky, DOM scraping) | 2 (execSync + API) |
| Webviews | 4 (devfile, devcontainer, welcome, LLM) | 9 (deeper
assertions) |
| MCP Server | 2 | 4 (enable/disable/settings/list) |
| Sidebar | 0 | 3 (view, welcome link, settings) |
| Lightspeed | 0 (all skipped/SSO-gated) | 6 (mock server: explain,
generate, role, commands, errors, timeout) |
| **Total** | **0 active (29 skipped)** | **30 (all passing)** |

## Extension source changes

- `src/extension.ts`: registers `ansible.lightspeed.mockSession` command
(gated to `ExtensionMode.Development`/`Test` only — not available in
production)
- `src/features/lightspeed/lightSpeedOAuthProvider.ts`: adds
`setMockSession()` to inject fake auth sessions

## Test plan

- [x] `task wdio` passes locally under `xvfb-run`
- [x] CI `test (linux-wdio)` job passes
- [x] `task lint` passes
- [x] `task unit` / `task e2e` unaffected on `test (linux)`
- [x] No Selenium/Podman references remain in CI or Taskfile

Closes: ansible#2722
Closes: ansible#2743
Closes: ansible#2720
Closes: ansible#2752
related: AAP-67210
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

3 participants