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:
parent
555ad6d05f
commit
3f4d22528c
18 changed files with 117 additions and 77 deletions
|
|
@ -121,5 +121,8 @@ dependencies {
|
|||
androidTestRuntimeOnly "org.junit.vintage:junit-vintage-engine:$testing_junit5_version"
|
||||
|
||||
implementation "io.reactivex.rxjava3:rxjava:3.1.3"
|
||||
|
||||
testImplementation testFixtures(project(':core'))
|
||||
androidTestImplementation testFixtures(project(':core'))
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue