Skip to content

Commit 113f69a

Browse files
committed
NEW: ProfileScreen instrumentation tests
1 parent 6439b25 commit 113f69a

File tree

10 files changed

+342
-8
lines changed

10 files changed

+342
-8
lines changed

.idea/androidTestResultsUserPreferences.xml

Lines changed: 52 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/deploymentTargetSelector.xml

Lines changed: 8 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/androidTest/java/com/adamdawi/popcornpicks/feature/recommendations/presentation/recommendations_screen/RecommendationsScreenTest.kt

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,26 @@ import androidx.compose.ui.test.performClick
1515
import androidx.compose.ui.test.performTouchInput
1616
import androidx.lifecycle.SavedStateHandle
1717
import com.adamdawi.popcornpicks.core.KoinTestRule
18+
import com.adamdawi.popcornpicks.core.data.dummy.dummyLikedMoviesList
1819
import com.adamdawi.popcornpicks.core.data.dummy.dummyMovieList
1920
import com.adamdawi.popcornpicks.core.domain.local.GenresPreferences
2021
import com.adamdawi.popcornpicks.core.domain.local.LikedMoviesDbRepository
2122
import com.adamdawi.popcornpicks.core.domain.remote.RemoteMovieRecommendationsRepository
2223
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.CIRCLE_ICON_BUTTON
24+
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.ERROR_SCREEN
2325
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.IMAGE_SCRATCH
26+
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.LOADING_SCREEN
2427
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.MOVIE_DETAILS_NOT_VISIBLE
2528
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.MOVIE_DETAILS_VISIBLE
29+
import com.adamdawi.popcornpicks.core.domain.util.DataError
2630
import com.adamdawi.popcornpicks.core.domain.util.Result
31+
import com.adamdawi.popcornpicks.core.presentation.ui.mapping.asUiText
2732
import com.adamdawi.popcornpicks.feature.recommendations.domain.repository.LocalMovieRecommendationsRepository
2833
import io.mockk.coEvery
2934
import io.mockk.every
3035
import io.mockk.mockk
3136
import kotlinx.coroutines.Dispatchers
37+
import kotlinx.coroutines.delay
3238
import org.junit.Before
3339
import org.junit.Rule
3440
import org.junit.Test
@@ -238,6 +244,78 @@ class RecommendationsScreenTest {
238244
button.assertIsDisplayed().assertIsEnabled()
239245
}
240246
}
247+
248+
@Test
249+
fun recommendationsScreen_isLoading_loadingScreenDisplayed() {
250+
coEvery { localMovieRecommendationsRepository.getRecommendedMovies() } coAnswers {
251+
delay(500)
252+
Result.Error(DataError.Local.UNKNOWN)
253+
}
254+
255+
composeTestRule.setContent {
256+
RecommendationsScreen(
257+
viewModel = viewModel,
258+
onNavigateToProfile = {},
259+
onNavigateToMovieDetails = {}
260+
)
261+
}
262+
263+
composeTestRule.onNodeWithTag(LOADING_SCREEN).assertExists().assertIsDisplayed()
264+
}
265+
266+
@Test
267+
fun genresScreen_error_errorScreenDisplayed() {
268+
coEvery { likedMoviesDbRepository.getLikedMovies() } answers {
269+
Result.Success(
270+
dummyLikedMoviesList
271+
)
272+
}
273+
coEvery { localMovieRecommendationsRepository.getRecommendedMovies() } answers {
274+
Result.Success(
275+
emptyList()
276+
)
277+
}
278+
coEvery { remoteMovieRecommendationsRepository.getMoviesBasedOnMovie(any(), any()) } answers {
279+
Result.Error(DataError.Network.UNKNOWN)
280+
}
281+
282+
composeTestRule.setContent {
283+
RecommendationsScreen(
284+
viewModel = viewModel,
285+
onNavigateToProfile = {},
286+
onNavigateToMovieDetails = {}
287+
)
288+
}
289+
290+
composeTestRule.onNodeWithTag(ERROR_SCREEN).assertExists().assertIsDisplayed()
291+
}
292+
293+
@Test
294+
fun genresScreen_error_correctErrorInErrorScreenDisplayed() {
295+
coEvery { likedMoviesDbRepository.getLikedMovies() } answers {
296+
Result.Success(
297+
dummyLikedMoviesList
298+
)
299+
}
300+
coEvery { localMovieRecommendationsRepository.getRecommendedMovies() } answers {
301+
Result.Success(
302+
emptyList()
303+
)
304+
}
305+
coEvery { remoteMovieRecommendationsRepository.getMoviesBasedOnMovie(any(), any()) } answers {
306+
Result.Error(DataError.Network.UNKNOWN)
307+
}
308+
309+
composeTestRule.setContent {
310+
RecommendationsScreen(
311+
viewModel = viewModel,
312+
onNavigateToProfile = {},
313+
onNavigateToMovieDetails = {}
314+
)
315+
}
316+
317+
composeTestRule.onNodeWithText(DataError.Network.UNKNOWN.asUiText()).assertExists().assertIsDisplayed()
318+
}
241319
}
242320

243321
private fun ComposeTestRule.scratchImage(
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
package com.adamdawi.popcornpicks.feature.user_profile.presentation.profile_screen
2+
3+
import androidx.compose.ui.graphics.toArgb
4+
import androidx.compose.ui.test.assertCountEquals
5+
import androidx.compose.ui.test.assertIsDisplayed
6+
import androidx.compose.ui.test.assertIsNotDisplayed
7+
import androidx.compose.ui.test.junit4.createComposeRule
8+
import androidx.compose.ui.test.onAllNodesWithTag
9+
import androidx.compose.ui.test.onNodeWithTag
10+
import androidx.compose.ui.test.onNodeWithText
11+
import androidx.compose.ui.test.performClick
12+
import com.adamdawi.popcornpicks.R
13+
import com.adamdawi.popcornpicks.core.KoinTestRule
14+
import com.adamdawi.popcornpicks.core.domain.local.GenresPreferences
15+
import com.adamdawi.popcornpicks.core.domain.local.LikedMoviesDbRepository
16+
import com.adamdawi.popcornpicks.core.domain.model.Genre
17+
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.ICON_LABEL_CHIP
18+
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.LOADING_SCREEN
19+
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.PROFILE_IMAGE
20+
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.PROFILE_IMAGE_EDIT_CONTENT
21+
import com.adamdawi.popcornpicks.core.domain.util.DataError
22+
import com.adamdawi.popcornpicks.core.domain.util.Result
23+
import com.adamdawi.popcornpicks.core.presentation.theme.ImageRed
24+
import com.adamdawi.popcornpicks.feature.user_profile.domain.ProfileImageStyle
25+
import com.adamdawi.popcornpicks.feature.user_profile.domain.local.UserProfilePreferences
26+
import io.mockk.coEvery
27+
import io.mockk.every
28+
import io.mockk.mockk
29+
import kotlinx.coroutines.Dispatchers
30+
import kotlinx.coroutines.delay
31+
import org.junit.Before
32+
import org.junit.Rule
33+
import org.junit.Test
34+
import org.koin.androidx.viewmodel.dsl.viewModel
35+
import org.koin.dsl.module
36+
import org.koin.java.KoinJavaComponent.inject
37+
38+
class ProfileScreenTest {
39+
40+
@get: Rule
41+
val composeTestRule = createComposeRule()
42+
private val genreList = listOf(
43+
Genre(id = 36, name = "History"),
44+
Genre(id = 27, name = "Horror"),
45+
Genre(id = 10402, name = "Music")
46+
)
47+
48+
private val genresPreferences: GenresPreferences = mockk(relaxed = true)
49+
private val userProfilePreferences: UserProfilePreferences = mockk(relaxed = true)
50+
private val likedMoviesDbRepository: LikedMoviesDbRepository = mockk(relaxed = true)
51+
52+
private val instrumentedTestModule = module {
53+
factory { genresPreferences }
54+
factory { userProfilePreferences }
55+
factory { likedMoviesDbRepository }
56+
factory { Dispatchers.IO }
57+
viewModel { ProfileViewModel(get(), get(), get(), get()) }
58+
}
59+
60+
@get:Rule
61+
val koinTestRule = KoinTestRule(
62+
modules = listOf(instrumentedTestModule)
63+
)
64+
65+
private val viewModel by inject<ProfileViewModel>(clazz = ProfileViewModel::class.java)
66+
67+
@Before
68+
fun setup() {
69+
every { genresPreferences.getGenres() } answers { emptyList() }
70+
coEvery { likedMoviesDbRepository.getLikedMoviesCount() } answers { Result.Success(null) }
71+
every { userProfilePreferences.getProfileImageStyle() } answers {
72+
ProfileImageStyle(
73+
imageId = R.drawable.happy_guard,
74+
ImageRed.toArgb()
75+
)
76+
}
77+
every { userProfilePreferences.saveProfileImageStyle(any()) } answers {}
78+
}
79+
80+
@Test
81+
fun profileScreen_emptyGenresList_correctTextIsDisplayed() {
82+
composeTestRule.setContent {
83+
ProfileScreen(
84+
viewModel = viewModel,
85+
onNavigateBack = {},
86+
onNavigateToLikedMoviesScreen = {}
87+
)
88+
}
89+
90+
composeTestRule.onNodeWithText("No genres available").assertExists().assertIsDisplayed()
91+
}
92+
@Test
93+
fun profileScreen_notEmptyGenresList_correctGenresAreDisplayed() {
94+
val genreIdsList = genreList.map { it.id.toString() }
95+
every { genresPreferences.getGenres() } answers { genreIdsList }
96+
composeTestRule.setContent {
97+
ProfileScreen(
98+
viewModel = viewModel,
99+
onNavigateBack = {},
100+
onNavigateToLikedMoviesScreen = {}
101+
)
102+
}
103+
104+
genreList.forEach { genre ->
105+
composeTestRule.onNodeWithText(genre.name).assertExists().assertIsDisplayed()
106+
}
107+
}
108+
109+
@Test
110+
fun profileScreen_notEmptyGenresList_correctNumberOfGenresAreDisplayed() {
111+
val genreIdsList = genreList.map { it.id.toString() }
112+
every { genresPreferences.getGenres() } answers { genreIdsList }
113+
composeTestRule.setContent {
114+
ProfileScreen(
115+
viewModel = viewModel,
116+
onNavigateBack = {},
117+
onNavigateToLikedMoviesScreen = {}
118+
)
119+
}
120+
121+
composeTestRule.onAllNodesWithTag(ICON_LABEL_CHIP).assertCountEquals(genreIdsList.size)
122+
}
123+
124+
@Test
125+
fun profileScreen_likedMoviesCountIsNull_correctTextIsDisplayed() {
126+
composeTestRule.setContent {
127+
ProfileScreen(
128+
viewModel = viewModel,
129+
onNavigateBack = {},
130+
onNavigateToLikedMoviesScreen = {}
131+
)
132+
}
133+
134+
composeTestRule.onNodeWithText("No movies information available").assertExists().assertIsDisplayed()
135+
}
136+
137+
@Test
138+
fun profileScreen_likedMoviesCountIsNotNull_correctCountIsDisplayed() {
139+
coEvery { likedMoviesDbRepository.getLikedMoviesCount() } answers { Result.Success(28) }
140+
composeTestRule.setContent {
141+
ProfileScreen(
142+
viewModel = viewModel,
143+
onNavigateBack = {},
144+
onNavigateToLikedMoviesScreen = {}
145+
)
146+
}
147+
148+
composeTestRule.onNodeWithText("28").assertExists().assertIsDisplayed()
149+
}
150+
151+
@Test
152+
fun profileScreen_isLoading_loadingScreenDisplayed() {
153+
coEvery { likedMoviesDbRepository.getLikedMoviesCount() } coAnswers {
154+
delay(500)
155+
Result.Error(DataError.Local.UNKNOWN)
156+
}
157+
158+
composeTestRule.setContent {
159+
ProfileScreen(
160+
viewModel = viewModel,
161+
onNavigateBack = {},
162+
onNavigateToLikedMoviesScreen = {}
163+
)
164+
}
165+
166+
composeTestRule.onNodeWithTag(LOADING_SCREEN).assertExists().assertIsDisplayed()
167+
}
168+
169+
@Test
170+
fun profileScreen_notShowPopupDialog_popupDialogIsNotDisplayed(){
171+
composeTestRule.setContent {
172+
ProfileScreen(
173+
viewModel = viewModel,
174+
onNavigateBack = {},
175+
onNavigateToLikedMoviesScreen = {}
176+
)
177+
}
178+
179+
composeTestRule.onNodeWithTag(PROFILE_IMAGE_EDIT_CONTENT).assertIsNotDisplayed().assertDoesNotExist()
180+
}
181+
182+
@Test
183+
fun profileScreen_showPopupDialog_popupDialogIsDisplayed(){
184+
composeTestRule.setContent {
185+
ProfileScreen(
186+
viewModel = viewModel,
187+
onNavigateBack = {},
188+
onNavigateToLikedMoviesScreen = {}
189+
)
190+
}
191+
composeTestRule.onNodeWithTag(PROFILE_IMAGE).performClick()
192+
193+
composeTestRule.onNodeWithTag(PROFILE_IMAGE_EDIT_CONTENT).assertExists().assertIsDisplayed()
194+
}
195+
}

0 commit comments

Comments
 (0)