Refactor tests to remove usage of 'setUserData' in 'TestUserDataRepository'

pull/1320/head
yongsuk44 2 years ago
parent 8d008fba53
commit f7c1490ee2

@ -17,13 +17,11 @@
package com.google.samples.apps.nowinandroid.core.data 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.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.NewsResource
import com.google.samples.apps.nowinandroid.core.model.data.Topic 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.model.data.mapToUserNewsResources
import com.google.samples.apps.nowinandroid.core.testing.repository.TestNewsRepository 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.TestUserDataRepository
import com.google.samples.apps.nowinandroid.core.testing.repository.emptyUserData
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import kotlinx.datetime.Instant import kotlinx.datetime.Instant
@ -42,23 +40,16 @@ class CompositeUserNewsResourceRepositoryTest {
@Test @Test
fun whenNoFilters_allNewsResourcesAreReturned() = runTest { fun whenNoFilters_allNewsResourcesAreReturned() = runTest {
// Obtain the user news resources flow. // Obtain the user news resources flow without any filters applied.
val userNewsResources = userNewsResourceRepository.observeAll() val userNewsResources = userNewsResourceRepository.observeAll()
// Send some news resources and user data into the data repositories. // Send test data into the repositories.
newsRepository.sendNewsResources(sampleNewsResources) newsRepository.sendNewsResources(sampleNewsResources)
userDataRepository.setFollowedTopicIds(emptySet())
// Construct the test user data with bookmarks and followed topics. // Check that the correct list of news resources is returned.
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.
assertEquals( assertEquals(
sampleNewsResources.mapToUserNewsResources(userData), sampleNewsResources.mapToUserNewsResources(userDataRepository.userData.first()),
userNewsResources.first(), userNewsResources.first(),
) )
} }
@ -66,46 +57,35 @@ class CompositeUserNewsResourceRepositoryTest {
@Test @Test
fun whenFilteredByTopicId_matchingNewsResourcesAreReturned() = runTest { fun whenFilteredByTopicId_matchingNewsResourcesAreReturned() = runTest {
// Obtain a stream of user news resources for the given topic id. // Obtain a stream of user news resources for the given topic id.
val userNewsResources = val userNewsResources = userNewsResourceRepository.observeAllForFollowedTopics()
userNewsResourceRepository.observeAll(
NewsResourceQuery(
filterTopicIds = setOf(
sampleTopic1.id,
),
),
)
// Send test data into the repositories. // Send test data into the repositories.
newsRepository.sendNewsResources(sampleNewsResources) newsRepository.sendNewsResources(sampleNewsResources)
userDataRepository.setUserData(emptyUserData) userDataRepository.setTopicIdFollowed(sampleTopic1.id, true)
// Check that only news resources with the given topic id are returned. // Check that only news resources with the given topic id are returned.
assertEquals( assertEquals(
sampleNewsResources sampleNewsResources
.filter { sampleTopic1 in it.topics } .filter { sampleTopic1 in it.topics }
.mapToUserNewsResources(emptyUserData), .mapToUserNewsResources(userDataRepository.userData.first()),
userNewsResources.first(), userNewsResources.first(),
) )
} }
@Test @Test
fun whenFilteredByFollowedTopics_matchingNewsResourcesAreReturned() = runTest { fun whenFilteredByFollowedTopics_matchingNewsResourcesAreReturned() = runTest {
// Obtain a stream of user news resources for the given topic id. // Obtain a stream of user news resources filtered by followed topics
val userNewsResources = val userNewsResources = userNewsResourceRepository.observeAllForFollowedTopics()
userNewsResourceRepository.observeAllForFollowedTopics()
// Send test data into the repositories. // Send test data into the repositories.
val userData = emptyUserData.copy(
followedTopics = setOf(sampleTopic1.id),
)
newsRepository.sendNewsResources(sampleNewsResources) 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( assertEquals(
sampleNewsResources sampleNewsResources
.filter { sampleTopic1 in it.topics } .filter { sampleTopic1 in it.topics }
.mapToUserNewsResources(userData), .mapToUserNewsResources(userDataRepository.userData.first()),
userNewsResources.first(), userNewsResources.first(),
) )
} }
@ -119,16 +99,14 @@ class CompositeUserNewsResourceRepositoryTest {
newsRepository.sendNewsResources(sampleNewsResources) newsRepository.sendNewsResources(sampleNewsResources)
// Construct the test user data with bookmarks and followed topics. // Construct the test user data with bookmarks and followed topics.
val userData = emptyUserData.copy( userDataRepository.setNewsResourceBookmarked(sampleNewsResources[0].id, true)
bookmarkedNewsResources = setOf(sampleNewsResources[0].id, sampleNewsResources[2].id), userDataRepository.setNewsResourceBookmarked(sampleNewsResources[2].id, true)
followedTopics = setOf(sampleTopic1.id), userDataRepository.setFollowedTopicIds(setOf(sampleTopic1.id))
)
userDataRepository.setUserData(userData)
// Check that the correct news resources are returned with their bookmarked state. // Check that the correct news resources are returned with their bookmarked state.
assertEquals( assertEquals(
listOf(sampleNewsResources[0], sampleNewsResources[2]).mapToUserNewsResources(userData), listOf(sampleNewsResources[0], sampleNewsResources[2])
.mapToUserNewsResources(userDataRepository.userData.first()),
userNewsResources.first(), userNewsResources.first(),
) )
} }

@ -24,7 +24,6 @@ import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.filterNotNull
import org.jetbrains.annotations.TestOnly
val emptyUserData = UserData( val emptyUserData = UserData(
bookmarkedNewsResources = emptySet(), bookmarkedNewsResources = emptySet(),
@ -109,9 +108,4 @@ class TestUserDataRepository : UserDataRepository {
_userData.tryEmit(current.copy(shouldHideOnboarding = shouldHideOnboarding)) _userData.tryEmit(current.copy(shouldHideOnboarding = shouldHideOnboarding))
} }
} }
@TestOnly
fun setUserData(userData: UserData) {
_userData.tryEmit(userData)
}
} }

@ -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.TestNewsRepository
import com.google.samples.apps.nowinandroid.core.testing.repository.TestTopicsRepository 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.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.MainDispatcherRule
import com.google.samples.apps.nowinandroid.core.testing.util.TestAnalyticsHelper import com.google.samples.apps.nowinandroid.core.testing.util.TestAnalyticsHelper
import com.google.samples.apps.nowinandroid.core.testing.util.TestSyncManager import com.google.samples.apps.nowinandroid.core.testing.util.TestSyncManager
@ -277,8 +276,7 @@ class ForYouViewModelTest {
topicsRepository.sendTopics(sampleTopics) topicsRepository.sendTopics(sampleTopics)
val followedTopicIds = setOf("0", "1") val followedTopicIds = setOf("0", "1")
val userData = emptyUserData.copy(followedTopics = followedTopicIds) userDataRepository.setFollowedTopicIds(followedTopicIds)
userDataRepository.setUserData(userData)
viewModel.dismissOnboarding() viewModel.dismissOnboarding()
assertEquals( assertEquals(
@ -295,7 +293,7 @@ class ForYouViewModelTest {
) )
assertEquals( assertEquals(
NewsFeedUiState.Success( NewsFeedUiState.Success(
feed = sampleNewsResources.mapToUserNewsResources(userData), feed = sampleNewsResources.mapToUserNewsResources(userDataRepository.userData.first()),
), ),
viewModel.feedState.value, viewModel.feedState.value,
) )
@ -341,13 +339,11 @@ class ForYouViewModelTest {
viewModel.onboardingUiState.value, viewModel.onboardingUiState.value,
) )
val userData = emptyUserData.copy(followedTopics = setOf(followedTopicId))
assertEquals( assertEquals(
NewsFeedUiState.Success( NewsFeedUiState.Success(
feed = listOf( feed = listOf(
UserNewsResource(sampleNewsResources[1], userData), UserNewsResource(newsResource = sampleNewsResources[1], userData = userDataRepository.userData.first()),
UserNewsResource(sampleNewsResources[2], userData), UserNewsResource(newsResource = sampleNewsResources[2], userData = userDataRepository.userData.first()),
), ),
), ),
viewModel.feedState.value, viewModel.feedState.value,
@ -427,14 +423,9 @@ class ForYouViewModelTest {
launch(UnconfinedTestDispatcher()) { viewModel.onboardingUiState.collect() } launch(UnconfinedTestDispatcher()) { viewModel.onboardingUiState.collect() }
val collectJob2 = launch(UnconfinedTestDispatcher()) { viewModel.feedState.collect() } val collectJob2 = launch(UnconfinedTestDispatcher()) { viewModel.feedState.collect() }
val followedTopicIds = setOf("1")
val userData = emptyUserData.copy(
followedTopics = followedTopicIds,
shouldHideOnboarding = true,
)
topicsRepository.sendTopics(sampleTopics) topicsRepository.sendTopics(sampleTopics)
userDataRepository.setUserData(userData) userDataRepository.setFollowedTopicIds(setOf("1"))
userDataRepository.setShouldHideOnboarding(true)
newsRepository.sendNewsResources(sampleNewsResources) newsRepository.sendNewsResources(sampleNewsResources)
val bookmarkedNewsResourceId = "2" val bookmarkedNewsResourceId = "2"
@ -443,10 +434,6 @@ class ForYouViewModelTest {
isChecked = true, isChecked = true,
) )
val userDataExpected = userData.copy(
bookmarkedNewsResources = setOf(bookmarkedNewsResourceId),
)
assertEquals( assertEquals(
OnboardingUiState.NotShown, OnboardingUiState.NotShown,
viewModel.onboardingUiState.value, viewModel.onboardingUiState.value,
@ -454,8 +441,8 @@ class ForYouViewModelTest {
assertEquals( assertEquals(
NewsFeedUiState.Success( NewsFeedUiState.Success(
feed = listOf( feed = listOf(
UserNewsResource(newsResource = sampleNewsResources[1], userDataExpected), UserNewsResource(newsResource = sampleNewsResources[1], userData = userDataRepository.userData.first()),
UserNewsResource(newsResource = sampleNewsResources[2], userDataExpected), UserNewsResource(newsResource = sampleNewsResources[2], userData = userDataRepository.userData.first()),
), ),
), ),
viewModel.feedState.value, viewModel.feedState.value,
@ -471,13 +458,13 @@ class ForYouViewModelTest {
launch(UnconfinedTestDispatcher()) { viewModel.deepLinkedNewsResource.collect() } launch(UnconfinedTestDispatcher()) { viewModel.deepLinkedNewsResource.collect() }
newsRepository.sendNewsResources(sampleNewsResources) newsRepository.sendNewsResources(sampleNewsResources)
userDataRepository.setUserData(emptyUserData) userDataRepository.setFollowedTopicIds(emptySet())
savedStateHandle[LINKED_NEWS_RESOURCE_ID] = sampleNewsResources.first().id savedStateHandle[LINKED_NEWS_RESOURCE_ID] = sampleNewsResources.first().id
assertEquals( assertEquals(
expected = UserNewsResource( expected = UserNewsResource(
newsResource = sampleNewsResources.first(), newsResource = sampleNewsResources.first(),
userData = emptyUserData, userData = userDataRepository.userData.first(),
), ),
actual = viewModel.deepLinkedNewsResource.value, actual = viewModel.deepLinkedNewsResource.value,
) )

@ -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.TestRecentSearchRepository
import com.google.samples.apps.nowinandroid.core.testing.repository.TestSearchContentsRepository 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.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.MainDispatcherRule
import com.google.samples.apps.nowinandroid.feature.search.RecentSearchQueriesUiState.Success import com.google.samples.apps.nowinandroid.feature.search.RecentSearchQueriesUiState.Success
import com.google.samples.apps.nowinandroid.feature.search.SearchResultUiState.EmptyQuery import com.google.samples.apps.nowinandroid.feature.search.SearchResultUiState.EmptyQuery
@ -76,7 +75,6 @@ class SearchViewModelTest {
userDataRepository = userDataRepository, userDataRepository = userDataRepository,
analyticsHelper = NoOpAnalyticsHelper(), analyticsHelper = NoOpAnalyticsHelper(),
) )
userDataRepository.setUserData(emptyUserData)
} }
@Test @Test
@ -104,6 +102,7 @@ class SearchViewModelTest {
viewModel.onSearchQueryChanged("XXX") viewModel.onSearchQueryChanged("XXX")
searchContentsRepository.addNewsResources(newsResourcesTestData) searchContentsRepository.addNewsResources(newsResourcesTestData)
searchContentsRepository.addTopics(topicsTestData) searchContentsRepository.addTopics(topicsTestData)
userDataRepository.setFollowedTopicIds(emptySet())
val result = viewModel.searchResultUiState.value val result = viewModel.searchResultUiState.value
assertIs<SearchResultUiState.Success>(result) assertIs<SearchResultUiState.Success>(result)

Loading…
Cancel
Save