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.urllauncher.UrlLauncher
import kotlinx.coroutines.launch
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import javax.inject.Inject
val UrlLauncherAmbient = ambientOf<UrlLauncher> { error("Needs to be provided") }
@ -40,20 +37,7 @@ class MainActivity : AppCompatActivity() {
val coroutineScope = rememberCoroutineScope()
val posts = mutableStateListOf<LobstersPost>()
coroutineScope.launch {
apiClient.getHottestPosts().enqueue(object : Callback<List<LobstersPost>> {
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")
}
})
posts.addAll(apiClient.getHottestPosts())
}
LobstersApp(posts)
}

View file

@ -7,10 +7,11 @@ dependencies {
def moshi_version = "1.9.3"
def retrofit_version = "2.9.0"
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"
kaptTest "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version"
testImplementation 'junit:junit:4.13'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9"
// retrofit uses 3.14.9, so shall we.
//noinspection GradleDependency
testImplementation "com.squareup.okhttp3:mockwebserver:3.14.9"

View file

@ -1,10 +1,9 @@
package dev.msfjarvis.lobsters.api
import dev.msfjarvis.lobsters.model.LobstersPost
import retrofit2.Call
import retrofit2.http.GET
interface LobstersApi {
@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
import dev.msfjarvis.lobsters.model.LobstersPost
import kotlinx.coroutines.runBlocking
import okhttp3.mockwebserver.Dispatcher
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import okhttp3.mockwebserver.RecordedRequest
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.fail
import org.junit.Before
import org.junit.Test
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class LobstersApiTest {
private val webServer = MockWebServer()
@ -30,21 +26,9 @@ class LobstersApiTest {
}
@Test
fun `api gets correct number of items`() {
apiClient.getHottestPosts().enqueue(object : Callback<List<dev.msfjarvis.lobsters.model.LobstersPost>> {
override fun onResponse(
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")
}
})
fun `api gets correct number of items`() = runBlocking {
val posts = apiClient.getHottestPosts()
assertEquals(25, posts.size)
}
@After