From e86cdea381d4233221ad57d342b67ecd7600c80c Mon Sep 17 00:00:00 2001 From: Don Turner Date: Mon, 30 Jan 2023 12:54:11 +0000 Subject: [PATCH] Add unit tests and comments --- .../domain/GetUserNewsResourcesUseCase.kt | 7 ++- .../domain/GetUserNewsResourcesUseCaseTest.kt | 49 +++++++++++++++++++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt index d4ef20ca9..fdb9eb6d9 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt @@ -63,7 +63,6 @@ class GetFollowedUserNewsResourcesUseCase @Inject constructor( * Returns a list of UserNewsResources for topics which the user is following */ operator fun invoke(): Flow> = - /** * This sequence of flow transformation functions does the following: * @@ -72,9 +71,9 @@ class GetFollowedUserNewsResourcesUseCase @Inject constructor( * - distinctUntilChanged: will only emit a set of followed topic IDs if it's changed. This * avoids calling potentially expensive operations (like setting up a new flow) when nothing * has changed. - * - flatMapLatest: getUserNewsResources returns a flow, so we end up with a flow inside a - * flow. flatMapLatest solves this and cancels any previous flows created by - * getUserNewsResources. + * - flatMapLatest: getUserNewsResources returns a flow, so we have a flow inside a + * flow. flatMapLatest moves the inner flow (the one we want to return) to the outer flow + * and cancels any previous flows created by getUserNewsResources. */ userDataRepository.userData .map { userData -> diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt index 32ee8773c..8674c4026 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt @@ -83,6 +83,55 @@ class GetUserNewsResourcesUseCaseTest { } } +class GetFollowedUserNewsResourcesUseCaseTest { + + @get:Rule + val mainDispatcherRule = MainDispatcherRule() + + private val newsRepository = TestNewsRepository() + private val userDataRepository = TestUserDataRepository() + private val getUserNewsResourcesUseCase = + GetUserNewsResourcesUseCase(newsRepository, userDataRepository) + + val useCase = + GetFollowedUserNewsResourcesUseCase(userDataRepository, getUserNewsResourcesUseCase) + + @Test + fun whenOnboardingShownAndNoTopicsFollowed_emptyListIsReturned() = runTest { + val followedNewsResources = useCase() + + // Send some news resources and empty user data + newsRepository.sendNewsResources(sampleNewsResources) + userDataRepository.setUserData(emptyUserData) + + // Check that an empty list is returned + assertEquals( + emptyList(), + followedNewsResources.first(), + ) + } + + @Test + fun whenTopicsAreFollowed_correctNewsResourcesAreReturned() = runTest { + val followedNewsResources = useCase() + + // Send some news resources and user data with a followed topic + newsRepository.sendNewsResources(sampleNewsResources) + + val userData = emptyUserData.copy( + followedTopics = setOf(sampleTopic1.id), + ) + userDataRepository.setUserData(userData) + + assertEquals( + sampleNewsResources + .filter { it.topics.contains(sampleTopic1) } + .mapToUserNewsResources(userData), + followedNewsResources.first(), + ) + } +} + private val sampleTopic1 = Topic( id = "Topic1", name = "Headlines",