Skip to content

ci: run the iOS UI suite on iPad as well as iPhone - #5

Merged
weskcode merged 2 commits into
developfrom
feature/ci-ipad-leg
Sep 2, 2026
Merged

weskcode merged 2 commits into
developfrom
feature/ci-ipad-leg

Conversation

@weskcode

@weskcode weskcode commented Sep 2, 2026

Copy link
Copy Markdown
Owner

Adds ipad to the iOS matrix, now that the iPad-capable UI suite has landed on develop.

Why this was blocked until now

The app ships iPad (TARGETED_DEVICE_FAMILY "1,2") and presents structurally different UI there — a NavigationSplitView with a sidebar, rather than a compact NavigationStack with a navigationBarDrawer search field. The UI suite branches on the idiom, but only the iPhone half had ever run anywhere: CI resolved a single iPhone simulator for every iOS step, so the iPad paths were dead code in practice.

Why no other change was needed

  • Scripts/resolve-ios-simulator.sh already takes a device family.
  • The macos-26 image carries iPad models (Pro, Air, mini, A16) on the iOS 26.5 runtime the resolver selects — verified against the actions/runner-images manifest.
  • fail-fast: false was already set, so one device failing still reports the other.
  • Unit tests stay pinned to the iphone leg; they are pure logic and device-independent.

This run is the first time the iPad UI paths execute anywhere.

🤖 Generated with Claude Code

weskcode and others added 2 commits September 2, 2026 13:40
The app ships iPad (TARGETED_DEVICE_FAMILY "1,2") and the UI it presents there
is structurally different: a NavigationSplitView with a sidebar rather than a
compact NavigationStack with a navigationBarDrawer search field. The UI suite
branches on the idiom, but only the iPhone half had ever run -- CI resolved a
single iPhone simulator for every iOS step, so the iPad paths were dead code in
practice.

Adds ipad to the existing matrix. fail-fast is already false, so one device
failing still reports the other. Unit tests stay pinned to the iphone leg;
they are pure logic and device-independent.

No other change was needed: Scripts/resolve-ios-simulator.sh already takes a
device family, and the macos-26 image carries iPad models on the iOS 26.5
runtime the resolver selects.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Adding the ipad leg to CI (previous commit) failed 3 of 12 UI tests. All
three were the suite's helpers assuming an iPhone-shaped NavigationStack;
NavigationSplitView needed different queries, not different behavior.

Root-caused each by dumping the real accessibility tree rather than guessing:

- revealSearchField: .searchable(placement: .sidebar) puts the field above
  the sidebar's first row, off-screen above the viewport. A full-screen
  swipeDown() (the iPhone path) hits the detail pane and scrolls nothing.
  Falls back to swiping the "Sidebar" collection view directly.

- returnToList: with two navigation bars on screen (sidebar + detail pane),
  navigationBars.buttons.firstMatch resolved to the DETAIL pane's first
  button -- "New Note" -- so this was silently creating a note instead of
  navigating. iPad has nothing to pop; the list is always visible. Guarded
  on a new isSplitViewLayout(in:) check.

- Two membership/deletion assertions: a note's title renders in both the
  sidebar row and the detail pane on iPad, so app.staticTexts[title] is
  ambiguous, and a stale detail pane can defeat a "no longer in the list"
  check. Added noteList(in:) to scope those queries to the actual list.

- Permanent-delete confirmation: both the detail pane and the confirmation
  dialog have a "Delete Now" button. Picking the last app-wide match assumed
  the dialog sorts after the pane, which does not hold on iPad, where the
  confirmation is a popover -- the pane's own button was tapped, the dialog
  was never confirmed, and the note silently survived. Added
  confirmPermanentDelete(in:), scoped to the sheet/alert container.

Verified: 12/12 pass on iPad, 12/12 on iPhone -- including on a fresh,
disposable simulator, to rule out interference from other sessions sharing
this machine's simulators. Zero syntax errors from a standalone parse of the
changed file.

Also removed four identical, untracked duplicate files (iCloud sync
artifacts: Localizable 2.xcstrings, ScreenshotDemoContent 2.swift,
LocalizationTests 2.swift, verify-localization 2.sh) that broke local
compilation with "invalid redeclaration" -- unrelated to this branch, but
blocked reproducing the CI failure locally.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@weskcode
weskcode merged commit 28ff16b into develop Sep 2, 2026
4 checks passed
@weskcode
weskcode deleted the feature/ci-ipad-leg branch September 2, 2026 20:40
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.

1 participant