Issue#8 Take use of TestFixtures to keep MockWebServer TLS setup in the network module, while still being able to use it in Android Tests

This commit is contained in:
Gergely Hegedus 2022-01-27 22:46:03 +02:00
parent 555ad6d05f
commit 3f4d22528c
18 changed files with 117 additions and 77 deletions

View file

@ -1,18 +1,12 @@
package org.fnives.test.showcase.testutils
import okhttp3.OkHttpClient
import okhttp3.tls.HandshakeCertificates
import org.fnives.test.showcase.model.network.BaseUrl
import org.fnives.test.showcase.network.mockserver.MockServerScenarioSetup
import org.fnives.test.showcase.network.testutil.NetworkTestConfigurationHelper
import org.fnives.test.showcase.testutils.idling.NetworkSynchronizationTestRule
import org.fnives.test.showcase.testutils.idling.NetworkSynchronizationTestRule.OkHttpClientTypes
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
import org.koin.core.context.loadKoinModules
import org.koin.dsl.module
import org.koin.test.KoinTest
import org.koin.test.get
/**
* TestRule which ensures Koin is reseted between each tests and setups Network mocking.
@ -28,8 +22,6 @@ class MockServerScenarioSetupResetingTestRule(
lateinit var mockServerScenarioSetup: MockServerScenarioSetup
private val sessionlessQualifier get() = OkHttpClientTypes.SESSIONLESS.asQualifier()
override fun apply(base: Statement, description: Description): Statement =
networkSynchronizationTestRule.apply(base, description)
.let(::createStatement)
@ -48,29 +40,9 @@ class MockServerScenarioSetupResetingTestRule(
}
private fun before() {
mockServerScenarioSetup = MockServerScenarioSetup()
val url = mockServerScenarioSetup.start(true)
val handshakeCertificates = mockServerScenarioSetup.clientCertificates
?: throw IllegalStateException("ClientCertificate should be accessable")
val okHttpClientWithCertificate = createUpdateOkHttpClient(handshakeCertificates)
loadKoinModules(
module {
// add https certificate to okhttp
single(qualifier = sessionlessQualifier) { okHttpClientWithCertificate }
// replace base url with mockWebServer's
single { BaseUrl(url) }
}
)
mockServerScenarioSetup = NetworkTestConfigurationHelper.startWithHTTPSMockWebServer()
}
private fun createUpdateOkHttpClient(handshakeCertificates: HandshakeCertificates) =
get<OkHttpClient>(sessionlessQualifier).newBuilder()
.sslSocketFactory(handshakeCertificates.sslSocketFactory(), handshakeCertificates.trustManager)
.build()
private fun after() {
mockServerScenarioSetup.stop()
}

View file

@ -3,12 +3,11 @@ package org.fnives.test.showcase.testutils.idling
import androidx.annotation.CheckResult
import androidx.test.espresso.IdlingResource
import okhttp3.OkHttpClient
import org.fnives.test.showcase.network.testutil.NetworkTestConfigurationHelper
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
import org.koin.core.qualifier.StringQualifier
import org.koin.test.KoinTest
import org.koin.test.get
class NetworkSynchronizationTestRule : TestRule, KoinTest {
@ -31,24 +30,14 @@ class NetworkSynchronizationTestRule : TestRule, KoinTest {
@CheckResult
private fun registerNetworkingSynchronization(): Disposable {
val idlingResources = OkHttpClientTypes.values()
.map { it to getOkHttpClient(it) }
.associateBy { it.second.dispatcher }
.values
.map { (key, client) -> client.asIdlingResource(key.qualifier) }
val idlingResources = NetworkTestConfigurationHelper.getOkHttpClients()
.associateBy(keySelector = { it.toString() })
.map { (key, client) -> client.asIdlingResource(key) }
.map(::IdlingResourceDisposable)
return CompositeDisposable(idlingResources)
}
private fun getOkHttpClient(type: OkHttpClientTypes): OkHttpClient = get(type.asQualifier())
private fun OkHttpClient.asIdlingResource(name: String): IdlingResource =
OkHttp3IdlingResource.create(name, this)
enum class OkHttpClientTypes(val qualifier: String) {
SESSION("SESSION-NETWORKING"), SESSIONLESS("SESSIONLESS-NETWORKING");
fun asQualifier() = StringQualifier(qualifier)
}
}