Skip to content

test(ui): add accessibility audit and visual QA sweeps - #15

Merged
weskcode merged 2 commits into
mainfrom
test/accessibility-and-visual-qa
Sep 8, 2026
Merged

weskcode merged 2 commits into
mainfrom
test/accessibility-and-visual-qa

Conversation

@weskcode

@weskcode weskcode commented Sep 8, 2026

Copy link
Copy Markdown
Owner

The project had no automated accessibility coverage, and performAccessibilityAudit appeared nowhere in the codebase.

AccessibilityAuditUITests runs XCTest's auditor over Dashboard, Reminders, Weather and Settings, then repeats the whole sweep pinned to UICTContentSizeCategoryAccessibilityXXXL. The auditor catches the defects a normal UI test can't see — unlabeled controls, labels duplicating their trait, text clipped at large Dynamic Type, contrast under the WCAG threshold, hit regions below 44 pt. Each issue is reported with its screen name and the run continues, so one pass enumerates everything rather than stopping at the first.

VisualQAScreenshotTests captures the four primary screens across light, dark, AX-XXXL and Spanish — the combinations that actually break Liquid Glass layouts: dark-mode glass contrast, clipping at accessibility sizes, and Spanish string expansion (typically 20–30% longer than English). Screenshots land in /tmp/sunhat-shots and attach to the xcresult.

Both suites pass -sunhatDisableAdSDK. Google's banner is a third-party view whose accessibility this project can't fix, and its network fetch makes the audit nondeterministic.

Closes the dark-mode, Dynamic Type and VoiceOver QA items that have been open on the tracker.

Both APIs were verified against the 26.6 SDK before use — performAccessibilityAudit and XCUIDevice.appearance both live in XCUIAutomation.framework now, not XCTest.framework.

The project had no automated accessibility coverage at all, and
performAccessibilityAudit was never used anywhere.

AccessibilityAuditUITests runs XCTest's auditor over Dashboard,
Reminders, Weather and Settings, then repeats the sweep pinned to
UICTContentSizeCategoryAccessibilityXXXL. The auditor catches what a
normal UI test cannot see: unlabeled controls, labels that duplicate
their trait, text clipped at large Dynamic Type, contrast below the
WCAG threshold, and hit regions under 44pt. Issues are reported with
the screen name and the run continues, so one pass enumerates all of
them instead of stopping at the first.

VisualQAScreenshotTests captures the four primary screens in light,
dark, AX-XXXL and Spanish. Those are the combinations that break
Liquid Glass layouts in practice: dark-mode glass contrast, clipping
at accessibility sizes, and Spanish string expansion.

Both suites disable the ad SDK. Google's banner is a third-party view
whose accessibility this project cannot fix, and its network fetch
makes the audit nondeterministic.
The audit type and compactDescription name what failed (contrast,
clipped text) but not which control, so a real finding couldn't be
traced back to the view that needs fixing. Added issue.element to the
failure message.
@weskcode
weskcode merged commit 4b319ff into main Sep 8, 2026
1 check passed
@weskcode
weskcode deleted the test/accessibility-and-visual-qa branch September 8, 2026 21:53
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