CI: mobile e2e smoke + drop SKIP_MOBILE from Makefile - #262
Conversation
Picks up Euro-Office/web-apps#158, which removes SKIP_MOBILE from build-pipeline.js — mobile now always builds and is always gated. Required before dropping the dead SKIP_MOBILE pass-through from the Makefile. Refs #261 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Signed-off-by: James Manuel <moodyjmz@users.noreply.github.com>
Since web-apps#158 the build pipeline ignores SKIP_MOBILE, so the Makefile flag is a silent no-op. Removes the comment block, default, and both web-apps/web-apps-dev pass-throughs. Refs #261 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Signed-off-by: James Manuel <moodyjmz@users.noreply.github.com>
verify-deploy.mjs only checks that mobile artifacts exist at build time; it can't catch a mobile editor that deploys but fails at runtime (#258 — a permanent loading skeleton, or a fatal version-mismatch dialog blocking the document load). Forces the mobile bundle deterministically via ?type=mobile (bypassing the example app's User-Agent sniffing), then asserts the rendering canvas mounts and that no framework7 error surface is showing. Both dialog (.dialog.modal-in) and notification (.notification.modal-in) surfaces are checked, since LoadingScriptError uses f7.notification rather than f7.dialog. Covers docx/xlsx/pptx/pdf. Visio is excluded: the example app has no blank vsdx create-new template to exercise. Refs #261 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Signed-off-by: James Manuel <moodyjmz@users.noreply.github.com>
PR #262 Review IssuesIssue 1 — Canvas
|
Aiiaiiio
left a comment
There was a problem hiding this comment.
Nice one! This verbose commenting will make this a bit hard to maintain should anything change that is stated here. But at least it's obvious what is happening.
The canvas mounts from the SDK bundle regardless of doc load, so the gate false-passed when the doc never loaded. Gate on .doc-placeholder clearing (the isDocReady signal) instead, with a generous timeout. Scope is build-present-and-renders; infra faults like an unresponsive docservice channel are out of scope. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: James Manuel <moodyjmz@users.noreply.github.com>
|
@MonaAghili — thanks for the review. Both points addressed in Issue 1 (canvas isn't a load-completion signal): the gate is now Issue 2 (two back-to-back 30 s timeouts): gone. Sequence is now 15 s (placeholder appears) + 30 s (placeholder clears) + 5 s (error surface) + 5 s (canvas) = 55 s worst case, under the 60 s global. Only the genuinely-slow document-load step keeps 30 s; the tail checks dropped to 5 s. Mind re-reviewing? |
|
Hi @moodyjmz PR Review: ci/mobile-e2e-smokeResolves #261 ("CI: mobile e2e smoke + drop SKIP_MOBILE from Makefile"). Scope reviewed: Acceptance criteria (from #261)
Findings1. Medium — Dangling reference to a file that doesn't exist,
|
With ?type=mobile, api.js coerces PDF's appType to 'word', so it loads the same documenteditor/#id_viewer bundle as docx (no apps/pdfeditor/mobile exists). The PDF row added zero incremental client-bundle coverage the Document row didn't already exercise. Signed-off-by: James Manuel <moodyjmz@users.noreply.github.com>
The comment cited a path that doesn't exist anywhere in this repo's history. State the dead-channel limitation directly instead of pointing at an unreachable file. Signed-off-by: James Manuel <moodyjmz@users.noreply.github.com>
|
@MonaAghili — thanks, addressed in Finding 1 (dangling Findings 2 (placeholder race) and 3 (Visio gap): agreed non-blocking per your own framing, leaving as-is. One more thing not in your review: |
|
@moodyjmz 1. The test can false-pass on a post-load JS exception (blocking)
Suggested fix in const errors: string[] = [];
page.on('pageerror', e => errors.push(e.message));
// ... existing assertions ...
expect(errors).toEqual([]);2. This doubles concurrent document-load pressure on one shared container with no worker pinning (blocking)
3. No real mobile device emulation (fast-follow)
4.
|
| # | Severity | Area | Issue |
|---|---|---|---|
| 1 | Major | Test correctness | No pageerror/console capture — post-load JS exceptions pass silently |
| 2 | Major | CI reliability | New spec adds concurrent load to one shared container with no workers: 1 pin, on a runner already documented as contended |
| 3 | Medium | Mobile validation | No real device emulation (isMobile/hasTouch unset) — only viewport resize on Desktop Chrome |
| 4 | Medium | CI reliability | retries: 1 + ~70s/editor worst-case timeouts risks masking the exact flakiness this canary should catch, and adds real CI time |
| 5 | Medium | Maintainability | No tagging/isolation mechanism for the mobile suite as it's expected to grow |
Findings 1 and 2 are the ones I'd push to have addressed before merge; 3-5 are reasonable fast-follows.
chrip
left a comment
There was a problem hiding this comment.
Verification
| Claim / Item | Reality | Status |
|---|---|---|
SKIP_MOBILE fully removed from develop/setup/Makefile |
git show a807886:develop/setup/Makefile — zero occurrences (base had 5) |
✓ |
Dropping SKIP_MOBILE breaks nothing else in DocumentServer |
git grep SKIP_MOBILE at head → no DocumentServer-side references (docs, CI, other Makefiles) |
✓ |
#158 genuinely removes SKIP_MOBILE upstream |
In new submodule commit 04b95b1: build/scripts/build-pipeline.js and .github/workflows/e2e.yml both have zero SKIP_MOBILE refs (old be0c7c0 still had them) |
✓ |
| PR modifies no CI workflow; test is auto-discovered | Diff touches only Makefile, spec, submodule. e2e job runs npm test (build.yml:493) → Playwright picks up tests/*.spec.ts |
✓ |
| New test ran green in CI | e2e job = SKIPPED (needs: [build, manifest]; build failed). The new test never executed in CI. |
❌ |
| Build failure is caused by this PR | Fails in cluster-docs//core C++ build: Common/3dParty/build_3rdparty.py → V8 gclient_paths.patch "patch does not apply"; cmake v4.3.3 missing; stale vcpkg/nuget cache (libiconv, hunspell). None of the PR's files touch /core, cmake, vcpkg or V8 |
✓ not the PR's fault (pre-existing infra drift) |
.doc-placeholder gate is the right load signal |
Author cites apps/documenteditor/mobile/src/page/main.jsx !isDocReady; matches desktop #loading-mask pattern in example-page.spec.ts |
✓ |
| PDF row correctly dropped as duplicate of docx bundle | ?type=mobile coerces PDF appType to 'word' → routes through documenteditor/#id_viewer; no pdfeditor/mobile bundle. Matrix now docx/xlsx/pptx |
✓ |
| Author's "55 s worst-case < 60 s global" reassurance | Omits the two iframe-level checks: toBeAttached 15 s + toHaveAttribute 15 s + placeholder-visible 15 s + placeholder-clear 30 s + error 5 s + canvas 5 s ≈ 85 s nominal, above the 60 s per-test cap — the 60 s global is the real ceiling |
|
| DCO / sign-off | DCO check green; every commit Signed-off-by: James Manuel |
✓ |
Issues & Suggestions
🔴 Blocking
- The deliverable has never run in CI. The
buildjob is red on all four legs
(amd64/arm64 × euro-office/nextcloud-office) ande2e(needs: [build, manifest], build.yml:438)
was SKIPPED. A PR whose sole purpose is "add a mobile e2e smoke test" cannot be approved while
that test has never been observed to run — let alone pass — in CI. The build break itself is
not this PR's fault (it dies in the/coreC++ build: V8gclient_paths.patchno longer
applies,cmake v4.3.3missing, and a stale vcpkg/nuget cache — none of which this PR touches),
but it is a hard gate on verifying the change. Action: get a green build (fix/refresh the core
build cache on the self-hosted runner, or rebase onto a main where it's green) and produce one run
where thee2ejob actually executes and this spec passes, before merge. - No
pageerror/console capture — @MonaAghili 07-20 #1, still open (mobile-editor.spec.ts).
The test registers nopage.on('pageerror', …)and no console listener. It fails only if
.doc-placeholdernever clears or an f7 error surface appears; a JS exception thrown after the
shell paints (placeholder gone, canvas visible) passes silently. That is precisely the
"deploys but breaks at runtime" (#258) class this gate exists to catch, so the test does not fully
do the job it advertises. It also improves diagnostics (real error message vs a generic timeout).
The reviewer's suggestedconst errors: string[] = []; page.on('pageerror', e => errors.push(e.message)); … expect(errors).toEqual([])
is the right shape. This should land before merge.
⚠️ Major
- No
workers: 1pin — @MonaAghili 07-20 #2, still open.e2e/playwright.config.tssets
fullyParallel: falsebut notworkers: 1, andglobal-setup.tsstarts a single shared Docker
container. This spec adds 3 more full document conversions that can run concurrently with
example-page.spec.ts's 3 against one docservice, on a runner the workflow header itself flags as
contended ("racing the previous one on the single self-hosted e2e runner", build.yml:45). Real
flakiness risk unrelated to mobile-bundle health. Pinworkers: 1(matches the one-shared-container
model) or confirm runner headroom.
ℹ️ Minor / 💡 Suggestions
- No device emulation — @MonaAghili 07-20 #3, open. The
chromiumproject isDesktop Chrome
and the spec only resizes the viewport (414×896);isMobile/hasTouchare unset, so touch-path
and WebKit-specific behaviour stay untested.?type=mobileforces the mobile bundle server-side,
which is a different concern from browser emulation.test.use({ ...devices['iPhone 12'] })closes
the gap. Fast-follow. retries: 1+ stacked timeouts — @MonaAghili 07-20 #4, open. With the 60 s per-test cap and a
free retry, a genuine deterministic regression costs up to ~2 min/editor before going red — weak
canary semantics. Considerretries: 0scoped to the mobile smoke block. Fast-follow.- No tag/isolation for the mobile suite — @MonaAghili 07-20 #5, open. Fine at 3 tests; cheaper to
add a@mobilegrep tag or separate Playwright project now than after it grows and starts blocking
desktop-only PRs. Fast-follow. - Author's timeout reassurance was optimistic. The "55 s < 60 s" reply omitted the two
iframe-level 15 s assertions; the nominal per-assertion budget (~85 s) exceeds the 60 s per-test
ceiling, so on a slow-but-eventually-successful load the global timeout — not the tuned
per-assertion values — is what fires. Not independently blocking (the retries point covers the
practical impact), just worth correcting the record. - No SPDX header on the new spec. Consistent with the sibling
example-page.spec.ts(also
headerless), so not a deviation from local convention — noting only for completeness. - Verbose inline comments (per @Aiiaiiio) — genuinely informative here (why PDF routes through
documenteditor, why visio is excluded, why two error surfaces), but they encode facts about the
web-apps bundle that will drift; acceptable, low-priority maintenance note.
Verdict
Request changes — the mobile smoke test has never actually run in CI (build red on all four
legs → e2e skipped), so the PR's entire deliverable is unverified; the build break is unrelated
infra drift in the /core C++ build, but a green run that exercises this spec is a prerequisite to
merge. On top of that, the prior review's strongest still-open point — no pageerror capture, so a
post-load runtime exception (the exact #258 failure class) passes silently — should be fixed before
merge, and the missing workers: 1 pin is a real flakiness risk. The design and the SKIP_MOBILE
cleanup are otherwise solid.
Assisted-by: ClaudeCode:claude-opus-4-8
Closes #261.
web-appsto pick up docs: Add SECURITY.md #158 (removesSKIP_MOBILE), then drops the now-dead pass-through fromdevelop/setup/Makefile.e2e/tests/mobile-editor.spec.ts: a runtime smoke test for docx/xlsx/pptx/pdf mobile editors, catching the classverify-deploy.mjscan't — artifacts deploy but the editor breaks at runtime (Regression: mobile editor doesn't load in latest-dev #258).Scope
The gate verifies the mobile build is present and renders a document. It keys on the loading skeleton (
.doc-placeholder) clearing — the real "document loaded" signal — rather than the canvas, which mounts with the SDK bundle before any document loads and so can't distinguish "loaded" from "never loaded".Infra faults (e.g. an unresponsive docservice channel) are out of scope: CI runs a healthy docservice from the same image and won't produce them. A known false-pass in that mode is deferred — closing it properly needs a content-bearing sample file rather than a blank new document.
Test plan
example-page.spec.ts) unaffected.doc-placeholdernever clears)