mirror of
https://github.com/block/buzz.git
synced 2026-11-01 15:01:12 +00:00
## Summary Two RunnerTests fixes from the 23–30 Oct flake audit, both in `mobile/ios/RunnerTests/RunnerTests.swift`. Both are test-only. This is one of six PRs split from the reviewed `flakey-tests` branch (siblings below). ### `testLargeTitleTextFadesWithScrollAndCompactTitleCanReverse` (3 runs) - **Runs:** 40748163526 (job 123028155856), 40826294064 (#8679, job 123290415194, passed on attempt 2) and 40921441156 (#8694, job 123617149320), all in Mobile (iOS), attempt 1. None of the branches touches the navigation bar. Signature: `XCTAssertLessThan(visibleOpacity(of: centeredTitle), 0.99)` read 0.9999499, 1.0 and 1.0. - **Cause:** collapsing adds a 0.18 s `CABasicAnimation` on the compact title mask's opacity (`IosNavigationBar.swift` `applyScroll`). The test slept 60 ms and expected the presentation opacity to be mid-fade. The presentation layer follows wall-clock media time. When the Flutter app in the test host keeps the main thread busy, `Task.sleep` resumes after the fade has finished. - **Change:** drop the 60 ms sleep and the mid-fade samples. Right after `scroll(to: boundary)`, which runs the handler synchronously, check that the mask's model opacity is 1. Also check that it carries a `"titleFade"` opacity `CABasicAnimation` from 0 to 1, lasting 0.1–0.5 s. Nothing turns the run loop before the check, so the animation is still attached however long the main thread stalls. After the scroll back, a new `XCTAssertNil` checks that reversing removes the fade. The later 240 ms waits and their end-state checks are unchanged. - **Mutations that should fail it:** - Delete `compactTitleMask.add(fade, forKey: "titleFade")`: the `XCTUnwrap` throws. - Delete `removeAllAnimations()`: the new `XCTAssertNil` fails. The old test missed this. - Set `fade.duration = 0.001`: the band's lower bound fails. ### `testNativeRemovalConfirmationUsesDestructiveAlertAndCancelsOnce` (1 run) - **Run:** 40950548609 (#8433, Dart only, job 123717768224), attempt 1. Signature: `fulfillment(of: [completed], timeout: 3)` expired. - **Cause:** the busy test-host main thread that #8678 handled for other classes. The cancel reply comes from UIKit's dismissal completion, after the dismiss animation runs on that thread. - **Change:** raise the wait to 10 s, matching #8678's `callbackTimeout`. The assertion is unchanged. Dropping `resolve` from the dismissal completion still fails it, and so does resolving before `alert.dismiss`. ### Related issue None found. **Conflicts with #8568** ("Adapt iPhone Duo layouts, rail navigation, and native sheets"). #8568 rewrites the fade test into a loop but keeps the 60 ms sleep and the mid-fade samples. It already conflicts with `main`, and this PR adds `RunnerTests.swift` to its conflicts. #8665 only adds a voice-note test. ### Testing Not compiled against the app or run locally, because Xcode and RunnerTests bog this machine down. `swiftc -parse` accepts the file. The new assertions, copied into a stub `XCTestCase`, typecheck with `swiftc -typecheck` against the iOS simulator SDK and XCTest (Swift 5 mode). The full file needs Flutter and the Buzz module, so it wasn't typechecked as a whole. **The Mobile (iOS) lane is the check.** Pushed with `git push --no-verify`, because the pre-push suites fail when the laptop is under load. ### Readiness An agent review of the combined `flakey-tests` branch (b432453af) found no blockers. `buzz-review-completed` is not added, because the human test step (AGENTS.md "Before opening a PR", step 3) hasn't happened yet. ### Siblings - #8739 ci: Hermit fetch deadline and sccache fallback - #8740 test(relay): thread_window aux-page hold and `api::media` Postgres tests - #8742 fix(desktop): deep-linked message hold (product change) - #8743 test(desktop): four specs racing scroll settles and focus - #8744 test(desktop): five settle classes and remote-owned-mentions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Signed-off-by: Matt Toohey <contact@matttoohey.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>