From 5811ab05556266ffba8b86e211b1684b2b96dd94 Mon Sep 17 00:00:00 2001 From: justinzeus Date: Sat, 7 Nov 2026 18:18:50 +0100 Subject: [PATCH] Synchronize saved-picker test with Android main queue --- .../org/justinvisser/wolfskin/tv/SavedPeoplePickerTest.kt | 7 ++++++- docker/README.md | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/org/justinvisser/wolfskin/tv/SavedPeoplePickerTest.kt b/app/src/test/java/org/justinvisser/wolfskin/tv/SavedPeoplePickerTest.kt index 1fb29d31..b7eb73de 100644 --- a/app/src/test/java/org/justinvisser/wolfskin/tv/SavedPeoplePickerTest.kt +++ b/app/src/test/java/org/justinvisser/wolfskin/tv/SavedPeoplePickerTest.kt @@ -69,7 +69,12 @@ class SavedPeoplePickerTest { WolfskinApp(server, users.first(), navigation, UserPreferences(AppPreferences.getDefaultInstance(), null), viewModel = model, homeContent = { _, _, _, _ -> }) } - rule.waitUntil(5_000) { entered.get() && session.state?.people?.size == 3 } + rule.waitUntil(5_000) { + // IO completion publishes Compose state on Android's queue, not the test frame clock. + androidx.compose.runtime.snapshots.Snapshot.sendApplyNotifications() + org.robolectric.Shadows.shadowOf(android.os.Looper.getMainLooper()).idle() + entered.get() && session.state?.people?.size == 3 + } users.forEach { rule.onNodeWithText(it.name!!).assertIsDisplayed() } rule.runOnIdle { assertTrue(session.state!!.pickerVisible) diff --git a/docker/README.md b/docker/README.md index c5a3c4c1..c908c6bf 100644 --- a/docker/README.md +++ b/docker/README.md @@ -43,6 +43,12 @@ execution order. Keep worker heap and parallelism unchanged between samples. `PersonPickerSessionTest` must also pass late in the full app JVM, not just alone or promoted to the front by previous failures. +`SavedPeoplePickerTest` publishes pending Compose snapshots and pumps Android's +main queue while awaiting the saved household, just like the session-picker +await above. Its five-second deadline, blocked first network response and saved +identity assertions are unchanged; the virtual frame clock alone does not drain +an IO continuation queued on Android's host looper. + ## Saved-person launch and DNS Launch restores an unprotected saved Jellyfin login from local storage before