From 95dddd470ae044ba63859c5875463bf07c5b491c Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Wed, 9 Jul 2025 23:40:29 +0530 Subject: [PATCH] Refactored the `LanguageFragmentTest` UI test to properly verify that the language filter is applied correctly and that content is fetched for the selected language. * Fixed: some lint warnings. --- .../kiwixmobile/download/DownloadRobot.kt | 10 +++ .../language/LanguageFragmentTest.kt | 75 ++++++------------- .../kiwixmobile/language/LanguageRobot.kt | 48 ++++++------ .../language/composables/LanguageItemRow.kt | 4 +- .../library/online/OnlineLibraryScreen.kt | 4 +- .../zimManager/ZimManageViewModel.kt | 1 - 6 files changed, 62 insertions(+), 80 deletions(-) diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadRobot.kt index dfe1396e6..8165ea18a 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/download/DownloadRobot.kt @@ -44,6 +44,7 @@ import org.kiwix.kiwixmobile.nav.destination.library.online.DOWNLOADING_STATE_TE import org.kiwix.kiwixmobile.nav.destination.library.online.DOWNLOADING_STOP_BUTTON_TESTING_TAG import org.kiwix.kiwixmobile.nav.destination.library.online.NO_CONTENT_VIEW_TEXT_TESTING_TAG import org.kiwix.kiwixmobile.nav.destination.library.online.ONLINE_BOOK_ITEM_TESTING_TAG +import org.kiwix.kiwixmobile.nav.destination.library.online.ONLINE_DIVIDER_ITEM_TEXT_TESTING_TAG import org.kiwix.kiwixmobile.nav.destination.library.online.ONLINE_LIBRARY_SEARCH_VIEW_CLOSE_BUTTON_TESTING_TAG import org.kiwix.kiwixmobile.nav.destination.library.online.ONLINE_LIBRARY_SEARCH_VIEW_TESTING_TAG import org.kiwix.kiwixmobile.nav.destination.library.online.SHOW_FETCHING_LIBRARY_LAYOUT_TESTING_TAG @@ -86,6 +87,15 @@ class DownloadRobot : BaseRobot() { } } + fun checkLanguageFilterAppliedToOnlineContent( + composeTestRule: ComposeContentTestRule, + language: String + ) { + composeTestRule.apply { + onNodeWithTag(ONLINE_DIVIDER_ITEM_TEXT_TESTING_TAG).assertTextEquals(language) + } + } + private fun refreshOnlineListIfSwipeDownForLibraryTextVisible(composeTestRule: ComposeContentTestRule) { try { composeTestRule.onNodeWithTag(NO_CONTENT_VIEW_TEXT_TESTING_TAG).assertIsDisplayed() diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageFragmentTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageFragmentTest.kt index 1039c2887..ab1e08511 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageFragmentTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageFragmentTest.kt @@ -43,6 +43,7 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.utils.LanguageUtils.Companion.handleLocaleChange import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.TestingUtils.COMPOSE_TEST_RULE_ORDER @@ -50,8 +51,10 @@ import org.kiwix.kiwixmobile.core.utils.TestingUtils.RETRY_RULE_ORDER import org.kiwix.kiwixmobile.download.downloadRobot import org.kiwix.kiwixmobile.main.KiwixMainActivity import org.kiwix.kiwixmobile.testutils.RetryRule +import org.kiwix.kiwixmobile.testutils.TestUtils import org.kiwix.kiwixmobile.testutils.TestUtils.closeSystemDialogs import org.kiwix.kiwixmobile.testutils.TestUtils.isSystemUINotRespondingDialogVisible +import org.kiwix.kiwixmobile.testutils.TestUtils.waitUntilTimeout import org.kiwix.kiwixmobile.utils.StandardActions @LargeTest @@ -132,32 +135,7 @@ class LanguageFragmentTest { language { // search and de-select if german language already selected clickOnLanguageIcon(composeTestRule) - clickOnLanguageSearchIcon(composeTestRule) - searchLanguage( - composeTestRule = composeTestRule, - searchLanguage = "german" - ) - deSelectLanguageIfAlreadySelected( - composeTestRule = composeTestRule, - matchLanguage = "German" - ) - clickOnSaveLanguageIcon(composeTestRule) - - // search and de-select if italian language already selected - clickOnLanguageIcon(composeTestRule) - clickOnLanguageSearchIcon(composeTestRule) - searchLanguage( - composeTestRule = composeTestRule, - searchLanguage = "italiano" - ) - deSelectLanguageIfAlreadySelected( - composeTestRule = composeTestRule, - matchLanguage = "Italian" - ) - clickOnSaveLanguageIcon(composeTestRule) - - // Search and save language for german - clickOnLanguageIcon(composeTestRule) + waitForLanguageToLoad(composeTestRule) clickOnLanguageSearchIcon(composeTestRule) searchLanguage( composeTestRule = composeTestRule, @@ -168,9 +146,18 @@ class LanguageFragmentTest { matchLanguage = "German" ) clickOnSaveLanguageIcon(composeTestRule) + // test if the selected language filter is applied on the online library or not. + downloadRobot { + composeTestRule.waitUntilTimeout(TestUtils.TEST_PAUSE_MS_FOR_DOWNLOAD_TEST.toLong()) + waitForDataToLoad(composeTestRule = composeTestRule) + checkLanguageFilterAppliedToOnlineContent( + composeTestRule, + context.getString(R.string.your_language, "German") + ) + } - // Search and save language for italian clickOnLanguageIcon(composeTestRule) + waitForLanguageToLoad(composeTestRule) clickOnLanguageSearchIcon(composeTestRule) searchLanguage( composeTestRule = composeTestRule, @@ -182,31 +169,15 @@ class LanguageFragmentTest { ) clickOnSaveLanguageIcon(composeTestRule) - // verify is german language selected - clickOnLanguageIcon(composeTestRule) - clickOnLanguageSearchIcon(composeTestRule) - searchLanguage( - composeTestRule = composeTestRule, - searchLanguage = "german" - ) - checkIsLanguageSelected( - composeTestRule = composeTestRule, - matchLanguage = "German" - ) - clickOnSaveLanguageIcon(composeTestRule) - - // verify is italian language selected - clickOnLanguageIcon(composeTestRule) - clickOnLanguageSearchIcon(composeTestRule) - searchLanguage( - composeTestRule = composeTestRule, - searchLanguage = "italiano" - ) - checkIsLanguageSelected( - composeTestRule = composeTestRule, - matchLanguage = "Italian" - ) - clickOnSaveLanguageIcon(composeTestRule) + // test if the selected language filter is applied on the online library or not. + downloadRobot { + composeTestRule.waitUntilTimeout(TestUtils.TEST_PAUSE_MS_FOR_DOWNLOAD_TEST.toLong()) + waitForDataToLoad(composeTestRule = composeTestRule) + checkLanguageFilterAppliedToOnlineContent( + composeTestRule, + context.getString(R.string.your_language, "Italian") + ) + } } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { LeakAssertions.assertNoLeaks() diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageRobot.kt index edbbaaa2f..d43904e71 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/language/LanguageRobot.kt @@ -18,21 +18,21 @@ package org.kiwix.kiwixmobile.language -import androidx.compose.ui.test.assertIsOff -import androidx.compose.ui.test.assertIsOn +import androidx.compose.ui.test.ComposeTimeoutException +import androidx.compose.ui.test.isDisplayed import androidx.compose.ui.test.junit4.ComposeContentTestRule +import androidx.compose.ui.test.onAllNodesWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performTextInput import applyWithViewHierarchyPrinting -import com.adevinta.android.barista.interaction.BaristaSleepInteractions import org.kiwix.kiwixmobile.BaseRobot import org.kiwix.kiwixmobile.Findable.ViewId import org.kiwix.kiwixmobile.R +import org.kiwix.kiwixmobile.core.R.string import org.kiwix.kiwixmobile.core.page.SEARCH_ICON_TESTING_TAG import org.kiwix.kiwixmobile.core.search.SEARCH_FIELD_TESTING_TAG -import org.kiwix.kiwixmobile.language.composables.LANGUAGE_ITEM_CHECKBOX_TESTING_TAG import org.kiwix.kiwixmobile.nav.destination.library.online.LANGUAGE_MENU_ICON_TESTING_TAG import org.kiwix.kiwixmobile.testutils.TestUtils import org.kiwix.kiwixmobile.testutils.TestUtils.waitUntilTimeout @@ -69,21 +69,6 @@ class LanguageRobot : BaseRobot() { searchField.performTextInput(text = searchLanguage) } - // error prone - fun deSelectLanguageIfAlreadySelected( - composeTestRule: ComposeContentTestRule, - matchLanguage: String - ) { - BaristaSleepInteractions.sleep(TestUtils.TEST_PAUSE_MS.toLong()) - try { - composeTestRule.onNodeWithTag("$LANGUAGE_ITEM_CHECKBOX_TESTING_TAG$matchLanguage") - .assertIsOff() - } catch (_: AssertionError) { - composeTestRule.onNodeWithTag("$LANGUAGE_ITEM_CHECKBOX_TESTING_TAG$matchLanguage") - .performClick() - } - } - fun selectLanguage( composeTestRule: ComposeContentTestRule, matchLanguage: String @@ -92,12 +77,27 @@ class LanguageRobot : BaseRobot() { .performClick() } - fun checkIsLanguageSelected( + fun waitForLanguageToLoad( composeTestRule: ComposeContentTestRule, - matchLanguage: String + retryCountForDataToLoad: Int = 20 ) { - BaristaSleepInteractions.sleep(TestUtils.TEST_PAUSE_MS.toLong()) - composeTestRule.onNodeWithTag("$LANGUAGE_ITEM_CHECKBOX_TESTING_TAG$matchLanguage") - .assertIsOn() + try { + composeTestRule.waitUntil(TestUtils.TEST_PAUSE_MS_FOR_DOWNLOAD_TEST.toLong()) { + composeTestRule + .onAllNodesWithContentDescription( + context.getString(string.select_language_content_description) + )[0].isDisplayed() + } + } catch (e: ComposeTimeoutException) { + if (retryCountForDataToLoad > 0) { + waitForLanguageToLoad( + retryCountForDataToLoad = retryCountForDataToLoad - 1, + composeTestRule = composeTestRule + ) + return + } + // throw the exception when there is no more retry left. + throw RuntimeException("Couldn't load the language list.\n Original exception = $e") + } } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/composables/LanguageItemRow.kt b/app/src/main/java/org/kiwix/kiwixmobile/language/composables/LanguageItemRow.kt index 6e5c70506..b54532e4b 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/language/composables/LanguageItemRow.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/language/composables/LanguageItemRow.kt @@ -40,7 +40,7 @@ import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.utils.ComposeDimens import org.kiwix.kiwixmobile.language.composables.LanguageListItem.LanguageItem -const val LANGUAGE_ITEM_CHECKBOX_TESTING_TAG = "languageItemCheckboxTestingTag" +const val LANGUAGE_ITEM_RADIO_BUTTON_TESTING_TAG = "languageItemRadioButtonTestingTag" @Composable fun LanguageItemRow( @@ -66,7 +66,7 @@ fun LanguageItemRow( modifier = Modifier .padding(ComposeDimens.SIXTEEN_DP) .semantics { - testTag = "$LANGUAGE_ITEM_CHECKBOX_TESTING_TAG${language.language}" + testTag = "$LANGUAGE_ITEM_RADIO_BUTTON_TESTING_TAG${language.language}" }, selected = language.active, onClick = { diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/online/OnlineLibraryScreen.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/online/OnlineLibraryScreen.kt index 639b80900..13201b5d1 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/online/OnlineLibraryScreen.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/online/OnlineLibraryScreen.kt @@ -89,6 +89,7 @@ const val ONLINE_LIBRARY_SEARCH_VIEW_CLOSE_BUTTON_TESTING_TAG = "onlineLibrarySearchViewCloseButtonTestingTag" const val NO_CONTENT_VIEW_TEXT_TESTING_TAG = "noContentViewTextTestingTag" const val SHOW_FETCHING_LIBRARY_LAYOUT_TESTING_TAG = "showFetchingLibraryLayoutTestingTag" +const val ONLINE_DIVIDER_ITEM_TEXT_TESTING_TAG = "onlineDividerItemTextTag" @OptIn(ExperimentalMaterial3Api::class) @Suppress("ComposableLambdaParameterNaming") @@ -256,7 +257,8 @@ private fun ShowDividerItem(dividerItem: DividerItem) { Text( text = dividerItem.sectionTitle, textAlign = TextAlign.Center, - style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Normal) + style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Normal), + modifier = Modifier.semantics { testTag = ONLINE_DIVIDER_ITEM_TEXT_TESTING_TAG } ) } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt b/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt index 593b87449..c1332de94 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zimManager/ZimManageViewModel.kt @@ -126,7 +126,6 @@ const val MAX_PROGRESS = 100 const val THREE = 3 const val FOUR = 4 -@Suppress("LargeClass", "UnusedPrivateProperty") class ZimManageViewModel @Inject constructor( private val downloadDao: DownloadRoomDao, private val libkiwixBookOnDisk: LibkiwixBookOnDisk,