From 3fd1c69ea8e4c0f7edce85320bd71fb64b8b0243 Mon Sep 17 00:00:00 2001 From: David Allison <62114487+david-allison@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:09:43 +0100 Subject: [PATCH] tests: fix flake in `updateViewWithSavedPreferences` We did not wait for `updateViewWithSavedPreferences` correctly in `DeckPickerWidgetConfigTest.testLoadSavedPreferences` Because we updated this in `DeckPickerWidgetConfig`, also update the method in `CardAnalysisWidgetConfig` Issue 17010 --- .../cardanalysis/CardAnalysisWidgetConfig.kt | 19 +++++++++---------- .../deckpicker/DeckPickerWidgetConfig.kt | 18 ++++++++---------- .../CardAnalysisWidgetConfigTest.kt | 6 +----- .../deckpicker/DeckPickerWidgetConfigTest.kt | 6 +----- 4 files changed, 19 insertions(+), 30 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/widget/cardanalysis/CardAnalysisWidgetConfig.kt b/AnkiDroid/src/main/java/com/ichi2/widget/cardanalysis/CardAnalysisWidgetConfig.kt index b9d544e4a1..6bc18e2dd5 100644 --- a/AnkiDroid/src/main/java/com/ichi2/widget/cardanalysis/CardAnalysisWidgetConfig.kt +++ b/AnkiDroid/src/main/java/com/ichi2/widget/cardanalysis/CardAnalysisWidgetConfig.kt @@ -153,7 +153,7 @@ class CardAnalysisWidgetConfig : AnkiActivity(), DeckSelectionListener, BaseSnac showDeckSelectionDialog() } - updateViewWithSavedPreferences() + lifecycleScope.launch { updateViewWithSavedPreferences() } // Update the visibility of the "no decks" placeholder and the widget configuration container updateViewVisibility() @@ -234,16 +234,15 @@ class CardAnalysisWidgetConfig : AnkiActivity(), DeckSelectionListener, BaseSnac } /** Updates the view according to the saved preference for appWidgetId.*/ - fun updateViewWithSavedPreferences() { + suspend fun updateViewWithSavedPreferences() { val selectedDeckId = cardAnalysisWidgetPreferences.getSelectedDeckIdFromPreferences(appWidgetId) ?: return - lifecycleScope.launch { - val decks = fetchDecks() - val selectedDecks = decks.filter { it.deckId == selectedDeckId } - selectedDecks.forEach { deckAdapter.addDeck(it) } - updateViewVisibility() - updateFabVisibility() - updateSubmitButtonText() - } + + val decks = fetchDecks() + val selectedDecks = decks.filter { it.deckId == selectedDeckId } + selectedDecks.forEach { deckAdapter.addDeck(it) } + updateViewVisibility() + updateFabVisibility() + updateSubmitButtonText() } /** Asynchronously displays the list of deck in the selection dialog. */ diff --git a/AnkiDroid/src/main/java/com/ichi2/widget/deckpicker/DeckPickerWidgetConfig.kt b/AnkiDroid/src/main/java/com/ichi2/widget/deckpicker/DeckPickerWidgetConfig.kt index 811b6ff5db..d980345f70 100644 --- a/AnkiDroid/src/main/java/com/ichi2/widget/deckpicker/DeckPickerWidgetConfig.kt +++ b/AnkiDroid/src/main/java/com/ichi2/widget/deckpicker/DeckPickerWidgetConfig.kt @@ -151,7 +151,7 @@ class DeckPickerWidgetConfig : AnkiActivity(), DeckSelectionListener, BaseSnackb showDeckSelectionDialog() } - updateViewWithSavedPreferences() + lifecycleScope.launch { updateViewWithSavedPreferences() } // Update the visibility of the "no decks" placeholder and the widget configuration container updateViewVisibility() @@ -282,17 +282,15 @@ class DeckPickerWidgetConfig : AnkiActivity(), DeckSelectionListener, BaseSnackb } /** Updates the view according to the saved preference for appWidgetId.*/ - fun updateViewWithSavedPreferences() { + suspend fun updateViewWithSavedPreferences() { val selectedDeckIds = deckPickerWidgetPreferences.getSelectedDeckIdsFromPreferences(appWidgetId) if (selectedDeckIds.isNotEmpty()) { - lifecycleScope.launch { - val decks = fetchDecks() - val selectedDecks = decks.filter { it.deckId in selectedDeckIds } - selectedDecks.forEach { deckAdapter.addDeck(it) } - updateViewVisibility() - updateFabVisibility() - setupDoneButton() - } + val decks = fetchDecks() + val selectedDecks = decks.filter { it.deckId in selectedDeckIds } + selectedDecks.forEach { deckAdapter.addDeck(it) } + updateViewVisibility() + updateFabVisibility() + setupDoneButton() } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/widget/cardanalysis/CardAnalysisWidgetConfigTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/widget/cardanalysis/CardAnalysisWidgetConfigTest.kt index 406e5696b3..31e780b054 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/widget/cardanalysis/CardAnalysisWidgetConfigTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/widget/cardanalysis/CardAnalysisWidgetConfigTest.kt @@ -31,7 +31,6 @@ import org.hamcrest.Matchers.equalTo import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.robolectric.Robolectric @RunWith(AndroidJUnit4::class) class CardAnalysisWidgetConfigTest : RobolectricTest() { @@ -85,7 +84,7 @@ class CardAnalysisWidgetConfigTest : RobolectricTest() { * `RecyclerView` displays the correct number of items based on the saved preferences. */ @Test - fun testLoadSavedPreferences() { + fun testLoadSavedPreferences() = runTest { // Save decks to preferences val deckId = 1L widgetPreferences.saveSelectedDeck(1, deckId) @@ -93,9 +92,6 @@ class CardAnalysisWidgetConfigTest : RobolectricTest() { // Load preferences activity.updateViewWithSavedPreferences() - // Ensure all tasks on the UI thread are completed - Robolectric.flushForegroundThreadScheduler() - // Get the RecyclerView and its adapter val recyclerView = activity.findViewById(R.id.recyclerViewSelectedDecks) val adapter = recyclerView.adapter diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/widget/deckpicker/DeckPickerWidgetConfigTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/widget/deckpicker/DeckPickerWidgetConfigTest.kt index a85178d11c..7473038409 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/widget/deckpicker/DeckPickerWidgetConfigTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/widget/deckpicker/DeckPickerWidgetConfigTest.kt @@ -31,7 +31,6 @@ import org.hamcrest.Matchers.equalTo import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.robolectric.Robolectric @RunWith(AndroidJUnit4::class) class DeckPickerWidgetConfigTest : RobolectricTest() { @@ -85,7 +84,7 @@ class DeckPickerWidgetConfigTest : RobolectricTest() { * `RecyclerView` displays the correct number of items based on the saved preferences. */ @Test - fun testLoadSavedPreferences() { + fun testLoadSavedPreferences() = runTest { // Save decks to preferences val deckIds = listOf(1L) widgetPreferences.saveSelectedDecks(1, deckIds.map { it.toString() }) @@ -93,9 +92,6 @@ class DeckPickerWidgetConfigTest : RobolectricTest() { // Load preferences activity.updateViewWithSavedPreferences() - // Ensure all tasks on the UI thread are completed - Robolectric.flushForegroundThreadScheduler() - // Get the RecyclerView and its adapter val recyclerView = activity.findViewById(R.id.recyclerViewSelectedDecks) val adapter = recyclerView.adapter