From f7a4f8a2b4e0c79706acdb868cb72a853acc839d Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Wed, 1 Jul 2026 10:23:45 +0300 Subject: [PATCH] Fix AccessibilityTests hang on previews expecting expired transient state The Observation migration (2d486ece3) ported the preview fulfillment loop from Combine publishers to async sequences but didn't carry over the publisher path's 1s timeout. Without it, a preview whose expected state never arrives loops forever. --- .../AccessibilityTestsAppCoordinator.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ElementX/Sources/AccessibilityTests/AccessibilityTestsAppCoordinator.swift b/ElementX/Sources/AccessibilityTests/AccessibilityTestsAppCoordinator.swift index e0bcd15b2..cad0c766b 100644 --- a/ElementX/Sources/AccessibilityTests/AccessibilityTestsAppCoordinator.swift +++ b/ElementX/Sources/AccessibilityTests/AccessibilityTestsAppCoordinator.swift @@ -149,8 +149,14 @@ struct PreviewsWrapperView: View { .makeAsyncIterator() while let value = await iterator.next(isolation: #isolation), value == false { } case .sequence(let sequence): - var iterator = sequence.makeAsyncIterator() - while let value = await iterator.next(isolation: #isolation), value == false { } + // Mirror the publisher timeout above so a preview expecting a state that never + // arrives (e.g. a transient one that already expired) doesn't hang the suite. + let task = Task { + var iterator = sequence.makeAsyncIterator() + while let value = await iterator.next(isolation: #isolation), value == false { } + } + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { task.cancel() } + await task.value case .none: break }