Fix AuthenticationInterceptor calling getAuthHeader twice
This commit is contained in:
@@ -20,6 +20,8 @@ class AuthenticationInterceptor @Inject constructor(
|
|||||||
val response = proceedWithAuthHeader(chain, currentHeader)
|
val response = proceedWithAuthHeader(chain, currentHeader)
|
||||||
if (listOf(401, 403).contains(response.code)) {
|
if (listOf(401, 403).contains(response.code)) {
|
||||||
authRepo.invalidateAuthHeader(currentHeader)
|
authRepo.invalidateAuthHeader(currentHeader)
|
||||||
|
} else {
|
||||||
|
return response
|
||||||
}
|
}
|
||||||
val newHeader = authHeader ?: return response
|
val newHeader = authHeader ?: return response
|
||||||
return proceedWithAuthHeader(chain, newHeader)
|
return proceedWithAuthHeader(chain, newHeader)
|
||||||
|
|||||||
@@ -0,0 +1,121 @@
|
|||||||
|
package gq.kirmanak.mealient.data.network
|
||||||
|
|
||||||
|
import com.google.common.truth.Truth.assertThat
|
||||||
|
import gq.kirmanak.mealient.data.auth.AuthRepo
|
||||||
|
import gq.kirmanak.mealient.test.AuthImplTestData.TEST_AUTH_HEADER
|
||||||
|
import gq.kirmanak.mealient.test.AuthImplTestData.TEST_BASE_URL
|
||||||
|
import io.mockk.*
|
||||||
|
import io.mockk.impl.annotations.MockK
|
||||||
|
import okhttp3.Interceptor
|
||||||
|
import okhttp3.Protocol
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class AuthenticationInterceptorTest {
|
||||||
|
@MockK(relaxUnitFun = true)
|
||||||
|
lateinit var authRepo: AuthRepo
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
lateinit var chain: Interceptor.Chain
|
||||||
|
|
||||||
|
lateinit var subject: AuthenticationInterceptor
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setUp() {
|
||||||
|
MockKAnnotations.init(this)
|
||||||
|
subject = AuthenticationInterceptor(authRepo)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when intercept without header then response without header`() {
|
||||||
|
val request = createRequest()
|
||||||
|
val response = createResponse(request)
|
||||||
|
every { chain.request() } returns request
|
||||||
|
every { chain.proceed(any()) } returns response
|
||||||
|
coEvery { authRepo.getAuthHeader() } returns null
|
||||||
|
assertThat(subject.intercept(chain)).isEqualTo(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when intercept with header then chain called with header`() {
|
||||||
|
val request = createRequest()
|
||||||
|
val response = createResponse(request)
|
||||||
|
val requestSlot = slot<Request>()
|
||||||
|
|
||||||
|
every { chain.request() } returns request
|
||||||
|
every { chain.proceed(capture(requestSlot)) } returns response
|
||||||
|
coEvery { authRepo.getAuthHeader() } returns TEST_AUTH_HEADER
|
||||||
|
|
||||||
|
subject.intercept(chain)
|
||||||
|
|
||||||
|
assertThat(requestSlot.captured.header("Authorization")).isEqualTo(TEST_AUTH_HEADER)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when intercept with stale header then calls invalidate`() {
|
||||||
|
val request = createRequest()
|
||||||
|
val response = createResponse(request, code = 403)
|
||||||
|
|
||||||
|
every { chain.request() } returns request
|
||||||
|
every { chain.proceed(any()) } returns response
|
||||||
|
coEvery { authRepo.getAuthHeader() } returns TEST_AUTH_HEADER
|
||||||
|
|
||||||
|
subject.intercept(chain)
|
||||||
|
|
||||||
|
coVerifySequence {
|
||||||
|
authRepo.getAuthHeader()
|
||||||
|
authRepo.invalidateAuthHeader(TEST_AUTH_HEADER)
|
||||||
|
authRepo.getAuthHeader()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when intercept with proper header then requests auth header once`() {
|
||||||
|
val request = createRequest()
|
||||||
|
val response = createResponse(request)
|
||||||
|
|
||||||
|
every { chain.request() } returns request
|
||||||
|
every { chain.proceed(any()) } returns response
|
||||||
|
coEvery { authRepo.getAuthHeader() } returns TEST_AUTH_HEADER
|
||||||
|
|
||||||
|
subject.intercept(chain)
|
||||||
|
|
||||||
|
coVerifySequence { authRepo.getAuthHeader() }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when intercept with stale header then updates header`() {
|
||||||
|
val request = createRequest()
|
||||||
|
val response = createResponse(request, code = 403)
|
||||||
|
val requests = mutableListOf<Request>()
|
||||||
|
|
||||||
|
every { chain.request() } returns request
|
||||||
|
every { chain.proceed(capture(requests)) } returns response
|
||||||
|
coEvery { authRepo.getAuthHeader() } returns TEST_AUTH_HEADER andThen "Bearer NEW TOKEN"
|
||||||
|
|
||||||
|
subject.intercept(chain)
|
||||||
|
|
||||||
|
assertThat(requests.size).isEqualTo(2)
|
||||||
|
assertThat(requests[0].header("Authorization")).isEqualTo(TEST_AUTH_HEADER)
|
||||||
|
assertThat(requests[1].header("Authorization")).isEqualTo("Bearer NEW TOKEN")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createRequest(
|
||||||
|
url: String = TEST_BASE_URL,
|
||||||
|
): Request = Request.Builder()
|
||||||
|
.url(url)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
private fun createResponse(
|
||||||
|
request: Request,
|
||||||
|
code: Int = 200,
|
||||||
|
): Response = Response.Builder()
|
||||||
|
.protocol(Protocol.HTTP_2)
|
||||||
|
.code(code)
|
||||||
|
.request(request)
|
||||||
|
.message("Doesn't matter")
|
||||||
|
.build()
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user