From e776036f7d728dd7f1f8a37770aa308fcd5da4ae Mon Sep 17 00:00:00 2001 From: TM Date: Fri, 24 May 2024 15:56:53 -0700 Subject: [PATCH] Expose list of error messages instead of single current Updated tests to match --- .../apps/nowinandroid/ui/NiaAppState.kt | 12 +++++++----- .../core/data/test/FakeErrorMonitor.kt | 4 ++-- .../core/data/util/ErrorMonitor.kt | 2 +- .../core/data/util/SnackbarErrorMonitor.kt | 13 ++++--------- .../core/data/util/SnackbarErrorMonitorTest.kt | 18 +++++++++--------- .../core/testing/util/TestErrorMonitor.kt | 4 ++-- 6 files changed, 25 insertions(+), 28 deletions(-) diff --git a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt index c4b3e12c6..1fb1427a4 100644 --- a/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt +++ b/app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt @@ -110,11 +110,13 @@ class NiaAppState( initialValue = false, ) - val snackbarMessage = errorMessage.stateIn( - scope = coroutineScope, - started = SharingStarted.WhileSubscribed(5_000), - initialValue = null, - ) + val snackbarMessage = errorMessages + .map { it.firstOrNull() } + .stateIn( + scope = coroutineScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = null, + ) /** * Map of top level destinations to be used in the TopBar, BottomBar and NavRail. The key is the diff --git a/core/data-test/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/test/FakeErrorMonitor.kt b/core/data-test/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/test/FakeErrorMonitor.kt index 832edb52c..cafa1d84a 100644 --- a/core/data-test/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/test/FakeErrorMonitor.kt +++ b/core/data-test/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/test/FakeErrorMonitor.kt @@ -31,6 +31,6 @@ class FakeErrorMonitor @Inject constructor() : ErrorMonitor { // Do nothing } - override val errorMessage: Flow - get() = flowOf(null) + override val errorMessages: Flow> + get() = flowOf(emptyList()) } diff --git a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ErrorMonitor.kt b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ErrorMonitor.kt index 588f7465c..02e689507 100644 --- a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ErrorMonitor.kt +++ b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/ErrorMonitor.kt @@ -24,5 +24,5 @@ import kotlinx.coroutines.flow.Flow interface ErrorMonitor { fun addErrorMessage(error: String): String? fun clearErrorMessage(id: String) - val errorMessage: Flow + val errorMessages: Flow> } diff --git a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/SnackbarErrorMonitor.kt b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/SnackbarErrorMonitor.kt index 6b8c232ed..5ee0ebe37 100644 --- a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/SnackbarErrorMonitor.kt +++ b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util/SnackbarErrorMonitor.kt @@ -18,7 +18,6 @@ package com.google.samples.apps.nowinandroid.core.data.util import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.update import java.util.UUID import javax.inject.Inject @@ -31,12 +30,8 @@ class SnackbarErrorMonitor @Inject constructor() : ErrorMonitor { /** * List of [ErrorMessage] to be shown to the user, via Snackbar. */ - private val errorMessages = MutableStateFlow>(emptyList()) - - /** - * Current [ErrorMessage] or null if there are none. - */ - override val errorMessage: Flow = errorMessages.map { it.firstOrNull() } + private val _errorMessages = MutableStateFlow>(emptyList()) + override val errorMessages: Flow> = _errorMessages /** * Creates an [ErrorMessage] from String value and adds it to the list. @@ -49,7 +44,7 @@ class SnackbarErrorMonitor @Inject constructor() : ErrorMonitor { override fun addErrorMessage(error: String): String? { if (error.isNotBlank()) { val newError = ErrorMessage(error) - errorMessages.update { it + newError } + _errorMessages.update { it + newError } return newError.id } return null @@ -59,7 +54,7 @@ class SnackbarErrorMonitor @Inject constructor() : ErrorMonitor { * Removes the [ErrorMessage] with the specified [id] from the list. */ override fun clearErrorMessage(id: String) { - errorMessages.update { it.filter { item -> item.id != id } } + _errorMessages.update { it.filter { item -> item.id != id } } } } diff --git a/core/data/src/test/kotlin/com/google/samples/apps/nowinandroid/core/data/util/SnackbarErrorMonitorTest.kt b/core/data/src/test/kotlin/com/google/samples/apps/nowinandroid/core/data/util/SnackbarErrorMonitorTest.kt index 43663f023..639b89092 100644 --- a/core/data/src/test/kotlin/com/google/samples/apps/nowinandroid/core/data/util/SnackbarErrorMonitorTest.kt +++ b/core/data/src/test/kotlin/com/google/samples/apps/nowinandroid/core/data/util/SnackbarErrorMonitorTest.kt @@ -36,7 +36,7 @@ class SnackbarErrorMonitorTest { @Test fun whenErrorIsNotAdded_NullIsPresent() = runTest(UnconfinedTestDispatcher()) { - backgroundScope.launch { state.errorMessage.collect() } + backgroundScope.launch { state.errorMessages.collect() } assertEquals( null, message, @@ -46,8 +46,8 @@ class SnackbarErrorMonitorTest { @Test fun whenErrorIsAdded_ErrorMessageIsPresent() = runTest(UnconfinedTestDispatcher()) { backgroundScope.launch { - state.errorMessage.collect { - message = it + state.errorMessages.collect { + message = it.firstOrNull() } } @@ -66,8 +66,8 @@ class SnackbarErrorMonitorTest { state.addErrorMessage("Test Error Message 2") backgroundScope.launch { - state.errorMessage.collect { - message = it + state.errorMessages.collect { + message = it.firstOrNull() } } @@ -81,8 +81,8 @@ class SnackbarErrorMonitorTest { fun whenErrorIsCleared_ErrorMessageIsNotPresent() = runTest(UnconfinedTestDispatcher()) { backgroundScope.launch { - state.errorMessage.collect { - message = it + state.errorMessages.collect { + message = it.firstOrNull() } } val id = state.addErrorMessage("Test Error Message 1") @@ -99,8 +99,8 @@ class SnackbarErrorMonitorTest { fun whenErrorsAreCleared_NextErrorMessageIsPresent() = runTest(UnconfinedTestDispatcher()) { backgroundScope.launch { - state.errorMessage.collect { - message = it + state.errorMessages.collect { + message = it.firstOrNull() } } val id1 = state.addErrorMessage("Test Error Message 1") 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 index 27af99390..b63bf2c02 100644 --- 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 @@ -30,6 +30,6 @@ class TestErrorMonitor : ErrorMonitor { // Do nothing } - override val errorMessage: Flow - get() = flowOf(ErrorMessage("Error Message", "1")) + override val errorMessages: Flow> + get() = flowOf(listOf(ErrorMessage("Error Message", "1"))) }