-
Notifications
You must be signed in to change notification settings - Fork 9
/
RemoteCovidTrackerDatasourceTest.kt
113 lines (90 loc) · 4.4 KB
/
RemoteCovidTrackerDatasourceTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.jaimegc.covid19tracker.datasource
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.google.common.truth.Truth.assertThat
import com.jaimegc.covid19tracker.ModelFactoryTest.DATE
import com.jaimegc.covid19tracker.ModelFactoryTest.covidTrackerDto
import com.jaimegc.covid19tracker.data.api.client.CovidTrackerApiClient
import com.jaimegc.covid19tracker.data.api.model.CovidTrackerDto
import com.jaimegc.covid19tracker.data.datasource.RemoteCovidTrackerDatasource
import com.jaimegc.covid19tracker.data.preference.CovidTrackerPreferences
import com.jaimegc.covid19tracker.domain.model.DomainError
import com.jaimegc.covid19tracker.domain.model.toDomain
import com.jaimegc.covid19tracker.util.MainCoroutineRule
import com.squareup.moshi.JsonDataException
import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.impl.annotations.MockK
import io.mockk.verify
import kotlinx.coroutines.test.runBlockingTest
import okhttp3.ResponseBody
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import retrofit2.HttpException
import retrofit2.Response
import java.net.UnknownHostException
class RemoteCovidTrackerDatasourceTest {
@get:Rule
val instantExecutorRule = InstantTaskExecutorRule()
@get:Rule
val coroutineScope = MainCoroutineRule()
@MockK(relaxed = true)
private lateinit var apiClient: CovidTrackerApiClient
@MockK(relaxed = true)
private lateinit var preferences: CovidTrackerPreferences
@MockK(relaxed = true)
lateinit var responseBody: ResponseBody
private lateinit var remote: RemoteCovidTrackerDatasource
@Before
fun init() {
MockKAnnotations.init(this)
remote = RemoteCovidTrackerDatasource(apiClient, preferences)
}
@Test
fun `get covid tracker by date should return covid tracker if date exists`() = runBlockingTest {
coEvery { apiClient.getCovidTrackerByDate(any()) } returns covidTrackerDto
val data = remote.getCovidTrackerByDate(DATE)
coVerify { apiClient.getCovidTrackerByDate(any()) }
verify { preferences.saveTime() }
assertThat(data.isRight()).isTrue()
data.map { assertThat(it).isEqualTo(covidTrackerDto.toDomain(DATE)) }
}
@Test
fun `get covid tracker by date should return server domain error if date doesnt exist`() = runBlockingTest {
val responseError: Response<CovidTrackerDto> = Response.error(400, responseBody)
coEvery { apiClient.getCovidTrackerByDate(DATE) } throws HttpException(responseError)
val response = remote.getCovidTrackerByDate(DATE)
coVerify { apiClient.getCovidTrackerByDate(any()) }
verify(exactly = 0) { preferences.saveTime() }
assertThat(response.isLeft()).isTrue()
response.mapLeft { assertThat(it).isEqualTo(DomainError.ServerDomainError) }
}
@Test
fun `get covid tracker by date should return no internet error if connection is offline`() = runBlockingTest {
coEvery { apiClient.getCovidTrackerByDate(DATE) } throws UnknownHostException()
val response = remote.getCovidTrackerByDate(DATE)
coVerify { apiClient.getCovidTrackerByDate(any()) }
verify(exactly = 0) { preferences.saveTime() }
assertThat(response.isLeft()).isTrue()
response.mapLeft { assertThat(it).isEqualTo(DomainError.NoInternetError) }
}
@Test
fun `get covid tracker by date should return generic domain error if required field is null`() = runBlockingTest {
coEvery { apiClient.getCovidTrackerByDate(any()) } throws JsonDataException()
val response = remote.getCovidTrackerByDate(DATE)
coVerify { apiClient.getCovidTrackerByDate(any()) }
verify(exactly = 0) { preferences.saveTime() }
assertThat(response.isLeft()).isTrue()
response.mapLeft { assertThat(it).isEqualTo(DomainError.GenericDomainError) }
}
@Test
fun `get covid tracker by date should return mapper domain error if mapper fails`() = runBlockingTest {
coEvery { apiClient.getCovidTrackerByDate(DATE) } returns covidTrackerDto.copy(dates = mapOf())
val response = remote.getCovidTrackerByDate(DATE)
coVerify { apiClient.getCovidTrackerByDate(any()) }
verify(exactly = 0) { preferences.saveTime() }
assertThat(response.isLeft()).isTrue()
response.mapLeft { assertThat(it).isInstanceOf(DomainError.MapperDomainError::class.java) }
}
}