Skip to content

Commit

Permalink
Merge pull request #325 from gini/PIA-4412-use-Bearer-instead-of-BEARER
Browse files Browse the repository at this point in the history
Pia 4412 use capital case "Bearer" instead of all caps "BEARER"
  • Loading branch information
a-szotyori authored Jul 25, 2023
2 parents 91b8bbe + d7c11d5 commit f209c0e
Show file tree
Hide file tree
Showing 12 changed files with 971 additions and 6 deletions.
6 changes: 6 additions & 0 deletions bank-api-library/library/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@ dependencies {
androidTestImplementation(libs.kotlinx.coroutines.test)
androidTestImplementation(project(":core-api-library:shared-tests"))
androidTestImplementation(project(":health-api-library:library"))

testImplementation(libs.junit)
testImplementation(libs.truth)
testImplementation(libs.kotlinx.coroutines.test)
testImplementation(libs.robolectric)
testImplementation(libs.androidx.test.junit.ktx)
}

apply<PublishToMavenPlugin>()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
package net.gini.android.bank.api

import android.net.Uri
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.runTest
import net.gini.android.bank.api.models.ResolvePaymentInput
import net.gini.android.bank.api.requests.ErrorEvent
import net.gini.android.bank.api.requests.ResolvePaymentBody
import net.gini.android.bank.api.response.PaymentResponse
import net.gini.android.bank.api.response.ResolvePaymentResponse
import net.gini.android.core.api.response.PaymentRequestResponse
import okhttp3.RequestBody
import okhttp3.ResponseBody
import org.junit.Test
import org.junit.runner.RunWith
import retrofit2.Response
import java.util.UUID

/**
* Created by Alpár Szotyori on 21.07.23.
*
* Copyright (c) 2023 Gini GmbH.
*/

@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(AndroidJUnit4::class)
class BankApiDocumentRemoteSourceTest {

@Test
fun `sets bearer authorization header with capital case 'Bearer' in resolvePaymentRequests`() = runTest {
val accessToken = UUID.randomUUID().toString()
val expectedAuthorizationHeader = "Bearer $accessToken"
verifyAuthorizationHeader(expectedAuthorizationHeader, this) {
resolvePaymentRequests(accessToken, "", ResolvePaymentInput("", "", "", ""))
}
}

@Test
fun `sets bearer authorization header with capital case 'Bearer' in getPayment`() = runTest {
val accessToken = UUID.randomUUID().toString()
val expectedAuthorizationHeader = "Bearer $accessToken"
verifyAuthorizationHeader(expectedAuthorizationHeader, this) {
getPayment(accessToken, "")
}
}

@Test
fun `sets bearer authorization header with capital case 'Bearer' in logErrorEvent`() = runTest {
val accessToken = UUID.randomUUID().toString()
val expectedAuthorizationHeader = "Bearer $accessToken"
verifyAuthorizationHeader(expectedAuthorizationHeader, this) {
logErrorEvent(accessToken, ErrorEvent("", "", "", "", "", "", ""))
}
}

private inline fun verifyAuthorizationHeader(
expectedAuthorizationHeader: String,
testScope: TestScope,
testBlock: BankApiDocumentRemoteSource.() -> Unit
) {
// Given
val documentServiceAuthInterceptor = DocumentServiceAuthInterceptor()
val testSubject =
BankApiDocumentRemoteSource(
StandardTestDispatcher(testScope.testScheduler),
documentServiceAuthInterceptor,
GiniBankApiType(1),
""
)

// When
with(testSubject) {
testBlock()
}
testScope.advanceUntilIdle()

// Then
Truth.assertThat(documentServiceAuthInterceptor.bearerAuthHeader).isNotNull()
Truth.assertThat(documentServiceAuthInterceptor.bearerAuthHeader).isEqualTo(expectedAuthorizationHeader)
}

private class DocumentServiceAuthInterceptor : BankApiDocumentService {

var bearerAuthHeader: String? = null

override suspend fun resolvePaymentRequests(
bearer: Map<String, String>,
id: String,
input: ResolvePaymentBody
): Response<ResolvePaymentResponse> {
bearerAuthHeader = bearer["Authorization"]
return Response.success(ResolvePaymentResponse("", "", "", null, "", "", ""))
}

override suspend fun getPayment(bearer: Map<String, String>, id: String): Response<PaymentResponse> {
bearerAuthHeader = bearer["Authorization"]
return Response.success(PaymentResponse("", "", "", null, "", ""))
}

override suspend fun logErrorEvent(
bearer: Map<String, String>,
errorEvent: ErrorEvent
): Response<ResponseBody> {
bearerAuthHeader = bearer["Authorization"]
return Response.success(null)
}

override suspend fun uploadDocument(
bearer: Map<String, String>,
bytes: RequestBody,
fileName: String?,
docType: String?
): Response<ResponseBody> {
// Is tested in core api library
return Response.success(null)
}

override suspend fun getDocument(bearer: Map<String, String>, documentId: String): Response<ResponseBody> {
// Is tested in core api library
return Response.success(null)
}

override suspend fun getDocumentFromUri(bearer: Map<String, String>, uri: String): Response<ResponseBody> {
// Is tested in core api library
return Response.success(null)
}

override suspend fun getExtractions(bearer: Map<String, String>, documentId: String): Response<ResponseBody> {
// Is tested in core api library
return Response.success(null)
}

override suspend fun deleteDocument(bearer: Map<String, String>, documentId: String): Response<ResponseBody> {
// Is tested in core api library
return Response.success(null)
}

override suspend fun deleteDocumentFromUri(
bearer: Map<String, String>,
documentUri: Uri
): Response<ResponseBody> {
// Is tested in core api library
return Response.success(null)
}

override suspend fun getLayoutForDocument(
bearer: Map<String, String>,
documentId: String
): Response<ResponseBody> {
// Is tested in core api library
return Response.success(null)
}

override suspend fun getPaymentRequest(
bearer: Map<String, String>,
id: String
): Response<PaymentRequestResponse> {
// Is tested in core api library
return Response.success(null)
}

override suspend fun getPaymentRequests(bearer: Map<String, String>): Response<List<PaymentRequestResponse>> {
// Is tested in core api library
return Response.success(null)
}

override suspend fun getFile(bearer: Map<String, String>, location: String): Response<ResponseBody> {
// Is tested in core api library
return Response.success(null)
}

override suspend fun sendFeedback(
bearer: Map<String, String>,
id: String,
params: RequestBody
): Response<ResponseBody> {
// Is tested in core api library
return Response.success(null)
}

}
}
6 changes: 6 additions & 0 deletions core-api-library/library/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@ dependencies {
androidTestImplementation(libs.androidx.test.rules)
androidTestImplementation(libs.androidx.test.junit)
androidTestImplementation(libs.androidx.multidex)

testImplementation(libs.junit)
testImplementation(libs.truth)
testImplementation(libs.kotlinx.coroutines.test)
testImplementation(libs.robolectric)
testImplementation(libs.androidx.test.junit.ktx)
}

apply<PublishToMavenPlugin>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.net.Uri
import kotlinx.coroutines.withContext
import net.gini.android.core.api.authorization.apimodels.SessionToken
import net.gini.android.core.api.requests.ApiException
import net.gini.android.core.api.requests.BearerAuthorizatonHeader
import net.gini.android.core.api.requests.SafeApiRequest
import net.gini.android.core.api.response.PaymentRequestResponse
import okhttp3.MediaType.Companion.toMediaTypeOrNull
Expand Down Expand Up @@ -110,7 +111,7 @@ abstract class DocumentRemoteSource(
metadata: Map<String, String>? = null
): Map<String, String> {
return mutableMapOf<String, String>().apply {
put("Authorization", "BEARER $accessToken")
BearerAuthorizatonHeader(accessToken).addToMap(this)
accept?.let { put("Accept", accept) }
contentType?.let { put("Content-Type", contentType) }
metadata?.let { putAll(metadata) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ import net.gini.android.core.api.authorization.apimodels.SessionTokenInfo
import net.gini.android.core.api.authorization.apimodels.UserRequestModel
import net.gini.android.core.api.authorization.apimodels.UserResponseModel
import net.gini.android.core.api.requests.ApiException
import net.gini.android.core.api.requests.BasicAuthorizatonHeader
import net.gini.android.core.api.requests.BearerAuthorizatonHeader
import net.gini.android.core.api.requests.JsonAcceptHeader
import net.gini.android.core.api.requests.SafeApiRequest
import java.util.Base64.getEncoder
import kotlin.coroutines.CoroutineContext

internal class UserRemoteSource(
Expand Down Expand Up @@ -60,12 +62,12 @@ internal class UserRemoteSource(

private fun basicHeaderMap(): Map<String, String> {
val encoded = Base64.encodeToString("${clientId}:${clientSecret}".toByteArray(), Base64.NO_WRAP)
return mapOf("Accept" to "application/json",
"Authorization" to "Basic $encoded")
return mapOf(JsonAcceptHeader().toPair(),
BasicAuthorizatonHeader(encoded).toPair())
}

private fun bearerHeaderMap(accessToken: String): Map<String, String> {
return mapOf("Accept" to "application/json",
"Authorization" to "BEARER $accessToken")
return mapOf(JsonAcceptHeader().toPair(),
BearerAuthorizatonHeader(accessToken).toPair())
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package net.gini.android.core.api.requests

import net.gini.android.core.api.MediaTypes

/**
* Created by Alpár Szotyori on 21.07.23.
*
* Copyright (c) 2023 Gini GmbH.
*/

sealed class HttpHeader(val name: String, val value: String) {

fun addToMap(mutableMap: MutableMap<String, String>) {
mutableMap[name] = value
}

fun toPair(): Pair<String, String> = name to value
}

class BearerAuthorizatonHeader(token: String): HttpHeader("Authorization", "Bearer $token")
class BasicAuthorizatonHeader(credentials: String): HttpHeader("Authorization", "Basic $credentials")
class JsonAcceptHeader(): HttpHeader("Accept", MediaTypes.APPLICATION_JSON)
Loading

0 comments on commit f209c0e

Please sign in to comment.