From 18c57eb93741da7b44018c9f7e34d42cfdf06e5a Mon Sep 17 00:00:00 2001 From: TM Date: Thu, 23 May 2024 21:08:25 -0700 Subject: [PATCH] Create TestErrorMonitor, Update NiaAppStateTest --- .../apps/nowinandroid/ui/NiaAppStateTest.kt | 96 ++----------------- .../core/testing/util/TestErrorMonitor.kt | 35 +++++++ 2 files changed, 43 insertions(+), 88 deletions(-) create mode 100644 core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/TestErrorMonitor.kt diff --git a/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt b/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt index 2231d2206..ef5c81566 100644 --- a/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt +++ b/app/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt @@ -29,6 +29,7 @@ import androidx.navigation.testing.TestNavHostController import com.google.samples.apps.nowinandroid.core.data.repository.CompositeUserNewsResourceRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestNewsRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository +import com.google.samples.apps.nowinandroid.core.testing.util.TestErrorMonitor import com.google.samples.apps.nowinandroid.core.testing.util.TestNetworkMonitor import com.google.samples.apps.nowinandroid.core.testing.util.TestTimeZoneMonitor import kotlinx.coroutines.flow.collect @@ -55,6 +56,8 @@ class NiaAppStateTest { // Create the test dependencies. private val networkMonitor = TestNetworkMonitor() + private val errorMonitor = TestErrorMonitor() + private val timeZoneMonitor = TestTimeZoneMonitor() private val userNewsResourceRepository = @@ -74,6 +77,7 @@ class NiaAppStateTest { navController = navController, coroutineScope = backgroundScope, networkMonitor = networkMonitor, + errorMonitor = errorMonitor, userNewsResourceRepository = userNewsResourceRepository, timeZoneMonitor = timeZoneMonitor, ) @@ -96,6 +100,7 @@ class NiaAppStateTest { composeTestRule.setContent { state = rememberNiaAppState( networkMonitor = networkMonitor, + errorMonitor = errorMonitor, userNewsResourceRepository = userNewsResourceRepository, timeZoneMonitor = timeZoneMonitor, ) @@ -114,6 +119,7 @@ class NiaAppStateTest { navController = NavHostController(LocalContext.current), coroutineScope = backgroundScope, networkMonitor = networkMonitor, + errorMonitor = errorMonitor, userNewsResourceRepository = userNewsResourceRepository, timeZoneMonitor = timeZoneMonitor, ) @@ -134,6 +140,7 @@ class NiaAppStateTest { navController = NavHostController(LocalContext.current), coroutineScope = backgroundScope, networkMonitor = networkMonitor, + errorMonitor = errorMonitor, userNewsResourceRepository = userNewsResourceRepository, timeZoneMonitor = timeZoneMonitor, ) @@ -154,6 +161,7 @@ class NiaAppStateTest { navController = NavHostController(LocalContext.current), coroutineScope = backgroundScope, networkMonitor = networkMonitor, + errorMonitor = errorMonitor, userNewsResourceRepository = userNewsResourceRepository, timeZoneMonitor = timeZoneMonitor, @@ -166,94 +174,6 @@ class NiaAppStateTest { state.errorMessage.value, ) } - - @Test - fun niaAppState_whenErrorIsAdded_ErrorMessageIsPresent() = runTest(UnconfinedTestDispatcher()) { - composeTestRule.setContent { - state = NiaAppState( - navController = NavHostController(LocalContext.current), - coroutineScope = backgroundScope, - networkMonitor = networkMonitor, - userNewsResourceRepository = userNewsResourceRepository, - timeZoneMonitor = timeZoneMonitor, - ) - } - - backgroundScope.launch { state.errorMessage.collect() } - val id = state.addErrorMessage("Test Error Message") - assertEquals( - id, - state.errorMessage.value?.id, - ) - } - - @Test - fun niaAppState_whenErrorsAreAdded_FirstErrorMessageIsPresent() = runTest(UnconfinedTestDispatcher()) { - composeTestRule.setContent { - state = NiaAppState( - navController = NavHostController(LocalContext.current), - coroutineScope = backgroundScope, - networkMonitor = networkMonitor, - userNewsResourceRepository = userNewsResourceRepository, - timeZoneMonitor = timeZoneMonitor, - ) - } - - backgroundScope.launch { state.errorMessage.collect() } - val id1 = state.addErrorMessage("Test Error Message 1") - val id2 = state.addErrorMessage("Test Error Message 2") - assertEquals( - id1, - state.errorMessage.value?.id, - ) - } - - @Test - fun niaAppState_whenErrorIsCleared_ErrorMessageIsNotPresent() = runTest(UnconfinedTestDispatcher()) { - composeTestRule.setContent { - state = NiaAppState( - navController = NavHostController(LocalContext.current), - coroutineScope = backgroundScope, - networkMonitor = networkMonitor, - userNewsResourceRepository = userNewsResourceRepository, - timeZoneMonitor = timeZoneMonitor, - ) - } - - backgroundScope.launch { state.errorMessage.collect() } - val id = state.addErrorMessage("Test Error Message 1") - if (id != null) { - state.clearErrorMessage(id) - assertEquals( - null, - state.errorMessage.value, - ) - } - } - - @Test - fun niaAppState_whenErrorsAreCleared_NextErrorMessageIsPresent() = runTest(UnconfinedTestDispatcher()) { - composeTestRule.setContent { - state = NiaAppState( - navController = NavHostController(LocalContext.current), - coroutineScope = backgroundScope, - networkMonitor = networkMonitor, - userNewsResourceRepository = userNewsResourceRepository, - timeZoneMonitor = timeZoneMonitor, - ) - } - - backgroundScope.launch { state.errorMessage.collect() } - val id1 = state.addErrorMessage("Test Error Message 1") - val id2 = state.addErrorMessage("Test Error Message 2") - if (id1 != null) { - state.clearErrorMessage(id1) - assertEquals( - id2, - state.errorMessage.value?.id, - ) - } - } } @Composable diff --git a/core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/TestErrorMonitor.kt b/core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/TestErrorMonitor.kt new file mode 100644 index 000000000..ca8e255ef --- /dev/null +++ b/core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/TestErrorMonitor.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.testing.util; + +import com.google.samples.apps.nowinandroid.core.data.util.ErrorMessage +import com.google.samples.apps.nowinandroid.core.data.util.ErrorMonitor +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf + +class TestErrorMonitor : ErrorMonitor { + override fun addErrorMessage(error: String): String? { + return "1" + } + + override fun clearErrorMessage(id: String) { + // Do nothing + } + + override val errorMessage: Flow + get() = flowOf(ErrorMessage("Error Message", "1")) +}