Skip to content

Commit 7e174ae

Browse files
committed
NEW: LikedMoviesScreen instrumentation tests
1 parent 1a5eb14 commit 7e174ae

5 files changed

Lines changed: 254 additions & 4 deletions

File tree

.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: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
package com.adamdawi.popcornpicks.feature.user_liked_movies.presentation.liked_movies_screen
2+
3+
import androidx.compose.ui.test.assertCountEquals
4+
import androidx.compose.ui.test.assertIsDisplayed
5+
import androidx.compose.ui.test.junit4.createComposeRule
6+
import androidx.compose.ui.test.onAllNodesWithTag
7+
import androidx.compose.ui.test.onNodeWithTag
8+
import androidx.compose.ui.test.onNodeWithText
9+
import com.adamdawi.popcornpicks.core.KoinTestRule
10+
import com.adamdawi.popcornpicks.core.domain.local.LikedMoviesDbRepository
11+
import com.adamdawi.popcornpicks.core.domain.model.Genre
12+
import com.adamdawi.popcornpicks.core.domain.model.LikedMovie
13+
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.ERROR_SCREEN
14+
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.LOADING_SCREEN
15+
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.POSTER_IMAGE
16+
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.TEXT_CHIP
17+
import com.adamdawi.popcornpicks.core.domain.util.DataError
18+
import com.adamdawi.popcornpicks.core.domain.util.Result
19+
import com.adamdawi.popcornpicks.core.presentation.ui.mapping.asUiText
20+
import io.mockk.coEvery
21+
import io.mockk.mockk
22+
import kotlinx.coroutines.Dispatchers
23+
import kotlinx.coroutines.delay
24+
import org.junit.Before
25+
import org.junit.Rule
26+
import org.junit.Test
27+
import org.koin.androidx.viewmodel.dsl.viewModel
28+
import org.koin.dsl.module
29+
import org.koin.java.KoinJavaComponent.inject
30+
31+
class LikedMoviesScreenTest {
32+
33+
@get:Rule
34+
val composeTestRule = createComposeRule()
35+
36+
private val likedMoviesDbRepository: LikedMoviesDbRepository = mockk(relaxed = true)
37+
38+
private val instrumentedTestModule = module {
39+
factory { likedMoviesDbRepository }
40+
factory { Dispatchers.IO }
41+
viewModel { LikedMoviesViewModel(get(), get()) }
42+
}
43+
44+
@get:Rule
45+
val koinTestRule = KoinTestRule(
46+
modules = listOf(instrumentedTestModule)
47+
)
48+
49+
private val viewModel by inject<LikedMoviesViewModel>(clazz = LikedMoviesViewModel::class.java)
50+
51+
@Before
52+
fun setup() {
53+
coEvery { likedMoviesDbRepository.getLikedMovies() } answers {
54+
Result.Success(listOf(
55+
LikedMovie(
56+
id = 1,
57+
title = "Spider-Man: No Way Home",
58+
poster = "/1g0dhYtq4irTY1GPXvft6k4YLjm.jpg",
59+
genres = listOf(
60+
Genre(id = 28, name = "Action"),
61+
Genre(id = 12, name = "Adventure"),
62+
Genre(id = 878, name = "Science Fiction")
63+
),
64+
releaseDate = "2021-12-15",
65+
voteAverage = 7.834,
66+
nextPage = 1
67+
),
68+
LikedMovie(
69+
id = 2,
70+
title = "Batman",
71+
poster = null,
72+
genres = listOf(
73+
Genre(id = 36, name = "History"),
74+
Genre(id = 27, name = "Horror"),
75+
Genre(id = 10402, name = "Music")
76+
),
77+
releaseDate = "2024-10-10",
78+
voteAverage = 8.86,
79+
nextPage = 1
80+
)
81+
))
82+
}
83+
}
84+
85+
@Test
86+
fun likedMoviesScreen_successWithEmptyMoviesList_correctTextIsDisplayed(){
87+
coEvery { likedMoviesDbRepository.getLikedMovies() } answers {
88+
Result.Success(emptyList())
89+
}
90+
91+
composeTestRule.setContent {
92+
LikedMoviesScreen(
93+
viewModel = viewModel,
94+
onNavigateBack = {}
95+
)
96+
}
97+
98+
composeTestRule.onNodeWithText("No movies available").assertExists().assertIsDisplayed()
99+
}
100+
101+
@Test
102+
fun likedMoviesScreen_successWithNotEmptyMoviesList_correctMoviesAreDisplayed(){
103+
composeTestRule.setContent {
104+
LikedMoviesScreen(
105+
viewModel = viewModel,
106+
onNavigateBack = {}
107+
)
108+
}
109+
110+
// FIRST MOVIE
111+
composeTestRule.onNodeWithText("Spider-Man: No Way Home (2021)").assertExists().assertIsDisplayed()
112+
composeTestRule.onNodeWithText("2021").assertExists().assertIsDisplayed()
113+
composeTestRule.onNodeWithText("Action").assertExists().assertIsDisplayed()
114+
composeTestRule.onNodeWithText("Adventure").assertExists().assertIsDisplayed()
115+
composeTestRule.onNodeWithText("Science Fiction").assertExists().assertIsDisplayed()
116+
composeTestRule.onNodeWithText("7.8").assertExists().assertIsDisplayed()
117+
118+
119+
// SECOND MOVIE
120+
composeTestRule.onNodeWithText("Batman (2024)").assertExists().assertIsDisplayed()
121+
composeTestRule.onNodeWithText("2024").assertExists().assertIsDisplayed()
122+
composeTestRule.onNodeWithText("History").assertExists().assertIsDisplayed()
123+
composeTestRule.onNodeWithText("Horror").assertExists().assertIsDisplayed()
124+
composeTestRule.onNodeWithText("Music").assertExists().assertIsDisplayed()
125+
composeTestRule.onNodeWithText("8.9").assertExists().assertIsDisplayed()
126+
}
127+
128+
@Test
129+
fun likedMoviesScreen_successWithNotEmptyMoviesList_correctNumberOfTextChipsAreDisplayed(){
130+
composeTestRule.setContent {
131+
LikedMoviesScreen(
132+
viewModel = viewModel,
133+
onNavigateBack = {}
134+
)
135+
}
136+
composeTestRule.onAllNodesWithTag(TEXT_CHIP).assertCountEquals(8)
137+
}
138+
139+
@Test
140+
fun likedMoviesScreen_successWithNotEmptyMoviesList_correctNumberOfPosterImageAreDisplayed(){
141+
composeTestRule.setContent {
142+
LikedMoviesScreen(
143+
viewModel = viewModel,
144+
onNavigateBack = {}
145+
)
146+
}
147+
composeTestRule.onAllNodesWithTag(POSTER_IMAGE).assertCountEquals(2)
148+
}
149+
150+
@Test
151+
fun likedMoviesScreen_isLoading_loadingScreenDisplayed() {
152+
coEvery { likedMoviesDbRepository.getLikedMovies() } coAnswers {
153+
delay(500)
154+
Result.Error(DataError.Local.UNKNOWN)
155+
}
156+
157+
composeTestRule.setContent {
158+
LikedMoviesScreen(
159+
viewModel = viewModel,
160+
onNavigateBack = {}
161+
)
162+
}
163+
164+
composeTestRule.onNodeWithTag(LOADING_SCREEN).assertExists().assertIsDisplayed()
165+
}
166+
167+
@Test
168+
fun likedMoviesScreen_error_errorScreenDisplayed() {
169+
coEvery { likedMoviesDbRepository.getLikedMovies() } answers { Result.Error(DataError.Local.UNKNOWN) }
170+
171+
composeTestRule.setContent {
172+
LikedMoviesScreen(
173+
viewModel = viewModel,
174+
onNavigateBack = {}
175+
)
176+
}
177+
178+
composeTestRule.onNodeWithTag(ERROR_SCREEN).assertExists().assertIsDisplayed()
179+
}
180+
181+
@Test
182+
fun likedMoviesScreen_error_correctErrorInErrorScreenDisplayed() {
183+
coEvery { likedMoviesDbRepository.getLikedMovies() } answers { Result.Error(DataError.Local.UNKNOWN) }
184+
185+
composeTestRule.setContent {
186+
LikedMoviesScreen(
187+
viewModel = viewModel,
188+
onNavigateBack = {}
189+
)
190+
}
191+
192+
composeTestRule.onNodeWithText(DataError.Network.UNKNOWN.asUiText()).assertExists().assertIsDisplayed()
193+
}
194+
}

app/src/main/java/com/adamdawi/popcornpicks/core/domain/util/Constants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,6 @@ object Constants {
5656
const val MOVIE_DETAILS_NOT_VISIBLE = "movie details not visible"
5757
const val CIRCLE_ICON_BUTTON = "circle_icon_button"
5858
const val PROFILE_IMAGE_EDIT_CONTENT = "profile_image_edit_content"
59+
const val POSTER_IMAGE = "poster_image"
5960
}
6061
}

app/src/main/java/com/adamdawi/popcornpicks/core/presentation/ui/PosterImage.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ import androidx.compose.runtime.remember
1111
import androidx.compose.ui.Modifier
1212
import androidx.compose.ui.draw.clip
1313
import androidx.compose.ui.layout.ContentScale
14+
import androidx.compose.ui.platform.testTag
1415
import androidx.compose.ui.res.painterResource
1516
import androidx.compose.ui.tooling.preview.Preview
1617
import androidx.compose.ui.unit.dp
1718
import coil.compose.AsyncImage
1819
import com.adamdawi.popcornpicks.R
1920
import com.adamdawi.popcornpicks.core.domain.util.Constants
21+
import com.adamdawi.popcornpicks.core.domain.util.Constants.Tests.POSTER_IMAGE
2022
import com.adamdawi.popcornpicks.core.presentation.theme.Grey
2123
import com.adamdawi.popcornpicks.core.presentation.theme.PopcornPicksTheme
2224

@@ -28,6 +30,7 @@ fun PosterImage(
2830
val showShimmer = remember { mutableStateOf(true) }
2931
AsyncImage(
3032
modifier = modifier
33+
.testTag(POSTER_IMAGE)
3134
.clip(RoundedCornerShape(6.dp))
3235
.border(1.dp, Grey, RoundedCornerShape(6.dp))
3336
.background(shimmerBrush(showShimmer = showShimmer.value)),

0 commit comments

Comments
 (0)