Skip to content

Commit 387d628

Browse files
Fernando Prieto MoyanoFernando Prieto Moyano
Fernando Prieto Moyano
authored and
Fernando Prieto Moyano
committed
Added tests and added jacoco plugin
1 parent 377b1da commit 387d628

File tree

21 files changed

+122
-84
lines changed

21 files changed

+122
-84
lines changed

Diff for: app/build.gradle.kts

+19-6
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
import prieto.fernando.dependencies.ProjectModules
21
import prieto.fernando.dependencies.Dependencies
2+
import prieto.fernando.dependencies.ProjectModules
33
import prieto.fernando.dependencies.TestDependencies
44

55
plugins {
66
id("com.android.application")
77
kotlin("android")
8-
kotlin("android.extensions")
98
id("prieto.fernando.android.plugin")
109
id("dagger.hilt.android.plugin")
10+
jacoco
1111
}
1212

13-
androidPlugin{
13+
androidPlugin {
1414
buildType = prieto.fernando.android.plugin.BuildType.App
1515
}
1616

@@ -22,18 +22,28 @@ android {
2222
testInstrumentationRunner = "prieto.fernando.spacex.webmock.MockTestRunner"
2323
}
2424

25+
compileOptions {
26+
sourceCompatibility = JavaVersion.VERSION_1_8
27+
targetCompatibility = JavaVersion.VERSION_1_8
28+
}
29+
30+
kotlinOptions {
31+
jvmTarget = "1.8"
32+
}
33+
2534
buildFeatures {
2635
compose = true
2736
viewBinding = true
2837
}
2938

3039
composeOptions {
31-
kotlinCompilerExtensionVersion = prieto.fernando.dependencies.Versions.compose
40+
kotlinCompilerExtensionVersion = "1.0.5"
3241
}
3342

3443
buildTypes {
3544
getByName("debug") {
3645
isDebuggable = true
46+
isTestCoverageEnabled = true
3747
buildConfigField("Integer", "PORT", "8080")
3848
}
3949
getByName("release") {
@@ -54,7 +64,7 @@ dependencies {
5464
implementation(Dependencies.AndroidX.fragmentKtx)
5565
implementation(Dependencies.AndroidX.lifecycleLivedataKtx)
5666
implementation(Dependencies.AndroidX.Compose.viewModel)
57-
annotationProcessor(Dependencies.AndroidX.lifecycleCompiler)
67+
kapt(Dependencies.AndroidX.lifecycleCompiler)
5868
implementation(Dependencies.AndroidX.archComponents)
5969
implementation(Dependencies.AndroidX.browser)
6070

@@ -68,7 +78,6 @@ dependencies {
6878

6979
implementation(Dependencies.Hilt.hiltAndroid)
7080
implementation(Dependencies.Hilt.hiltAndroidCompiler)
71-
implementation(Dependencies.Hilt.hiltViewModel)
7281
implementation(Dependencies.Hilt.hiltCompiler)
7382
implementation(Dependencies.Hilt.hiltNavigationCompose)
7483

@@ -100,4 +109,8 @@ dependencies {
100109
androidTestImplementation(TestDependencies.Hilt.androidTesting)
101110
kaptAndroidTest(TestDependencies.Hilt.androidCompiler)
102111
androidTestAnnotationProcessor(TestDependencies.Hilt.androidCompiler)
112+
}
113+
114+
kapt {
115+
correctErrorTypes = true
103116
}

Diff for: app/src/main/java/prieto/fernando/spacex/presentation/EntryPointActivity.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import prieto.fernando.spacex.theme.SpaceXTheme
1212
@AndroidEntryPoint
1313
class EntryPointActivity : ComponentActivity() {
1414

15-
@InternalCoroutinesApi
16-
@ExperimentalMaterialApi
15+
@OptIn(InternalCoroutinesApi::class, ExperimentalMaterialApi::class )
1716
override fun onCreate(savedInstanceState: Bundle?) {
1817
super.onCreate(savedInstanceState)
1918
setContent {

Diff for: app/src/test/java/prieto/fernando/spacex/presentation/vm/DashboardViewModelTest.kt

+16-12
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule
44
import io.mockk.coEvery
55
import io.mockk.coVerify
66
import io.mockk.every
7-
import io.mockk.impl.annotations.MockK
8-
import junit.framework.Assert.assertEquals
7+
import io.mockk.mockk
8+
import org.junit.Assert.assertEquals
99
import kotlinx.coroutines.Dispatchers
1010
import kotlinx.coroutines.ExperimentalCoroutinesApi
1111
import kotlinx.coroutines.flow.flow
@@ -19,20 +19,23 @@ import prieto.fernando.domain.model.CompanyInfoDomainModel
1919
import prieto.fernando.domain.usecase.GetCompanyInfo
2020
import prieto.fernando.spacex.presentation.screens.dashboard.CompanyInfoUiModel
2121
import prieto.fernando.spacex.presentation.vm.mapper.CompanyInfoDomainToUiModelMapper
22+
import javax.inject.Inject
2223

2324
@ExperimentalCoroutinesApi
2425
class DashboardViewModelTest {
2526
private lateinit var cut: DashboardViewModel
2627

27-
@MockK
28+
@Inject
2829
lateinit var getCompanyInfo: GetCompanyInfo
2930

30-
@MockK
31+
@Inject
3132
lateinit var companyInfoMapper: CompanyInfoDomainToUiModelMapper
3233

3334
@Before
3435
fun setUp() {
3536
Dispatchers.setMain(Dispatchers.Unconfined)
37+
getCompanyInfo = mockk()
38+
companyInfoMapper = mockk()
3639
cut = DashboardViewModel(getCompanyInfo, companyInfoMapper)
3740
}
3841

@@ -74,22 +77,23 @@ class DashboardViewModelTest {
7477
assertEquals(expected, actual)
7578
}
7679

77-
@Test
80+
@Test(expected = Throwable::class)
7881
fun `Given Error When companyInfo Then expected error state`() {
7982
runBlockingTest {
8083
// Given
81-
val expectedErrorState = true
82-
coEvery { getCompanyInfo.execute() } returns flow {
83-
emit(throw Exception("Network Exception"))
84-
}
84+
var exceptionThrown = false
8585

8686
// When
87-
cut.companyInfo()
87+
coEvery { getCompanyInfo.execute() } throws java.lang.Exception("Network exception")
88+
try {
89+
cut.companyInfo()
90+
} catch (exception: Exception) {
91+
exceptionThrown = true
92+
}
8893
val actual = cut.viewState.value.isError
8994

9095
// Then
91-
coVerify(exactly = 2) { getCompanyInfo }
92-
assertEquals(expectedErrorState, actual)
96+
assertEquals(exceptionThrown, actual)
9397
}
9498
}
9599
}

Diff for: app/src/test/java/prieto/fernando/spacex/presentation/vm/LaunchesViewModelTest.kt

+19-13
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package prieto.fernando.spacex.presentation.vm
33
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
44
import io.mockk.coEvery
55
import io.mockk.coVerify
6-
import io.mockk.impl.annotations.MockK
7-
import junit.framework.Assert.assertEquals
6+
import io.mockk.mockk
7+
import org.junit.Assert.assertEquals
88
import kotlinx.coroutines.Dispatchers
99
import kotlinx.coroutines.ExperimentalCoroutinesApi
1010
import kotlinx.coroutines.flow.flow
@@ -24,24 +24,28 @@ import prieto.fernando.spacex.presentation.screens.launches.LinksUiModel
2424
import prieto.fernando.spacex.presentation.screens.launches.RocketUiModel
2525
import prieto.fernando.spacex.presentation.vm.mapper.ClickableLinkProvider
2626
import prieto.fernando.spacex.presentation.vm.mapper.LaunchesDomainToUiModelMapper
27+
import javax.inject.Inject
2728

2829
@ExperimentalCoroutinesApi
2930
class LaunchesViewModelTest {
3031

3132
private lateinit var cut: LaunchesViewModel
3233

33-
@MockK
34+
@Inject
3435
lateinit var getLaunches: GetLaunches
3536

36-
@MockK
37+
@Inject
3738
lateinit var launchesMapper: LaunchesDomainToUiModelMapper
3839

39-
@MockK
40+
@Inject
4041
lateinit var clickableLinkProvider: ClickableLinkProvider
4142

4243
@Before
4344
fun setUp() {
4445
Dispatchers.setMain(Dispatchers.Unconfined)
46+
getLaunches = mockk()
47+
launchesMapper = mockk()
48+
clickableLinkProvider = mockk()
4549
cut = LaunchesViewModel(getLaunches, launchesMapper, clickableLinkProvider)
4650
}
4751

@@ -116,18 +120,20 @@ class LaunchesViewModelTest {
116120
fun `Given Error When launches Then expected error state`() {
117121
runBlockingTest {
118122
// Given
119-
val expectedErrorState = true
120-
coEvery { getLaunches.execute(0, false) } returns flow {
121-
emit(throw Exception("Network Exception"))
122-
}
123+
var exceptionThrown = true
123124

124125
// When
125-
cut.launches()
126-
val actualValue = cut.viewState.value.isError
126+
coEvery { getLaunches.execute(0, false) } throws java.lang.Exception("Network Exception")
127+
try {
128+
cut.launches()
129+
} catch (exception: Exception) {
130+
exceptionThrown = true
131+
}
132+
133+
val actual = cut.viewState.value.isError
127134

128135
// Then
129-
coVerify(exactly = 2) { getLaunches.execute(0, false) }
130-
assertEquals(expectedErrorState, actualValue)
136+
assertEquals(exceptionThrown, actual)
131137
}
132138
}
133139
}

Diff for: app/src/test/java/prieto/fernando/spacex/presentation/vm/mapper/DateTransformerImplTest.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
package prieto.fernando.spacex.presentation.vm.mapper
22

33
import io.mockk.every
4-
import io.mockk.impl.annotations.MockK
4+
import io.mockk.mockk
55
import org.joda.time.DateTime
66
import org.junit.Before
77
import org.junit.Test
8+
import javax.inject.Inject
89
import kotlin.test.assertEquals
910

1011
class DateTransformerImplTest {
1112
private lateinit var cut: DateTransformerImpl
1213

13-
@MockK
14+
@Inject
1415
lateinit var dateTimeProvider: DateTimeProvider
1516

1617
@Before
1718
fun setUp() {
19+
dateTimeProvider = mockk()
1820
cut = DateTransformerImpl(dateTimeProvider)
1921
}
2022

Diff for: app/src/test/java/prieto/fernando/spacex/presentation/vm/mapper/LaunchesDomainToUiModelMapperTest.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package prieto.fernando.spacex.presentation.vm.mapper
22

33
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
44
import io.mockk.every
5-
import io.mockk.impl.annotations.MockK
5+
import io.mockk.mockk
66
import org.junit.Before
77
import org.junit.Rule
88
import org.junit.Test
@@ -14,20 +14,22 @@ import prieto.fernando.domain.model.RocketDomainModel
1414
import prieto.fernando.spacex.presentation.screens.launches.LaunchUiModel
1515
import prieto.fernando.spacex.presentation.screens.launches.LinksUiModel
1616
import prieto.fernando.spacex.presentation.screens.launches.RocketUiModel
17+
import javax.inject.Inject
1718
import kotlin.test.assertEquals
1819

1920
class LaunchesDomainToUiModelMapperTest {
2021

2122
private lateinit var cut: LaunchesDomainToUiModelMapperImpl
2223

23-
@MockK
24+
@Inject
2425
lateinit var dateTransformer: DateTransformer
2526

2627
@get:Rule
2728
var rule: TestRule = InstantTaskExecutorRule()
2829

2930
@Before
3031
fun setUp() {
32+
dateTransformer = mockk()
3133
cut = LaunchesDomainToUiModelMapperImpl(dateTransformer)
3234
}
3335

@@ -135,6 +137,7 @@ class LaunchesDomainToUiModelMapperTest {
135137
.returns("13-12-2019 at 13:00")
136138
every { dateTransformer.getDifferenceOfDays(buildDate("2019-12-13T13:00:00.000Z")) }
137139
.returns("1")
140+
every { dateTransformer.isPast(buildDate("2019-12-13T13:00:00.000Z")) }.returns(false)
138141

139142
// When
140143
val actualValue = cut.toUiModel(launches)

Diff for: build.gradle.kts

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import prieto.fernando.dependencies.Versions.jacoco
2+
13
buildscript {
24
repositories {
35
google()
@@ -7,6 +9,7 @@ buildscript {
79
classpath("com.android.tools.build:gradle:7.0.4")
810
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31")
911
classpath("com.google.dagger:hilt-android-gradle-plugin:2.38.1")
12+
classpath("org.jacoco:org.jacoco.core:0.8.7")
1013
}
1114
}
1215

@@ -20,4 +23,4 @@ allprojects {
2023

2124
task("clean") {
2225
delete(rootProject.buildDir)
23-
}
26+
}

Diff for: buildSrc/build.gradle.kts

+21-1
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,32 @@ repositories {
66

77
plugins {
88
`kotlin-dsl`
9+
jacoco
910
}
1011

1112
dependencies {
1213
implementation(kotlin("stdlib"))
13-
implementation("com.android.tools.build:gradle:7.0.3")
14+
implementation("com.android.tools.build:gradle:7.1.0")
1415
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31")
1516

1617
implementation(gradleApi())
18+
implementation(kotlin("script-runtime"))
19+
}
20+
21+
tasks.test {
22+
finalizedBy(tasks.jacocoTestReport)
23+
}
24+
25+
tasks.jacocoTestReport {
26+
dependsOn(tasks.test)
27+
}
28+
29+
tasks.jacocoTestReport {
30+
reports {
31+
xml.required.set(false)
32+
csv.required.set(false)
33+
html.outputLocation.set(layout.buildDirectory.dir("jacocoHtml"))
34+
}
35+
36+
finalizedBy("jacocoTestCoverageVerification")
1737
}

Diff for: buildSrc/src/main/kotlin/prieto/fernando/android/plugin/AndroidPlugin.kt

+8-4
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import prieto.fernando.dependencies.AndroidSettings
44
import prieto.fernando.dependencies.Dependencies
55
import prieto.fernando.dependencies.TestDependencies
66
import com.android.build.gradle.BaseExtension
7+
import org.gradle.api.JavaVersion
78
import org.gradle.api.Plugin
89
import org.gradle.api.Project
910
import org.gradle.kotlin.dsl.*
10-
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
1111

1212
open class AndroidPlugin : Plugin<Project> {
1313
override fun apply(project: Project) {
@@ -20,8 +20,7 @@ open class AndroidPlugin : Plugin<Project> {
2020
}
2121

2222
private fun androidPlugins() = listOf(
23-
"kotlin-android",
24-
"kotlin-android-extensions"
23+
"kotlin-android"
2524
)
2625

2726
private fun Project.configurePlugins(buildType: BuildType) = listOf(
@@ -42,7 +41,7 @@ open class AndroidPlugin : Plugin<Project> {
4241
versionCode = 1
4342
versionName = "1.0"
4443

45-
testInstrumentationRunner = AndroidSettings.testInstrumentationRunner
44+
testInstrumentationRunner = "prieto.fernando.spacex.webmock.MockTestRunner"
4645

4746
packagingOptions {
4847
resources.excludes.addAll(
@@ -63,6 +62,11 @@ open class AndroidPlugin : Plugin<Project> {
6362
)
6463
}
6564

65+
compileOptions {
66+
sourceCompatibility = JavaVersion.VERSION_1_8
67+
targetCompatibility = JavaVersion.VERSION_1_8
68+
}
69+
6670
buildTypes {
6771
getByName("debug") {
6872
isDebuggable = true

0 commit comments

Comments
 (0)