Skip to content

Commit

Permalink
Move unit tests to modules; introduce test fixtures; add two tests on…
Browse files Browse the repository at this point in the history
… the data source layer
  • Loading branch information
herrbert74 committed Dec 9, 2024
1 parent d5e95a8 commit 2695cc4
Show file tree
Hide file tree
Showing 30 changed files with 153 additions and 64 deletions.
3 changes: 3 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@ dependencies {
kspTest(libs.androidx.hilt.compiler)
kspTest(libs.google.dagger.hilt.androidCompiler)

androidTestImplementation(testFixtures(project("::movies:movies-domain")))
androidTestImplementation(testFixtures(project("::tv:tv-domain")))
androidTestImplementation(testFixtures(project("::shared")))
androidTestImplementation(libs.androidx.test.coreKtx)
androidTestImplementation(libs.androidx.test.ext.jUnit)
androidTestImplementation(libs.androidx.test.runner)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import com.zsoltbertalan.flickslate.search.domain.api.model.GenreMoviesPagingRep
import com.zsoltbertalan.flickslate.shared.model.Failure
import com.zsoltbertalan.flickslate.shared.model.GenresReply
import com.zsoltbertalan.flickslate.shared.util.Outcome
import com.zsoltbertalan.flickslate.testhelper.GenreMother
import com.zsoltbertalan.flickslate.shared.model.GenreMother
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import com.zsoltbertalan.flickslate.shared.model.Movie
import com.zsoltbertalan.flickslate.shared.model.PageData
import com.zsoltbertalan.flickslate.shared.model.PagingReply
import com.zsoltbertalan.flickslate.shared.util.Outcome
import com.zsoltbertalan.flickslate.testhelper.MovieMother
import com.zsoltbertalan.flickslate.movies.domain.model.MovieMother
import dagger.hilt.android.scopes.ActivityRetainedScoped
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,12 @@ package com.zsoltbertalan.flickslate
import com.github.michaelbull.result.Ok
import com.zsoltbertalan.flickslate.search.data.repository.SearchAccessor
import com.zsoltbertalan.flickslate.search.domain.api.SearchRepository
import com.zsoltbertalan.flickslate.shared.model.GenresReply
import com.zsoltbertalan.flickslate.shared.model.Movie
import com.zsoltbertalan.flickslate.shared.model.PageData
import com.zsoltbertalan.flickslate.shared.model.PagingReply
import com.zsoltbertalan.flickslate.shared.util.Outcome
import com.zsoltbertalan.flickslate.testhelper.GenreMother
import com.zsoltbertalan.flickslate.testhelper.MovieMother
import com.zsoltbertalan.flickslate.testhelper.TvMother
import com.zsoltbertalan.flickslate.tv.data.repository.TvAccessor
import com.zsoltbertalan.flickslate.tv.domain.api.TvRepository
import com.zsoltbertalan.flickslate.tv.domain.model.TvDetail
import com.zsoltbertalan.flickslate.tv.domain.model.TvShow
import com.zsoltbertalan.flickslate.movies.domain.model.MovieMother
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import se.ansman.dagger.auto.android.testing.Replaces
import javax.inject.Inject

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.github.michaelbull.result.Ok
import com.zsoltbertalan.flickslate.shared.model.PageData
import com.zsoltbertalan.flickslate.shared.model.PagingReply
import com.zsoltbertalan.flickslate.shared.util.Outcome
import com.zsoltbertalan.flickslate.testhelper.TvMother
import com.zsoltbertalan.flickslate.tv.domain.model.TvMother
import com.zsoltbertalan.flickslate.tv.data.repository.TvAccessor
import com.zsoltbertalan.flickslate.tv.domain.api.TvRepository
import com.zsoltbertalan.flickslate.tv.domain.model.TvDetail
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,9 @@ dependencies {
"ksp"(libs.findLibrary("google.dagger.compiler").get())
"ksp"(libs.findLibrary("google.dagger.hilt.compiler").get())

//"testImplementation"(libs.findLibrary("junit").get())
"testImplementation"(libs.findLibrary("junit").get())
"testImplementation"(libs.findLibrary("test.kotest.assertions.shared").get())
"testImplementation"(libs.findLibrary("test.kotest.assertions.core").get())
"testImplementation"(libs.findLibrary("test.mockk.core").get())
"testImplementation"(libs.findLibrary("kotlinx.coroutines.test").get())
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@ dependencies {
"ksp"(libs.findLibrary("google.dagger.hilt.compiler").get())
"ksp"(libs.findLibrary("google.dagger.hilt.androidCompiler").get())

// "testImplementation"(libs.findLibrary("junit").get())
"testImplementation"(libs.findLibrary("junit").get())
"testImplementation"(libs.findLibrary("test.kotest.assertions.shared").get())
"testImplementation"(libs.findLibrary("test.kotest.assertions.core").get())
"testImplementation"(libs.findLibrary("test.mockk.core").get())
"testImplementation"(libs.findLibrary("kotlinx.coroutines.test").get())
}

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
Expand Down
3 changes: 2 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ kotlin.code.style=official
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
org.gradle.configuration-cache=true
org.gradle.caching=true
org.gradle.caching=true
android.experimental.enableTestFixturesKotlinSupport=true
9 changes: 9 additions & 0 deletions movies/movies-data/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,17 @@ android {
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
@Suppress("UnstableApiUsage")
testFixtures {
enable = true
}
}

dependencies {
api(project(":movies:movies-domain"))
testImplementation(testFixtures(project("::movies:movies-data")))
testImplementation(testFixtures(project("::movies:movies-domain")))

//Remove in AGP 8.9.0 https://issuetracker.google.com/issues/340315591
testFixturesCompileOnly("org.jetbrains.kotlin:kotlin-stdlib:2.1.0")
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.zsoltbertalan.flickslate.mappers
package com.zsoltbertalan.flickslate.movies.data.network.model

import com.zsoltbertalan.flickslate.testhelper.MovieDtoMother
import com.zsoltbertalan.flickslate.shared.data.network.model.toMoviesReply
import com.zsoltbertalan.flickslate.shared.model.Movie
import com.zsoltbertalan.flickslate.shared.model.PagingReply
import io.kotest.matchers.shouldBe
import org.junit.Before
import org.junit.Test

class MappersTest {
class MovieResponseDtoTest {

private lateinit var mappedResponse: PagingReply<Movie>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package com.zsoltbertalan.flickslate.movies.repository
package com.zsoltbertalan.flickslate.movies.data.repository

import com.github.michaelbull.result.Ok
import com.zsoltbertalan.flickslate.movies.data.api.NowPlayingMoviesDataSource
import com.zsoltbertalan.flickslate.movies.data.api.PopularMoviesDataSource
import com.zsoltbertalan.flickslate.movies.data.api.UpcomingMoviesDataSource
import com.zsoltbertalan.flickslate.movies.data.network.MoviesService
import com.zsoltbertalan.flickslate.movies.data.repository.MoviesAccessor
import com.zsoltbertalan.flickslate.shared.model.PageData
import com.zsoltbertalan.flickslate.shared.model.PagingReply
import com.zsoltbertalan.flickslate.testhelper.MovieDtoMother
import com.zsoltbertalan.flickslate.testhelper.MovieMother
import com.zsoltbertalan.flickslate.movies.data.network.model.MovieDtoMother
import com.zsoltbertalan.flickslate.movies.domain.model.MovieMother
import io.kotest.matchers.equals.shouldBeEqual
import io.mockk.coEvery
import io.mockk.mockk
Expand All @@ -20,7 +19,7 @@ import org.junit.Before
import org.junit.Test
import retrofit2.Response

class MoviesRepositoryTest {
class MoviesAccessorTest {

private val moviesService: MoviesService = mockk()

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.zsoltbertalan.flickslate.testhelper
package com.zsoltbertalan.flickslate.movies.data.network.model

import com.zsoltbertalan.flickslate.shared.data.network.model.MovieDto
import com.zsoltbertalan.flickslate.shared.data.network.model.MoviesReplyDto
import com.zsoltbertalan.flickslate.movies.data.network.model.NowPlayingMoviesReplyDto
import com.zsoltbertalan.flickslate.movies.data.network.model.UpcomingMoviesReplyDto

private const val TOTAL_RESULTS = 300

Expand Down
7 changes: 7 additions & 0 deletions movies/movies-domain/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ plugins {

android {
namespace = "com.zsoltbertalan.flickslate.movies.domain"
buildFeatures {
@Suppress("UnstableApiUsage")
testFixtures {
enable = true
}
}
}

dependencies {
Expand All @@ -14,5 +20,6 @@ dependencies {
implementation(libs.kotlinResult.result)
implementation(libs.kotlinx.collections.immutable.jvm)
implementation(libs.kotlinx.coroutines.core)
testFixturesCompileOnly(libs.kotlinx.collections.immutable.jvm)

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.zsoltbertalan.flickslate.testhelper
package com.zsoltbertalan.flickslate.movies.domain.model

import com.zsoltbertalan.flickslate.movies.domain.model.MovieDetail
import com.zsoltbertalan.flickslate.shared.model.Genre
import com.zsoltbertalan.flickslate.shared.model.Movie
import kotlinx.collections.immutable.toImmutableList
Expand Down
6 changes: 6 additions & 0 deletions movies/movies-ui/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,10 @@ dependencies {
api(libs.androidx.lifecycle.common)
implementation(libs.androidx.lifecycle.runtime.compose)
api(libs.androidx.lifecycle.viewmodel.compose)

testImplementation(testFixtures(project("::movies:movies-domain")))
}

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
compilerOptions.freeCompilerArgs.add("-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi")
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ package com.zsoltbertalan.flickslate.movies.ui.main
import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.zsoltbertalan.flickslate.movies.domain.api.MoviesRepository
import com.zsoltbertalan.flickslate.movies.domain.model.MovieMother
import com.zsoltbertalan.flickslate.shared.compose.component.paging.PaginationInternalState
import com.zsoltbertalan.flickslate.shared.model.Failure
import com.zsoltbertalan.flickslate.shared.model.PageData
import com.zsoltbertalan.flickslate.shared.model.PagingReply
import com.zsoltbertalan.flickslate.testhelper.MovieMother
import io.kotest.assertions.throwables.shouldThrowExactly
import io.kotest.matchers.equality.shouldBeEqualToComparingFields
import io.kotest.matchers.equals.shouldBeEqual
Expand Down
2 changes: 2 additions & 0 deletions search/search-data/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,6 @@ android {

dependencies {
api(project(":search:search-domain"))
testImplementation(testFixtures(project("::shared")))
testImplementation(libs.kotlinx.serialization.json)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.zsoltbertalan.flickslate.search.data.network

import com.zsoltbertalan.flickslate.search.data.network.model.GenreReplyDto
import com.zsoltbertalan.flickslate.shared.data.network.model.ErrorBody
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import okhttp3.ResponseBody.Companion.toResponseBody
import retrofit2.Response

/**
* TODO
* This can be used to test [com.zsoltbertalan.flickslate.search.data.network.GenreRemoteDataSource]
*/
@Suppress("unused")
fun failNetworkRequestResponse(): () -> Response<GenreReplyDto> = {
val errorBody = ErrorBody(
success = false,
status_code = 6,
status_message = "Invalid id: The pre-requisite id is invalid or not found."
)
Response.error(404, Json.encodeToString(errorBody).toResponseBody())
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.zsoltbertalan.flickslate.testhelper
package com.zsoltbertalan.flickslate.search.data.network

import com.zsoltbertalan.flickslate.search.data.network.model.GenreReplyDto
import com.zsoltbertalan.flickslate.shared.data.network.model.GenreDto

object GenreDtoMother {

fun createGenreDtoList() =
fun createGenreReplyDto() = GenreReplyDto(createGenreDtoList())

private fun createGenreDtoList() =
listOf(
createDefaultGenreDto(id = 28, name = "Action"),
createDefaultGenreDto(id = 12, name = "Adventure"),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.zsoltbertalan.flickslate.search.data.network

import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.zsoltbertalan.flickslate.shared.model.Failure
import com.zsoltbertalan.flickslate.shared.model.GenreMother
import com.zsoltbertalan.flickslate.shared.model.GenresReply
import io.kotest.matchers.equals.shouldBeEqual
import io.mockk.coEvery
import io.mockk.mockk
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import retrofit2.Response

class GenreRemoteDataSourceTest {

private val searchService: SearchService = mockk()
private lateinit var genreRemoteDataSource: GenreRemoteDataSource

@Before
fun setup() {
coEvery { searchService.getGenres(any(), any()) } returns Response.success(GenreDtoMother.createGenreReplyDto())
genreRemoteDataSource = GenreRemoteDataSource(searchService)
}

@Test
fun `when getGenres called and service returns result then returns correct result`() = runTest {
genreRemoteDataSource.getGenres("") shouldBeEqual Ok(GenresReply(GenreMother.createGenreList(), ""))
}

@Test
fun `when getGenres called and service returns failure then returns correct result`() = runTest {
coEvery { searchService.getGenres(any(), any()) } returns failNetworkRequestResponse()()
genreRemoteDataSource.getGenres("") shouldBeEqual
Err(
Failure.ServerError(
"""
{"success":false,
"status_code":6,"status_message":"Invalid id: The pre-requisite id is invalid
or not found."}""".trimIndent().filterNot { it == '\n' }
)
)
}

}
7 changes: 7 additions & 0 deletions shared-data/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,13 @@ dependencies {
add("ksp", libs.androidx.hilt.compiler)
add("ksp", libs.google.dagger.hilt.androidCompiler)

testImplementation(testFixtures(project("::shared")))
testImplementation(libs.junit)
testImplementation(libs.test.kotest.assertions.shared)
testImplementation(libs.test.mockk.core)
testImplementation(libs.kotlinx.coroutines.test)
testImplementation(libs.test.kotest.assertions.core)

kspTest(libs.google.dagger.compiler)
kspTest(libs.androidx.hilt.compiler)
kspTest(libs.google.dagger.hilt.androidCompiler)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.zsoltbertalan.flickslate.shared.model.Failure
import com.zsoltbertalan.flickslate.shared.model.Genre
import com.zsoltbertalan.flickslate.testhelper.GenreMother
import com.zsoltbertalan.flickslate.shared.model.GenreMother
import com.zsoltbertalan.flickslate.shared.util.Outcome
import io.kotest.matchers.shouldBe
import io.mockk.mockk
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.zsoltbertalan.flickslate.shared.model.Failure
import com.zsoltbertalan.flickslate.shared.model.Genre
import com.zsoltbertalan.flickslate.testhelper.GenreMother
import com.zsoltbertalan.flickslate.shared.model.GenreMother
import com.zsoltbertalan.flickslate.shared.util.Outcome
import io.kotest.matchers.shouldBe
import io.mockk.mockk
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.zsoltbertalan.flickslate.shared.model.Failure
import com.zsoltbertalan.flickslate.shared.model.Genre
import com.zsoltbertalan.flickslate.testhelper.GenreMother
import com.zsoltbertalan.flickslate.shared.model.GenreMother
import com.zsoltbertalan.flickslate.shared.util.Outcome
import io.kotest.matchers.shouldBe
import io.mockk.mockk
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.zsoltbertalan.flickslate.shared.model.Failure
import com.zsoltbertalan.flickslate.shared.model.Genre
import com.zsoltbertalan.flickslate.shared.model.GenreMother
import com.zsoltbertalan.flickslate.shared.model.PageData
import com.zsoltbertalan.flickslate.shared.model.PagingReply
import com.zsoltbertalan.flickslate.testhelper.GenreMother
import com.zsoltbertalan.flickslate.shared.util.Outcome
import io.kotest.matchers.shouldBe
import kotlinx.coroutines.delay
Expand Down
Loading

0 comments on commit 2695cc4

Please sign in to comment.