fix(e2e): make the chrome specs pass in a real browser - #767
Merged
Conversation
Three defects, all found by actually RUNNING the specs rather than
collecting them. Until now they had only ever been listed, which proves a
spec parses and nothing else.
1. The cn-nav-* testids are on the <li> WRAPPER. The clickable element and
the href both live on the <a class="app-navigation-entry-link"> inside
it, so clicking the li resolved the locator and then never became
actionable — a 30s timeout that reads like the navigation is broken —
and reading href off the li gave null.
2. On a FRESH instance the setup wizard modal opens over the app and
intercepts pointer events. Every nav click failed while every URL
navigation passed, which is exactly the shape that hides this: only the
click-through tests break, and only on a clean install.
3. A bare getByText('Open') matched the SVG <title>Opens in a new tab</title>
on an external-link icon — attached, hidden, unrelated. Single-word
probes are now scoped to the page body.
Verified against a throwaway Nextcloud (not the shared :8080, and not the
neighbouring sessions' containers): planninq 6/6 and keepiq 5/5 green.
Contributor
Quality Report — ConductionNL/hermiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 123/123 | |||
| npm | ✅ | ✅ 730/730 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ deferred — runs on the promotion into beta/main, not on a pull request into development | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-09-03 20:19 UTC
Download the full PDF report from the workflow artifacts.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The ADR-114 chrome specs had only ever been collected, never run. Collecting proves a spec parses; it proves nothing about whether it passes. Running them against a real Nextcloud found three defects, all of which shipped in every app's spec.
1. The testid is on the wrapper, not the link
cn-nav-entry-*andcn-nav-admin-settingssit on the<li class="app-navigation-entry-wrapper">. The clickable element and thehrefboth live on the<a class="app-navigation-entry-link">inside it.So
.click()on the testid resolved the locator and then never became actionable — a 30-second timeout that reads like the navigation is broken — andtoHaveAttribute('href', …)on it returnednull, which the report renders as the string"null".2. The setup wizard modal eats the clicks
On a fresh instance
CnSetupWizardopens over the app, and its modal subtree intercepts pointer events:Every click-through test failed; every URL-navigation test passed. That asymmetry is exactly what makes this easy to miss — the suite looks two-thirds healthy. The specs now dismiss the wizard in
beforeEach.3. A single-word text probe matched an SVG title
getByText('Open', { exact: false })matched<title>Opens in a new tab</title>on an external-link icon: attached, hidden, and nothing to do with the report under test. Single-word probes are now scoped tomain, .app-contentand use a string only the report can supply.How this was verified
A throwaway Nextcloud on its own compose project and port — deliberately not the shared
:8080, and not the other sessions' containers, both of which this fleet has been bitten by before.Every other app receives the same mechanical fix, linted and formatted in its own app's style. Their suites are not individually executed here — each needs its own
npm ciplus a webpack build to test the icon assertions honestly — so this PR claims the fix, not a per-app green run.One thing worth recording: an earlier attempt reported keepiq's Reports page rendering "This page is empty". That was not a product defect — it was a borrowed
node_modulesfrom a sibling checkout pinning nc-vue 2.27.2 where keepiq declares^2.32.0, too old to know thereportspage type. With the declared version installed, the page renders correctly.🤖 Generated with Claude Code