Skip to content

Commit

Permalink
Merge pull request #32 from gravatar/hamorillo/14-manual-depency-inje…
Browse files Browse the repository at this point in the history
…ctor

DI - Adding basic manual injection
  • Loading branch information
hamorillo authored Jan 23, 2024
2 parents b7c3177 + d886841 commit f030678
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 16 deletions.
2 changes: 2 additions & 0 deletions gravatar/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ dependencies {

testImplementation("junit:junit:4.13.2")
testImplementation("org.robolectric:robolectric:4.11.1")
testImplementation("io.mockk:mockk-android:1.13.9")
testImplementation("io.mockk:mockk-agent:1.13.9")

androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
Expand Down
25 changes: 9 additions & 16 deletions gravatar/src/main/java/com/gravatar/GravatarApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,19 @@ package com.gravatar
import android.os.Handler
import android.os.Looper
import android.util.Log
import com.gravatar.GravatarConstants.GRAVATAR_API_BASE_URL
import com.gravatar.di.container.GravatarSdkContainer
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import okhttp3.RequestBody.Companion.asRequestBody
import okhttp3.ResponseBody
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import java.io.File
import java.net.SocketTimeoutException
import java.net.UnknownHostException

class GravatarApi(okHttpClient: OkHttpClient? = null) {
private val retrofit: Retrofit

init {
retrofit =
Retrofit.Builder().apply {
okHttpClient?.let { client(it) }
baseUrl(GRAVATAR_API_BASE_URL)
}.build()
}

class GravatarApi(private val okHttpClient: OkHttpClient? = null) {
private companion object {
const val LOG_TAG = "Gravatar"
}
Expand All @@ -44,9 +33,10 @@ class GravatarApi(okHttpClient: OkHttpClient? = null) {
accessToken: String,
gravatarUploadListener: GravatarUploadListener,
) {
val service = retrofit.create(GravatarApiService::class.java)
val service = GravatarSdkContainer.instance.getGravatarApiService(okHttpClient)
val identity = MultipartBody.Part.createFormData("account", email)
val filePart = MultipartBody.Part.createFormData("filedata", file.name, file.asRequestBody())
val filePart =
MultipartBody.Part.createFormData("filedata", file.name, file.asRequestBody())

service.uploadImage("Bearer $accessToken", identity, filePart).enqueue(
object : Callback<ResponseBody> {
Expand All @@ -59,7 +49,10 @@ class GravatarApi(okHttpClient: OkHttpClient? = null) {
gravatarUploadListener.onSuccess()
} else {
// Log the response body for debugging purposes if the response is not successful
Log.w(LOG_TAG, "Network call unsuccessful trying to upload Gravatar: $response.body")
Log.w(
LOG_TAG,
"Network call unsuccessful trying to upload Gravatar: $response.body",
)
val error: ErrorType =
when (response.code()) {
HttpResponseCode.HTTP_CLIENT_TIMEOUT -> ErrorType.TIMEOUT
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.gravatar.di.container

import com.gravatar.GravatarApiService
import com.gravatar.GravatarConstants.GRAVATAR_API_BASE_URL
import okhttp3.OkHttpClient
import retrofit2.Retrofit

class GravatarSdkContainer private constructor() {
companion object {
val instance: GravatarSdkContainer by lazy {
GravatarSdkContainer()
}
}

private fun getRetrofitBuilder() = Retrofit.Builder().baseUrl(GRAVATAR_API_BASE_URL)

fun getGravatarApiService(okHttpClient: OkHttpClient? = null): GravatarApiService {
return getRetrofitBuilder().apply {
okHttpClient?.let { client(it) }
}.build().create(GravatarApiService::class.java)
}
}
43 changes: 43 additions & 0 deletions gravatar/src/test/java/com/gravatar/GravatarApiTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.gravatar

import io.mockk.mockk
import io.mockk.verify
import junit.framework.TestCase.assertTrue
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import java.io.File

class GravatarApiTest {
@get:Rule
var gravatarSdkTest = GravatarSdkContainerRule()

private lateinit var gravatarApi: GravatarApi

@Before
fun setUp() {
gravatarApi = GravatarApi()
}

@Test
fun `given an file, email and accessToken when uploading avatar then Gravatar service is invoked`() {
gravatarApi.uploadGravatar(File("avatarFile"), "email", "accessToken", mockk())
verify(exactly = 1) {
gravatarSdkTest.gravatarApiServiceMock.uploadImage(
"Bearer accessToken",
withArg {
assertTrue(
it.headers?.values("Content-Disposition").toString().contains("account"),
)
},
withArg {
assertTrue(
with(it.headers?.values("Content-Disposition").toString()) {
contains("filedata") && contains("avatarFile")
},
)
},
)
}
}
}
31 changes: 31 additions & 0 deletions gravatar/src/test/java/com/gravatar/GravatarSdkContainerRule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.gravatar

import com.gravatar.di.container.GravatarSdkContainer
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkObject
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement

class GravatarSdkContainerRule : TestRule {
var gravatarSdkContainerMock = mockk<GravatarSdkContainer>()
var gravatarApiServiceMock = mockk<GravatarApiService>()

override fun apply(
base: Statement,
description: Description,
): Statement {
return object : Statement() {
override fun evaluate() {
gravatarSdkContainerMock = mockk<GravatarSdkContainer>()
gravatarApiServiceMock = mockk<GravatarApiService>(relaxed = true)
mockkObject(GravatarSdkContainer)
every { GravatarSdkContainer.instance } returns gravatarSdkContainerMock
every { gravatarSdkContainerMock.getGravatarApiService(any()) } returns gravatarApiServiceMock

base.evaluate()
}
}
}
}

0 comments on commit f030678

Please sign in to comment.