From f7c1490ee2ce3a43ff8249e2be6a6f807d035004 Mon Sep 17 00:00:00 2001 From: yongsuk44 Date: Tue, 26 Mar 2024 18:31:05 +0900 Subject: [PATCH] Refactor tests to remove usage of 'setUserData' in 'TestUserDataRepository' --- ...CompositeUserNewsResourceRepositoryTest.kt | 58 ++++++------------- .../repository/TestUserDataRepository.kt | 6 -- .../feature/foryou/ForYouViewModelTest.kt | 33 ++++------- .../feature/search/SearchViewModelTest.kt | 3 +- 4 files changed, 29 insertions(+), 71 deletions(-) diff --git a/core/data/src/test/kotlin/com/google/samples/apps/nowinandroid/core/data/CompositeUserNewsResourceRepositoryTest.kt b/core/data/src/test/kotlin/com/google/samples/apps/nowinandroid/core/data/CompositeUserNewsResourceRepositoryTest.kt index 05811f4be..4b5e7a5f8 100644 --- a/core/data/src/test/kotlin/com/google/samples/apps/nowinandroid/core/data/CompositeUserNewsResourceRepositoryTest.kt +++ b/core/data/src/test/kotlin/com/google/samples/apps/nowinandroid/core/data/CompositeUserNewsResourceRepositoryTest.kt @@ -17,13 +17,11 @@ package com.google.samples.apps.nowinandroid.core.data import com.google.samples.apps.nowinandroid.core.data.repository.CompositeUserNewsResourceRepository -import com.google.samples.apps.nowinandroid.core.data.repository.NewsResourceQuery import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.model.data.mapToUserNewsResources 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.repository.emptyUserData import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import kotlinx.datetime.Instant @@ -42,23 +40,16 @@ class CompositeUserNewsResourceRepositoryTest { @Test fun whenNoFilters_allNewsResourcesAreReturned() = runTest { - // Obtain the user news resources flow. + // Obtain the user news resources flow without any filters applied. val userNewsResources = userNewsResourceRepository.observeAll() - // Send some news resources and user data into the data repositories. + // Send test data into the repositories. newsRepository.sendNewsResources(sampleNewsResources) + userDataRepository.setFollowedTopicIds(emptySet()) - // Construct the test user data with bookmarks and followed topics. - val userData = emptyUserData.copy( - bookmarkedNewsResources = setOf(sampleNewsResources[0].id, sampleNewsResources[2].id), - followedTopics = setOf(sampleTopic1.id), - ) - - userDataRepository.setUserData(userData) - - // Check that the correct news resources are returned with their bookmarked state. + // Check that the correct list of news resources is returned. assertEquals( - sampleNewsResources.mapToUserNewsResources(userData), + sampleNewsResources.mapToUserNewsResources(userDataRepository.userData.first()), userNewsResources.first(), ) } @@ -66,46 +57,35 @@ class CompositeUserNewsResourceRepositoryTest { @Test fun whenFilteredByTopicId_matchingNewsResourcesAreReturned() = runTest { // Obtain a stream of user news resources for the given topic id. - val userNewsResources = - userNewsResourceRepository.observeAll( - NewsResourceQuery( - filterTopicIds = setOf( - sampleTopic1.id, - ), - ), - ) + val userNewsResources = userNewsResourceRepository.observeAllForFollowedTopics() // Send test data into the repositories. newsRepository.sendNewsResources(sampleNewsResources) - userDataRepository.setUserData(emptyUserData) + userDataRepository.setTopicIdFollowed(sampleTopic1.id, true) // Check that only news resources with the given topic id are returned. assertEquals( sampleNewsResources .filter { sampleTopic1 in it.topics } - .mapToUserNewsResources(emptyUserData), + .mapToUserNewsResources(userDataRepository.userData.first()), userNewsResources.first(), ) } @Test fun whenFilteredByFollowedTopics_matchingNewsResourcesAreReturned() = runTest { - // Obtain a stream of user news resources for the given topic id. - val userNewsResources = - userNewsResourceRepository.observeAllForFollowedTopics() + // Obtain a stream of user news resources filtered by followed topics + val userNewsResources = userNewsResourceRepository.observeAllForFollowedTopics() // Send test data into the repositories. - val userData = emptyUserData.copy( - followedTopics = setOf(sampleTopic1.id), - ) newsRepository.sendNewsResources(sampleNewsResources) - userDataRepository.setUserData(userData) + userDataRepository.setFollowedTopicIds(setOf(sampleTopic1.id)) - // Check that only news resources with the given topic id are returned. + // Check that only news resources with the followed topics are returned. assertEquals( sampleNewsResources .filter { sampleTopic1 in it.topics } - .mapToUserNewsResources(userData), + .mapToUserNewsResources(userDataRepository.userData.first()), userNewsResources.first(), ) } @@ -119,16 +99,14 @@ class CompositeUserNewsResourceRepositoryTest { newsRepository.sendNewsResources(sampleNewsResources) // Construct the test user data with bookmarks and followed topics. - val userData = emptyUserData.copy( - bookmarkedNewsResources = setOf(sampleNewsResources[0].id, sampleNewsResources[2].id), - followedTopics = setOf(sampleTopic1.id), - ) - - userDataRepository.setUserData(userData) + userDataRepository.setNewsResourceBookmarked(sampleNewsResources[0].id, true) + userDataRepository.setNewsResourceBookmarked(sampleNewsResources[2].id, true) + userDataRepository.setFollowedTopicIds(setOf(sampleTopic1.id)) // Check that the correct news resources are returned with their bookmarked state. assertEquals( - listOf(sampleNewsResources[0], sampleNewsResources[2]).mapToUserNewsResources(userData), + listOf(sampleNewsResources[0], sampleNewsResources[2]) + .mapToUserNewsResources(userDataRepository.userData.first()), userNewsResources.first(), ) } diff --git a/core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt b/core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt index f867ff983..0b2013db3 100644 --- a/core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt +++ b/core/testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt @@ -24,7 +24,6 @@ import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.filterNotNull -import org.jetbrains.annotations.TestOnly val emptyUserData = UserData( bookmarkedNewsResources = emptySet(), @@ -109,9 +108,4 @@ class TestUserDataRepository : UserDataRepository { _userData.tryEmit(current.copy(shouldHideOnboarding = shouldHideOnboarding)) } } - - @TestOnly - fun setUserData(userData: UserData) { - _userData.tryEmit(userData) - } } diff --git a/feature/foryou/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt b/feature/foryou/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt index 90ffbe1a5..e41bc0c26 100644 --- a/feature/foryou/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt +++ b/feature/foryou/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt @@ -29,7 +29,6 @@ import com.google.samples.apps.nowinandroid.core.model.data.mapToUserNewsResourc import com.google.samples.apps.nowinandroid.core.testing.repository.TestNewsRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestTopicsRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository -import com.google.samples.apps.nowinandroid.core.testing.repository.emptyUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.core.testing.util.TestAnalyticsHelper import com.google.samples.apps.nowinandroid.core.testing.util.TestSyncManager @@ -277,8 +276,7 @@ class ForYouViewModelTest { topicsRepository.sendTopics(sampleTopics) val followedTopicIds = setOf("0", "1") - val userData = emptyUserData.copy(followedTopics = followedTopicIds) - userDataRepository.setUserData(userData) + userDataRepository.setFollowedTopicIds(followedTopicIds) viewModel.dismissOnboarding() assertEquals( @@ -295,7 +293,7 @@ class ForYouViewModelTest { ) assertEquals( NewsFeedUiState.Success( - feed = sampleNewsResources.mapToUserNewsResources(userData), + feed = sampleNewsResources.mapToUserNewsResources(userDataRepository.userData.first()), ), viewModel.feedState.value, ) @@ -341,13 +339,11 @@ class ForYouViewModelTest { viewModel.onboardingUiState.value, ) - val userData = emptyUserData.copy(followedTopics = setOf(followedTopicId)) - assertEquals( NewsFeedUiState.Success( feed = listOf( - UserNewsResource(sampleNewsResources[1], userData), - UserNewsResource(sampleNewsResources[2], userData), + UserNewsResource(newsResource = sampleNewsResources[1], userData = userDataRepository.userData.first()), + UserNewsResource(newsResource = sampleNewsResources[2], userData = userDataRepository.userData.first()), ), ), viewModel.feedState.value, @@ -427,14 +423,9 @@ class ForYouViewModelTest { launch(UnconfinedTestDispatcher()) { viewModel.onboardingUiState.collect() } val collectJob2 = launch(UnconfinedTestDispatcher()) { viewModel.feedState.collect() } - val followedTopicIds = setOf("1") - val userData = emptyUserData.copy( - followedTopics = followedTopicIds, - shouldHideOnboarding = true, - ) - topicsRepository.sendTopics(sampleTopics) - userDataRepository.setUserData(userData) + userDataRepository.setFollowedTopicIds(setOf("1")) + userDataRepository.setShouldHideOnboarding(true) newsRepository.sendNewsResources(sampleNewsResources) val bookmarkedNewsResourceId = "2" @@ -443,10 +434,6 @@ class ForYouViewModelTest { isChecked = true, ) - val userDataExpected = userData.copy( - bookmarkedNewsResources = setOf(bookmarkedNewsResourceId), - ) - assertEquals( OnboardingUiState.NotShown, viewModel.onboardingUiState.value, @@ -454,8 +441,8 @@ class ForYouViewModelTest { assertEquals( NewsFeedUiState.Success( feed = listOf( - UserNewsResource(newsResource = sampleNewsResources[1], userDataExpected), - UserNewsResource(newsResource = sampleNewsResources[2], userDataExpected), + UserNewsResource(newsResource = sampleNewsResources[1], userData = userDataRepository.userData.first()), + UserNewsResource(newsResource = sampleNewsResources[2], userData = userDataRepository.userData.first()), ), ), viewModel.feedState.value, @@ -471,13 +458,13 @@ class ForYouViewModelTest { launch(UnconfinedTestDispatcher()) { viewModel.deepLinkedNewsResource.collect() } newsRepository.sendNewsResources(sampleNewsResources) - userDataRepository.setUserData(emptyUserData) + userDataRepository.setFollowedTopicIds(emptySet()) savedStateHandle[LINKED_NEWS_RESOURCE_ID] = sampleNewsResources.first().id assertEquals( expected = UserNewsResource( newsResource = sampleNewsResources.first(), - userData = emptyUserData, + userData = userDataRepository.userData.first(), ), actual = viewModel.deepLinkedNewsResource.value, ) diff --git a/feature/search/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt b/feature/search/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt index 438c4a859..128a98206 100644 --- a/feature/search/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt +++ b/feature/search/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/search/SearchViewModelTest.kt @@ -26,7 +26,6 @@ import com.google.samples.apps.nowinandroid.core.testing.data.topicsTestData import com.google.samples.apps.nowinandroid.core.testing.repository.TestRecentSearchRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestSearchContentsRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository -import com.google.samples.apps.nowinandroid.core.testing.repository.emptyUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.feature.search.RecentSearchQueriesUiState.Success import com.google.samples.apps.nowinandroid.feature.search.SearchResultUiState.EmptyQuery @@ -76,7 +75,6 @@ class SearchViewModelTest { userDataRepository = userDataRepository, analyticsHelper = NoOpAnalyticsHelper(), ) - userDataRepository.setUserData(emptyUserData) } @Test @@ -104,6 +102,7 @@ class SearchViewModelTest { viewModel.onSearchQueryChanged("XXX") searchContentsRepository.addNewsResources(newsResourcesTestData) searchContentsRepository.addTopics(topicsTestData) + userDataRepository.setFollowedTopicIds(emptySet()) val result = viewModel.searchResultUiState.value assertIs(result)