Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package com.skydoves.pokedex

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.test.TestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.setMain
Expand All @@ -30,6 +31,8 @@ class MainCoroutinesRule(
val testDispatcher: TestDispatcher = UnconfinedTestDispatcher()
) : TestWatcher() {

val testScope = TestScope(testDispatcher)

override fun starting(description: Description) {
Dispatchers.setMain(testDispatcher)
}
Expand Down
17 changes: 11 additions & 6 deletions app/src/test/java/com/skydoves/pokedex/network/ApiAbstract.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
package com.skydoves.pokedex.network

import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.skydoves.pokedex.MainCoroutinesRule
import com.skydoves.sandwich.adapters.ApiResponseCallAdapterFactory
import kotlinx.coroutines.ExperimentalCoroutinesApi
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import okio.buffer
Expand All @@ -29,7 +31,6 @@ import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import java.io.IOException
import java.nio.charset.StandardCharsets

@RunWith(JUnit4::class)
Expand All @@ -39,27 +40,27 @@ abstract class ApiAbstract<T> {
@JvmField
val instantExecutorRule: InstantTaskExecutorRule = InstantTaskExecutorRule()

@ExperimentalCoroutinesApi
@get:Rule
val coroutinesRule = MainCoroutinesRule()

lateinit var mockWebServer: MockWebServer

@Throws(IOException::class)
@Before
fun mockServer() {
mockWebServer = MockWebServer()
mockWebServer.start()
}

@Throws(IOException::class)
@After
fun stopServer() {
mockWebServer.shutdown()
}

@Throws(IOException::class)
fun enqueueResponse(fileName: String) {
enqueueResponse(fileName, emptyMap())
}

@Throws(IOException::class)
private fun enqueueResponse(fileName: String, headers: Map<String, String>) {
val inputStream = javaClass.classLoader!!.getResourceAsStream("api-response/$fileName")
val source = inputStream.source().buffer()
Expand All @@ -74,7 +75,11 @@ abstract class ApiAbstract<T> {
return Retrofit.Builder()
.baseUrl(mockWebServer.url("/"))
.addConverterFactory(MoshiConverterFactory.create())
.addCallAdapterFactory(ApiResponseCallAdapterFactory.create())
.addCallAdapterFactory(
ApiResponseCallAdapterFactory.create(
coroutineScope = coroutinesRule.testScope
)
)
.build()
.create(clazz)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,12 @@

package com.skydoves.pokedex.network

import com.skydoves.pokedex.MainCoroutinesRule
import com.skydoves.sandwich.ApiResponse
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runTest
import org.hamcrest.CoreMatchers.`is`
import org.hamcrest.MatcherAssert.assertThat
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import java.io.IOException

Expand All @@ -32,22 +30,17 @@ class PokedexServiceTest : ApiAbstract<PokedexService>() {

private lateinit var service: PokedexService

@ExperimentalCoroutinesApi
@get:Rule
val coroutinesRule = MainCoroutinesRule()

@Before
fun initService() {
service = createService(PokedexService::class.java)
}

@Throws(IOException::class)
@Test
fun fetchPokemonListFromNetworkTest() = runBlocking {
fun fetchPokemonListFromNetworkTest() = runTest {
enqueueResponse("/PokemonResponse.json")
val response = service.fetchPokemonList()
val responseBody = requireNotNull((response as ApiResponse.Success).data)
mockWebServer.takeRequest()

assertThat(responseBody.count, `is`(964))
assertThat(responseBody.results[0].name, `is`("bulbasaur"))
Expand All @@ -56,11 +49,10 @@ class PokedexServiceTest : ApiAbstract<PokedexService>() {

@Throws(IOException::class)
@Test
fun fetchPokemonInfoFromNetworkTest() = runBlocking {
fun fetchPokemonInfoFromNetworkTest() = runTest {
enqueueResponse("/Bulbasaur.json")
val response = service.fetchPokemonInfo("bulbasaur")
val responseBody = requireNotNull((response as ApiResponse.Success).data)
mockWebServer.takeRequest()

assertThat(responseBody.id, `is`(1))
assertThat(responseBody.name, `is`("bulbasaur"))
Expand Down
2 changes: 1 addition & 1 deletion dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ ext.versions = [
// network
retrofitVersion : '2.9.0',
okhttpVersion : '4.9.3',
sandwichVersion : '1.2.5',
sandwichVersion : '1.2.6',

// moshi
moshiVersion : '1.13.0',
Expand Down