Fixed: DarkModeViewPainterTest which was failing on CI.

This commit is contained in:
MohitMaliFtechiz 2025-08-06 16:40:43 +05:30
parent 0dc94eaeaf
commit 7b03c5da3e
5 changed files with 62 additions and 46 deletions

View File

@ -18,15 +18,13 @@
package org.kiwix.kiwixmobile.main
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick
import androidx.core.content.edit
import androidx.core.net.toUri
import androidx.lifecycle.Lifecycle
import androidx.navigation.NavOptions
import androidx.preference.PreferenceManager
import androidx.test.core.app.ActivityScenario
import androidx.test.espresso.accessibility.AccessibilityChecks
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import androidx.test.platform.app.InstrumentationRegistry
@ -65,7 +63,7 @@ class DarkModeViewPainterTest : BaseActivityTest() {
val retryRule = RetryRule()
@get:Rule(order = COMPOSE_TEST_RULE_ORDER)
val composeTestRule = createComposeRule()
val composeTestRule = createAndroidComposeRule<KiwixMainActivity>()
private lateinit var kiwixMainActivity: KiwixMainActivity
@Before
@ -86,18 +84,17 @@ class DarkModeViewPainterTest : BaseActivityTest() {
putBoolean(SharedPreferenceUtil.PREF_SHOW_SHOWCASE, false)
putString(SharedPreferenceUtil.PREF_LANG, "en")
}
activityScenario =
ActivityScenario.launch(KiwixMainActivity::class.java).apply {
moveToState(Lifecycle.State.RESUMED)
onActivity {
kiwixMainActivity = it
LanguageUtils.handleLocaleChange(
it,
"en",
SharedPreferenceUtil(context)
)
}
composeTestRule.apply {
kiwixMainActivity = activity
runOnUiThread {
LanguageUtils.handleLocaleChange(
kiwixMainActivity,
"en",
SharedPreferenceUtil(context)
)
}
waitForIdle()
}
}
init {
@ -118,6 +115,9 @@ class DarkModeViewPainterTest : BaseActivityTest() {
@Test
fun testDarkMode() {
composeTestRule.waitForIdle()
composeTestRule.runOnUiThread {
composeTestRule.activity.navigate(KiwixDestination.Library.route)
}
toggleDarkMode(true)
openZimFileInReader()
verifyDarkMode(true)
@ -127,10 +127,9 @@ class DarkModeViewPainterTest : BaseActivityTest() {
}
private fun openZimFileInReader() {
activityScenario.onActivity {
kiwixMainActivity = it
}
kiwixMainActivity = composeTestRule.activity
composeTestRule.apply {
waitForIdle()
waitUntilTimeout()
onNodeWithTag(NAVIGATION_ICON_TESTING_TAG).performClick()
waitUntilTimeout()
@ -141,6 +140,7 @@ class DarkModeViewPainterTest : BaseActivityTest() {
}
private fun toggleDarkMode(enable: Boolean) {
composeTestRule.waitForIdle()
darkModeViewPainter { openSettings(kiwixMainActivity as CoreMainActivity, composeTestRule) }
settingsRobo { clickNightModePreference(composeTestRule) }
darkModeViewPainter {
@ -155,6 +155,7 @@ class DarkModeViewPainterTest : BaseActivityTest() {
private fun verifyDarkMode(isEnabled: Boolean) {
var kiwixReaderFragment: KiwixReaderFragment? = null
composeTestRule.waitForIdle()
kiwixMainActivity = composeTestRule.activity
composeTestRule.waitUntil(TEST_PAUSE_MS_FOR_DOWNLOAD_TEST.toLong()) {
kiwixReaderFragment =
kiwixMainActivity.supportFragmentManager.fragments
@ -171,6 +172,8 @@ class DarkModeViewPainterTest : BaseActivityTest() {
assertLightModeEnabled(it)
}
}
composeTestRule.waitForIdle()
composeTestRule.waitUntilTimeout()
} ?: run {
throw RuntimeException(
"Could not check the dark mode enable or not because zim file is not loaded in the reader"
@ -179,6 +182,7 @@ class DarkModeViewPainterTest : BaseActivityTest() {
}
private fun loadZimFileInReader() {
composeTestRule.waitForIdle()
val loadFileStream =
DarkModeViewPainterTest::class.java.classLoader.getResourceAsStream("testzim.zim")
val zimFile =
@ -198,18 +202,16 @@ class DarkModeViewPainterTest : BaseActivityTest() {
}
}
}
activityScenario.onActivity {
kiwixMainActivity = it
}
composeTestRule.runOnIdle {
val navOptions = NavOptions.Builder()
.setPopUpTo(KiwixDestination.Reader.route, false)
.build()
kiwixMainActivity.navigate(
composeTestRule.activity.navigate(
KiwixDestination.Reader.createRoute(zimFileUri = zimFile.toUri().toString()),
navOptions
)
}
composeTestRule.waitForIdle()
}
@After

View File

@ -39,6 +39,7 @@ import org.kiwix.kiwixmobile.core.main.reader.READER_SCREEN_TESTING_TAG
import org.kiwix.kiwixmobile.core.main.reader.TAB_SWITCHER_VIEW_TESTING_TAG
import org.kiwix.kiwixmobile.core.page.DELETE_MENU_ICON_TESTING_TAG
import org.kiwix.kiwixmobile.core.ui.components.TOOLBAR_TITLE_TESTING_TAG
import org.kiwix.kiwixmobile.core.utils.dialog.ALERT_DIALOG_DISMISS_BUTTON_TESTING_TAG
import org.kiwix.kiwixmobile.core.utils.dialog.ALERT_DIALOG_TITLE_TEXT_TESTING_TAG
import org.kiwix.kiwixmobile.main.BOTTOM_NAV_READER_ITEM_TESTING_TAG
import org.kiwix.kiwixmobile.testutils.TestUtils
@ -198,4 +199,13 @@ class NavigationHistoryRobot : BaseRobot() {
}
})
}
fun clickOnCancelButton(composeTestRule: ComposeContentTestRule) {
testFlakyView({
composeTestRule.apply {
waitUntilTimeout()
onNodeWithTag(ALERT_DIALOG_DISMISS_BUTTON_TESTING_TAG).performClick()
}
})
}
}

View File

@ -114,7 +114,7 @@ class NavigationHistoryTest : BaseActivityTest() {
composeTestRule.apply {
waitForIdle()
runOnUiThread {
kiwixMainActivity.navigate(KiwixDestination.Library.route)
activity.navigate(KiwixDestination.Library.route)
}
}
val loadFileStream =
@ -142,7 +142,7 @@ class NavigationHistoryTest : BaseActivityTest() {
val navOptions = NavOptions.Builder()
.setPopUpTo(KiwixDestination.Reader.route, false)
.build()
kiwixMainActivity.navigate(
activity.navigate(
KiwixDestination.Reader.createRoute(zimFileUri = zimFile.toUri().toString()),
navOptions
)
@ -162,7 +162,7 @@ class NavigationHistoryTest : BaseActivityTest() {
assertForwardNavigationHistoryDialogDisplayed(composeTestRule)
clickOnDeleteHistory(composeTestRule)
assertDeleteDialogDisplayed(composeTestRule)
pressBack()
clickOnCancelButton(composeTestRule)
pressBack()
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1 &&

View File

@ -104,8 +104,12 @@ object ActivityExtensions {
}
private fun <T> Activity.getObservableNavigationResult(key: String = "result") =
coreMainActivity.navController.currentBackStackEntry?.savedStateHandle
?.getLiveData<T>(key)
if (coreMainActivity.isNavControllerInitialized) {
coreMainActivity.navController.currentBackStackEntry?.savedStateHandle
?.getLiveData<T>(key)
} else {
null
}
fun <T> Activity.observeNavigationResult(
key: String,
@ -119,20 +123,28 @@ object ActivityExtensions {
}
fun <T> Activity.consumeObservable(key: String = "result") =
coreMainActivity.navController.currentBackStackEntry?.savedStateHandle?.remove<T>(key)
if (coreMainActivity.isNavControllerInitialized) {
coreMainActivity.navController.currentBackStackEntry?.savedStateHandle?.remove<T>(key)
} else {
// do nothing.
}
fun <T> Activity.setNavigationResult(result: T, key: String = "result") {
coreMainActivity.navController.previousBackStackEntry?.savedStateHandle?.set(
key,
result
)
if (coreMainActivity.isNavControllerInitialized) {
coreMainActivity.navController.previousBackStackEntry?.savedStateHandle?.set(
key,
result
)
}
}
fun <T> Activity.setNavigationResultOnCurrent(result: T, key: String = "result") {
coreMainActivity.navController.currentBackStackEntry?.savedStateHandle?.set(
key,
result
)
if (coreMainActivity.isNavControllerInitialized) {
coreMainActivity.navController.currentBackStackEntry?.savedStateHandle?.set(
key,
result
)
}
}
fun Activity.hasNotificationPermission(sharedPreferenceUtil: SharedPreferenceUtil?) =
@ -181,16 +193,6 @@ object ActivityExtensions {
fun Activity.isLandScapeMode(): Boolean =
resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
@Suppress("MagicNumber")
fun Activity.isTablet(): Boolean {
val configuration = resources.configuration
val isLargeOrXLarge =
configuration.screenLayout and
Configuration.SCREENLAYOUT_SIZE_MASK >= Configuration.SCREENLAYOUT_SIZE_LARGE
val isWideEnough = configuration.smallestScreenWidthDp >= 600
return isLargeOrXLarge && isWideEnough
}
/**
* Sets the window background color to black for Android 15 and above.
*

View File

@ -118,6 +118,8 @@ abstract class CoreMainActivity : BaseActivity(), WebViewProvider {
* is responsibility of child activities such as KiwixMainActivity, and CustomMainActivity.
*/
lateinit var navController: NavHostController
val isNavControllerInitialized: Boolean
get() = ::navController.isInitialized
/**
* For managing the leftDrawer.