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+ }
0 commit comments