diff options
| author | Christian Cleberg <[email protected]> | 2026-07-23 19:20:52 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-07-23 19:34:57 -0500 |
| commit | 7315ae3da604debfacfed9715a04dc91139a31e0 (patch) | |
| tree | 13febd9af1f44de01f05c9aef661b23cd97e2770 /DomainDigUITests/AccessibilityAuditTests.swift | |
| parent | 655d11b59a273c14720952478ccebec20a9627bd (diff) | |
| download | domain-dig-7315ae3da604debfacfed9715a04dc91139a31e0.tar.gz domain-dig-7315ae3da604debfacfed9715a04dc91139a31e0.tar.bz2 domain-dig-7315ae3da604debfacfed9715a04dc91139a31e0.zip | |
test(a11y): Phase 6 verification — metadata assertions, middle-band sweep, 27.0 fix
Executes the Phase-6 manual runbook against the simulator, converting the
mechanically-checkable parts into permanent coverage and reporting the rest
honestly by tier.
- Fix an enforced `.dynamicType` failure surfaced by `audit-a11y.sh current`
on iOS 27.0: the Settings `Section("Services")` system header (app sets no
font; 18.6 floor and 26.x CI are clean). Narrow, proven `noiseReason`
carve-out scoped to dynamicType on the exact Settings header titles. Delta:
current FAIL -> SUCCEEDED, finding still prints as `[noise: …]`.
- AccessibilityMetadataTests: assert the icon-only control labels and the dense
Watchlist/Batch row label+value contracts (green on 18.6 and 27.0). These
were one-time manual VoiceOver checks; now they gate.
- Middle-band Dynamic Type sweep at AccessibilityL across the seeded screens.
Found no band-exclusive third bug (recorded), retained as regression
insurance for a band that historically shipped two.
- AccessibilityScreenshotTests: best-effort, non-gating capture utility used to
produce the cross-runtime Light/Dark/AXXXL screenshots (simctl appearance
does not propagate headlessly; driven through the in-app picker instead).
- Docs/ACCESSIBILITY_VERIFICATION_RESULTS.md: full pass/fail/not-executable
matrix + 15 screenshots. Notable positive result: Differentiate Without Color
IS verifiable via the global com.apple.Accessibility defaults domain.
Diffstat (limited to 'DomainDigUITests/AccessibilityAuditTests.swift')
| -rw-r--r-- | DomainDigUITests/AccessibilityAuditTests.swift | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/DomainDigUITests/AccessibilityAuditTests.swift b/DomainDigUITests/AccessibilityAuditTests.swift index 0a8f457..07bcbbf 100644 --- a/DomainDigUITests/AccessibilityAuditTests.swift +++ b/DomainDigUITests/AccessibilityAuditTests.swift @@ -112,6 +112,48 @@ final class AccessibilityAuditTests: XCTestCase { try XCTSkipUnless(audited, "Audit did not complete in time for seeded batch results") } + /// The seeded screens at an **intermediate** accessibility size. + /// + /// The default/`AccessibilityXXXL` pair brackets the range but skips the + /// middle band, and two production layout bugs lived exactly there — a + /// bordered button letter-wrapping vertically at a merely-large size, which + /// neither endpoint reproduced. `AccessibilityL` samples that band across the + /// dense seeded screens so a regression in it cannot slip between the two + /// existing test points. Reports rather than gates, matching the other + /// seeded audits. + func testSeededScreensAtIntermediateAccessibilitySize() throws { + let app = AccessibilityAuditHarness.launch( + contentSizeCategory: "UICTContentSizeCategoryAccessibilityL", + seeded: true + ) + + var unaudited: [String] = [] + + app.selectRootTab("Dashboard") + if try !AccessibilityAuditHarness.audit(app, screen: "seeded-dashboard-accessibilityL", test: self, reportOnly: true) { + unaudited.append("Dashboard") + } + + app.selectRootTab("Inspect") + if try !AccessibilityAuditHarness.audit(app, screen: "seeded-batch-accessibilityL", test: self, reportOnly: true) { + unaudited.append("Inspect batch") + } + + app.selectRootTab("Settings") + let trackedDomains = app.buttons["Tracked Domains"] + if trackedDomains.waitForExistence(timeout: 5) { + trackedDomains.tap() + if try !AccessibilityAuditHarness.audit(app, screen: "seeded-tracked-domains-accessibilityL", test: self, reportOnly: true) { + unaudited.append("Tracked Domains") + } + } + + try XCTSkipUnless( + unaudited.isEmpty, + "Audit did not complete in time for: \(unaudited.joined(separator: ", "))" + ) + } + /// The seeded screens again at the largest accessibility size — the case the /// deferred ViewThatFits work exists for. func testSeededScreensAtLargestAccessibilitySize() throws { |
