Skip to content

Commit 897b73d

Browse files
committed
Unit Test: Implement several missing test
After submission application, my submission was rejected due missing some of test on Unit Test.. - DetailViewModelTest.kt * Adding test for checking each data that was grab from repo was match with local data - RepositoryTest.kt * Adding test for checking each data that was grab from repo was match with local data (For detail movie and tv show) * Adding test method for get and update favorite movie and tv show - FakeRepositoryTest.kt * Reflect changes after adding test on RepositoryTest.kt - CatalogDatabase.kt * Reflect changes after adding test on RepositoryTest.kt
1 parent 05e852b commit 897b73d

File tree

4 files changed

+225
-7
lines changed

4 files changed

+225
-7
lines changed

app/src/main/java/com/dicoding/moviecatalog/utils/CatalogDatabase.kt

+60
Original file line numberDiff line numberDiff line change
@@ -307,4 +307,64 @@ object CatalogDatabase {
307307

308308
return tvShow
309309
}
310+
311+
fun generateSusMovieLocal(): List<MovieDetailEntity> {
312+
313+
val susMovie = ArrayList<MovieDetailEntity>()
314+
315+
susMovie.add(
316+
MovieDetailEntity(
317+
"Seasoned musician Jackson Maine discovers — and falls in love with — struggling artist Ally. She has just about given up on her dream to make it big as a singer — until Jack coaxes her into the spotlight. But even as Ally's career takes off, the personal side of their relationship is breaking down, as Jack fights an ongoing battle with his own internal demons.",
318+
"en",
319+
"A Star Is Born",
320+
"Drama",
321+
"Romance",
322+
433888866,
323+
"2018-10-03",
324+
48.76,
325+
7.5,
326+
332562,
327+
"A Star Is Born",
328+
"/wrFpXMNBRj2PBiN4Z5kix51XaIZ.jpg",
329+
"Thunder Road",
330+
"22 & Green",
331+
"/cCzCClIzIh81Fa79hpW5nXoUsHK.png",
332+
"null",
333+
"US",
334+
"US",
335+
)
336+
)
337+
338+
return susMovie
339+
}
340+
341+
fun generateSusTvShowLocal(): List<TvShowDetailEntity> {
342+
343+
val susTvShow = ArrayList<TvShowDetailEntity>()
344+
345+
susTvShow.add(
346+
TvShowDetailEntity(
347+
"2012-10-10",
348+
1412,
349+
"Arrow",
350+
170,
351+
8,
352+
"en",
353+
"Spoiled billionaire playboy Oliver Queen is missing and presumed dead when his yacht is lost at sea. He returns five years later a changed man, determined to clean up the city as a hooded vigilante armed with a bow.",
354+
"/gKG5QGz5Ngf8fgWpBsWtlg5L2SF.jpg",
355+
6.7,
356+
"321.082",
357+
"Crime",
358+
"Drama",
359+
"Berlanti Productions",
360+
"DC Entertainment",
361+
"/3e294jszfE6cE8TOogmj0zNd6pL.png",
362+
"/2Tc1P3Ac8M479naPp1kYT3izLS5.png",
363+
"US",
364+
"US",
365+
)
366+
)
367+
368+
return susTvShow
369+
}
310370
}

app/src/test/java/com/dicoding/moviecatalog/viewmodel/activity/DetailViewModelTest.kt

+41-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import com.dicoding.moviecatalog.viewmodel.DetailViewModel
1111
import com.dicoding.moviecatalog.vo.Resource
1212
import com.nhaarman.mockitokotlin2.verify
1313
import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions
14+
import org.junit.Assert.assertEquals
15+
import org.junit.Assert.assertNotNull
1416
import org.junit.Before
1517
import org.junit.Rule
1618
import org.junit.Test
@@ -65,11 +67,30 @@ class DetailViewModelTest {
6567
fun getMovie() {
6668
val dummyDetailMovie = Resource.success(CatalogDatabase.generateSelectedMovieLocal())
6769
val movie = MutableLiveData<Resource<MovieDetailEntity>>()
70+
6871
movie.value = dummyDetailMovie
6972

7073
`when`(movieRepository.getSelectedMovies(movieId)).thenReturn(movie)
71-
7274
viewModel.nGetSelectedMovie(movieId)
75+
val movieEntity = viewModel.nGetSusMovie().value?.data
76+
77+
assertNotNull(movieEntity)
78+
assertEquals(dummyMovie.movieId, movieEntity?.movieId)
79+
assertEquals(dummyMovie.title, movieEntity?.title)
80+
assertEquals(dummyMovie.overview, movieEntity?.overview)
81+
assertEquals(dummyMovie.revenue, movieEntity?.revenue)
82+
assertEquals(dummyMovie.releaseDate, movieEntity?.releaseDate)
83+
assertEquals(dummyMovie.originalLanguage, movieEntity?.originalLanguage)
84+
assertEquals(dummyMovie.posterPath, movieEntity?.posterPath)
85+
movieEntity?.popularity?.let { assertEquals(dummyMovie.popularity, it, 0.0001) }
86+
movieEntity?.voteAverage?.let { assertEquals(dummyMovie.voteAverage, it, 0.0001) }
87+
assertEquals(dummyMovie.compName_1, movieEntity?.compName_1)
88+
assertEquals(dummyMovie.compName_2, movieEntity?.compName_2)
89+
assertEquals(dummyMovie.compOrigin_1, movieEntity?.compOrigin_1)
90+
assertEquals(dummyMovie.compOrigin_2, movieEntity?.compOrigin_2)
91+
assertEquals(dummyMovie.compLogo_1, movieEntity?.compLogo_1)
92+
assertEquals(dummyMovie.compLogo_2, movieEntity?.compLogo_2)
93+
7394
viewModel.nGetSusMovie().observeForever(movieObserver)
7495
verify(movieObserver).onChanged(dummyDetailMovie)
7596
}
@@ -81,8 +102,26 @@ class DetailViewModelTest {
81102
tvShow.value = dummyDetailTvShow
82103

83104
`when`(movieRepository.getSelectedTvShow(tvShowId)).thenReturn(tvShow)
84-
85105
viewModel.nGetSelectedTvShow(tvShowId)
106+
val tvShowEntity = viewModel.nGetSusTvShow().value?.data
107+
108+
assertNotNull(tvShowEntity)
109+
assertEquals(dummyTvShow.tvShowId, tvShowEntity?.tvShowId)
110+
assertEquals(dummyTvShow.tvShowName, tvShowEntity?.tvShowName)
111+
assertEquals(dummyTvShow.tvShowOverview, tvShowEntity?.tvShowOverview)
112+
assertEquals(dummyTvShow.tvShowFirstAirDate, tvShowEntity?.tvShowFirstAirDate)
113+
assertEquals(dummyTvShow.tvShowEpisodes, tvShowEntity?.tvShowEpisodes)
114+
assertEquals(dummyTvShow.tvShowSeasons, tvShowEntity?.tvShowSeasons)
115+
assertEquals(dummyTvShow.tvShowLanguage, tvShowEntity?.tvShowLanguage)
116+
tvShowEntity?.tvShowVote?.let { assertEquals(dummyTvShow.tvShowVote, it, 0.0001) }
117+
assertEquals(dummyTvShow.tvShowPopularity, tvShowEntity?.tvShowPopularity)
118+
assertEquals(dummyTvShow.compName_1, tvShowEntity?.compName_1)
119+
assertEquals(dummyTvShow.compName_2, tvShowEntity?.compName_2)
120+
assertEquals(dummyTvShow.compOrigin_1, tvShowEntity?.compOrigin_1)
121+
assertEquals(dummyTvShow.compOrigin_2, tvShowEntity?.compOrigin_2)
122+
assertEquals(dummyTvShow.compLogo_1, tvShowEntity?.compLogo_1)
123+
assertEquals(dummyTvShow.compLogo_2, tvShowEntity?.compLogo_2)
124+
86125
viewModel.nGetSusTvShow().observeForever(tvShowObserver)
87126
verify(tvShowObserver).onChanged(dummyDetailTvShow)
88127
}

app/src/test/java/com/dicoding/moviecatalog/viewmodel/data/FakeRepositoryTest.kt

+1-5
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,7 @@ class FakeRepositoryTest(
146146
}
147147

148148
override fun updateFavMovies(movie: MovieDetailEntity, isSus: Boolean) {
149-
appExecutors.diskIO().execute {
150-
localDataSource.updateFavMovies(movie, isSus)
151-
}
149+
localDataSource.updateFavMovies(movie, isSus)
152150
}
153151

154152
override fun getAllTvShow(
@@ -274,8 +272,6 @@ class FakeRepositoryTest(
274272
}
275273

276274
override fun updateFavTvShow(tvShow: TvShowDetailEntity, isSus: Boolean) {
277-
appExecutors.diskIO().execute {
278275
localDataSource.updateFavTvShow(tvShow, isSus)
279-
}
280276
}
281277
}

app/src/test/java/com/dicoding/moviecatalog/viewmodel/data/RepositoryTest.kt

+123
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
package com.dicoding.moviecatalog.viewmodel.data
22

33
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
4+
import androidx.lifecycle.MutableLiveData
45
import androidx.paging.DataSource
56
import com.dicoding.moviecatalog.data.source.local.LocalDataSource
7+
import com.dicoding.moviecatalog.data.source.local.entity.movie.MovieDetailEntity
68
import com.dicoding.moviecatalog.data.source.local.entity.movie.MovieListEntity
9+
import com.dicoding.moviecatalog.data.source.local.entity.tvshow.TvShowDetailEntity
710
import com.dicoding.moviecatalog.data.source.local.entity.tvshow.TvShowListEntity
811
import com.dicoding.moviecatalog.data.source.remote.RemoteDataSource
912
import com.dicoding.moviecatalog.utils.AppExecutors
1013
import com.dicoding.moviecatalog.utils.CatalogDatabase
1114
import com.dicoding.moviecatalog.utils.SortUtils.NEWEST
15+
import com.dicoding.moviecatalog.viewmodel.utils.LiveDataTestUtil
1216
import com.dicoding.moviecatalog.viewmodel.utils.PagedListUtil
1317
import com.dicoding.moviecatalog.vo.Resource
1418
import com.nhaarman.mockitokotlin2.verify
19+
import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions
1520
import org.junit.Assert.assertEquals
1621
import org.junit.Assert.assertNotNull
1722
import org.junit.Rule
@@ -34,6 +39,12 @@ class RepositoryTest {
3439
CatalogDatabase.generateMovieLocal()
3540
private val tvShowResponses =
3641
CatalogDatabase.generateTvShowLocal()
42+
private val movieSelected = CatalogDatabase.generateSelectedMovieLocal()
43+
private val tvShowSelected = CatalogDatabase.generateSelectedTvShowLocal()
44+
private val susMovie = CatalogDatabase.generateSusMovieLocal()
45+
private val susTvShow = CatalogDatabase.generateSusTvShowLocal()
46+
private val movieId = movieSelected.movieId
47+
private val tvShowId = tvShowSelected.tvShowId
3748

3849
private val movieListId = "8174952"
3950
private val tvShowListId = "8174957"
@@ -51,6 +62,65 @@ class RepositoryTest {
5162
assertEquals(movieResponses.size.toLong(), movieEntities.data?.size?.toLong())
5263
}
5364

65+
@Test
66+
fun getDetailMovie() {
67+
val dummyDetailMovie = MutableLiveData<MovieDetailEntity>()
68+
dummyDetailMovie.value = CatalogDatabase.generateSelectedMovieLocal()
69+
`when`(local.getSelectedMovies(movieId)).thenReturn(dummyDetailMovie)
70+
71+
val movieDetailEntity = LiveDataTestUtil.getValue(fakeRepository.getSelectedMovies(movieId))
72+
verify(local).getSelectedMovies(movieId)
73+
assertNotNull(movieDetailEntity)
74+
assertEquals(movieSelected.movieId, movieDetailEntity.data?.movieId)
75+
assertEquals(movieSelected.title, movieDetailEntity.data?.title)
76+
assertEquals(movieSelected.overview, movieDetailEntity.data?.overview)
77+
assertEquals(movieSelected.revenue, movieDetailEntity.data?.revenue)
78+
assertEquals(movieSelected.releaseDate, movieDetailEntity.data?.releaseDate)
79+
assertEquals(movieSelected.originalLanguage, movieDetailEntity.data?.originalLanguage)
80+
assertEquals(movieSelected.posterPath, movieDetailEntity.data?.posterPath)
81+
movieDetailEntity.data?.popularity?.let {
82+
assertEquals(
83+
movieSelected.popularity,
84+
it,
85+
0.0001
86+
)
87+
}
88+
movieDetailEntity.data?.voteAverage?.let {
89+
assertEquals(
90+
movieSelected.voteAverage,
91+
it,
92+
0.0001
93+
)
94+
}
95+
assertEquals(movieSelected.compName_1, movieDetailEntity.data?.compName_1)
96+
assertEquals(movieSelected.compName_2, movieDetailEntity.data?.compName_2)
97+
assertEquals(movieSelected.compOrigin_1, movieDetailEntity.data?.compOrigin_1)
98+
assertEquals(movieSelected.compOrigin_2, movieDetailEntity.data?.compOrigin_2)
99+
assertEquals(movieSelected.compLogo_1, movieDetailEntity.data?.compLogo_1)
100+
assertEquals(movieSelected.compLogo_2, movieDetailEntity.data?.compLogo_2)
101+
}
102+
103+
@Test
104+
fun updateFavoriteMovie() {
105+
fakeRepository.updateFavMovies(CatalogDatabase.generateSelectedMovieLocal(), true)
106+
verify(local).updateFavMovies(CatalogDatabase.generateSelectedMovieLocal(), true)
107+
verifyNoMoreInteractions(local)
108+
}
109+
110+
@Test
111+
fun getFavoriteMovie() {
112+
val dataSourceFactory =
113+
mock(DataSource.Factory::class.java) as DataSource.Factory<Int, MovieDetailEntity>
114+
`when`(local.getFavMovies(NEWEST)).thenReturn(dataSourceFactory)
115+
fakeRepository.getFavoriteMovies(NEWEST)
116+
117+
val movieSusEntities =
118+
Resource.success(PagedListUtil.mockPagedList(CatalogDatabase.generateSelectedFavMovie()))
119+
verify(local).getFavMovies(NEWEST)
120+
assertNotNull(movieSusEntities)
121+
assertEquals(susMovie.size, movieSusEntities.data?.size)
122+
}
123+
54124
@Test
55125
fun getAllTvShow() {
56126
val dataSourceFactory =
@@ -63,4 +133,57 @@ class RepositoryTest {
63133
assertNotNull(tvShowEntities.data)
64134
assertEquals(tvShowResponses.size.toLong(), tvShowEntities.data?.size?.toLong())
65135
}
136+
137+
@Test
138+
fun getDetailTvShow() {
139+
val dummyDetailTvShow = MutableLiveData<TvShowDetailEntity>()
140+
dummyDetailTvShow.value = CatalogDatabase.generateSelectedTvShowLocal()
141+
`when`(local.getSelectedTvShow(tvShowId)).thenReturn(dummyDetailTvShow)
142+
143+
val tvShowDetailEntity =
144+
LiveDataTestUtil.getValue(fakeRepository.getSelectedTvShow(tvShowId))
145+
verify(local).getSelectedTvShow(tvShowId)
146+
assertNotNull(tvShowDetailEntity)
147+
assertEquals(tvShowSelected.tvShowId, tvShowDetailEntity.data?.tvShowId)
148+
assertEquals(tvShowSelected.tvShowName, tvShowDetailEntity.data?.tvShowName)
149+
assertEquals(tvShowSelected.tvShowOverview, tvShowDetailEntity.data?.tvShowOverview)
150+
assertEquals(tvShowSelected.tvShowFirstAirDate, tvShowDetailEntity.data?.tvShowFirstAirDate)
151+
assertEquals(tvShowSelected.tvShowEpisodes, tvShowDetailEntity.data?.tvShowEpisodes)
152+
assertEquals(tvShowSelected.tvShowSeasons, tvShowDetailEntity.data?.tvShowSeasons)
153+
assertEquals(tvShowSelected.tvShowLanguage, tvShowDetailEntity.data?.tvShowLanguage)
154+
tvShowDetailEntity.data?.tvShowVote?.let {
155+
assertEquals(
156+
tvShowSelected.tvShowVote,
157+
it,
158+
0.0001
159+
)
160+
}
161+
assertEquals(tvShowSelected.compName_1, tvShowDetailEntity.data?.compName_1)
162+
assertEquals(tvShowSelected.compName_2, tvShowDetailEntity.data?.compName_2)
163+
assertEquals(tvShowSelected.compOrigin_1, tvShowDetailEntity.data?.compOrigin_1)
164+
assertEquals(tvShowSelected.compOrigin_2, tvShowDetailEntity.data?.compOrigin_2)
165+
assertEquals(tvShowSelected.compLogo_1, tvShowDetailEntity.data?.compLogo_1)
166+
assertEquals(tvShowSelected.compLogo_2, tvShowDetailEntity.data?.compLogo_2)
167+
}
168+
169+
@Test
170+
fun updateFavoriteTvShow() {
171+
fakeRepository.updateFavTvShow(CatalogDatabase.generateSelectedTvShowLocal(), true)
172+
verify(local).updateFavTvShow(CatalogDatabase.generateSelectedTvShowLocal(), true)
173+
verifyNoMoreInteractions(local)
174+
}
175+
176+
@Test
177+
fun getFavoriteTvShow() {
178+
val dataSourceFactory =
179+
mock(DataSource.Factory::class.java) as DataSource.Factory<Int, TvShowDetailEntity>
180+
`when`(local.getFavTvShow(NEWEST)).thenReturn(dataSourceFactory)
181+
fakeRepository.getFavoriteTvShow(NEWEST)
182+
183+
val tvShowSusEntities =
184+
Resource.success(PagedListUtil.mockPagedList(CatalogDatabase.generateSelectedFavTvShow()))
185+
verify(local).getFavTvShow(NEWEST)
186+
assertNotNull(tvShowSusEntities)
187+
assertEquals(susTvShow.size, tvShowSusEntities.data?.size)
188+
}
66189
}

0 commit comments

Comments
 (0)