Merge pull request #21 from msfjarvis/rewire-api

Use retrofit suspend support to hide implementation details of API
This commit is contained in:
probot-auto-merge[bot] 2020-09-23 09:04:15 +00:00 committed by GitHub
commit 93985ee02d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 8 additions and 40 deletions

View file

@ -20,9 +20,6 @@ import dev.msfjarvis.lobsters.ui.LobstersItem
import dev.msfjarvis.lobsters.ui.LobstersTheme import dev.msfjarvis.lobsters.ui.LobstersTheme
import dev.msfjarvis.lobsters.urllauncher.UrlLauncher import dev.msfjarvis.lobsters.urllauncher.UrlLauncher
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import javax.inject.Inject import javax.inject.Inject
val UrlLauncherAmbient = ambientOf<UrlLauncher> { error("Needs to be provided") } val UrlLauncherAmbient = ambientOf<UrlLauncher> { error("Needs to be provided") }
@ -40,20 +37,7 @@ class MainActivity : AppCompatActivity() {
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
val posts = mutableStateListOf<LobstersPost>() val posts = mutableStateListOf<LobstersPost>()
coroutineScope.launch { coroutineScope.launch {
apiClient.getHottestPosts().enqueue(object : Callback<List<LobstersPost>> { posts.addAll(apiClient.getHottestPosts())
override fun onResponse(
call: Call<List<LobstersPost>>,
response: Response<List<LobstersPost>>
) {
if (response.isSuccessful) {
response.body()?.let { posts.addAll(it) }
}
}
override fun onFailure(call: Call<List<LobstersPost>>, t: Throwable) {
TODO("Not yet implemented")
}
})
} }
LobstersApp(posts) LobstersApp(posts)
} }

View file

@ -7,10 +7,11 @@ dependencies {
def moshi_version = "1.9.3" def moshi_version = "1.9.3"
def retrofit_version = "2.9.0" def retrofit_version = "2.9.0"
implementation project(":model") implementation project(":model")
api "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version" implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version"
kaptTest "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version" kaptTest "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version"
testImplementation 'junit:junit:4.13' testImplementation 'junit:junit:4.13'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9"
// retrofit uses 3.14.9, so shall we. // retrofit uses 3.14.9, so shall we.
//noinspection GradleDependency //noinspection GradleDependency
testImplementation "com.squareup.okhttp3:mockwebserver:3.14.9" testImplementation "com.squareup.okhttp3:mockwebserver:3.14.9"

View file

@ -1,10 +1,9 @@
package dev.msfjarvis.lobsters.api package dev.msfjarvis.lobsters.api
import dev.msfjarvis.lobsters.model.LobstersPost import dev.msfjarvis.lobsters.model.LobstersPost
import retrofit2.Call
import retrofit2.http.GET import retrofit2.http.GET
interface LobstersApi { interface LobstersApi {
@GET("hottest.json") @GET("hottest.json")
fun getHottestPosts(): Call<List<dev.msfjarvis.lobsters.model.LobstersPost>> suspend fun getHottestPosts(): List<LobstersPost>
} }

View file

@ -1,18 +1,14 @@
package dev.msfjarvis.lobsters.api package dev.msfjarvis.lobsters.api
import dev.msfjarvis.lobsters.model.LobstersPost import kotlinx.coroutines.runBlocking
import okhttp3.mockwebserver.Dispatcher import okhttp3.mockwebserver.Dispatcher
import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer import okhttp3.mockwebserver.MockWebServer
import okhttp3.mockwebserver.RecordedRequest import okhttp3.mockwebserver.RecordedRequest
import org.junit.After import org.junit.After
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.fail
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class LobstersApiTest { class LobstersApiTest {
private val webServer = MockWebServer() private val webServer = MockWebServer()
@ -30,21 +26,9 @@ class LobstersApiTest {
} }
@Test @Test
fun `api gets correct number of items`() { fun `api gets correct number of items`() = runBlocking {
apiClient.getHottestPosts().enqueue(object : Callback<List<dev.msfjarvis.lobsters.model.LobstersPost>> { val posts = apiClient.getHottestPosts()
override fun onResponse( assertEquals(25, posts.size)
call: Call<List<dev.msfjarvis.lobsters.model.LobstersPost>>,
response: Response<List<dev.msfjarvis.lobsters.model.LobstersPost>>
) {
val posts = response.body()
require(posts != null)
assertEquals(25, posts.size)
}
override fun onFailure(call: Call<List<dev.msfjarvis.lobsters.model.LobstersPost>>, t: Throwable) {
fail("Call cannot fail in tests")
}
})
} }
@After @After