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

@ -88,5 +88,5 @@ private fun sessionNetworkingModule(
single(qualifier = session) { get<Retrofit>(sessionless).newBuilder().client(get(session)).build() }
}
private val session = StringQualifier("SESSION-NETWORKING")
private val sessionless = StringQualifier("SESSIONLESS-NETWORKING")
internal val session = StringQualifier("SESSION-NETWORKING")
internal val sessionless = StringQualifier("SESSIONLESS-NETWORKING")

View file

@ -6,7 +6,7 @@ import org.fnives.test.showcase.network.di.createNetworkModules
import org.fnives.test.showcase.network.mockserver.ContentData
import org.fnives.test.showcase.network.mockserver.scenario.refresh.RefreshTokenScenario
import org.fnives.test.showcase.network.session.NetworkSessionLocalStorage
import org.fnives.test.showcase.network.shared.MockServerScenarioSetupExtensions
import org.fnives.test.showcase.network.testutil.MockServerScenarioSetupExtensions
import org.fnives.test.showcase.network.shared.exceptions.NetworkException
import org.fnives.test.showcase.network.shared.exceptions.ParsingException
import org.junit.jupiter.api.AfterEach

View file

@ -11,7 +11,7 @@ import org.fnives.test.showcase.network.mockserver.ContentData
import org.fnives.test.showcase.network.mockserver.ContentData.createExpectedLoginRequestJson
import org.fnives.test.showcase.network.mockserver.scenario.auth.AuthScenario
import org.fnives.test.showcase.network.session.NetworkSessionLocalStorage
import org.fnives.test.showcase.network.shared.MockServerScenarioSetupExtensions
import org.fnives.test.showcase.network.testutil.MockServerScenarioSetupExtensions
import org.fnives.test.showcase.network.shared.exceptions.NetworkException
import org.fnives.test.showcase.network.shared.exceptions.ParsingException
import org.junit.jupiter.api.AfterEach

View file

@ -6,7 +6,7 @@ import org.fnives.test.showcase.network.di.createNetworkModules
import org.fnives.test.showcase.network.mockserver.ContentData
import org.fnives.test.showcase.network.mockserver.scenario.content.ContentScenario
import org.fnives.test.showcase.network.session.NetworkSessionLocalStorage
import org.fnives.test.showcase.network.shared.MockServerScenarioSetupExtensions
import org.fnives.test.showcase.network.testutil.MockServerScenarioSetupExtensions
import org.fnives.test.showcase.network.shared.exceptions.NetworkException
import org.fnives.test.showcase.network.shared.exceptions.ParsingException
import org.junit.jupiter.api.AfterEach

View file

@ -9,7 +9,7 @@ import org.fnives.test.showcase.network.mockserver.scenario.content.ContentScena
import org.fnives.test.showcase.network.mockserver.scenario.refresh.RefreshTokenScenario
import org.fnives.test.showcase.network.session.NetworkSessionExpirationListener
import org.fnives.test.showcase.network.session.NetworkSessionLocalStorage
import org.fnives.test.showcase.network.shared.MockServerScenarioSetupExtensions
import org.fnives.test.showcase.network.testutil.MockServerScenarioSetupExtensions
import org.fnives.test.showcase.network.shared.exceptions.NetworkException
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions

View file

@ -1,4 +1,4 @@
package org.fnives.test.showcase.network.shared
package org.fnives.test.showcase.network.testutil
import org.fnives.test.showcase.network.mockserver.MockServerScenarioSetup
import org.junit.jupiter.api.extension.AfterEachCallback

View file

@ -0,0 +1,68 @@
package org.fnives.test.showcase.network.testutil
import okhttp3.OkHttpClient
import org.fnives.test.showcase.model.network.BaseUrl
import org.fnives.test.showcase.network.mockserver.MockServerScenarioSetup
import org.koin.core.context.loadKoinModules
import org.koin.core.qualifier.StringQualifier
import org.koin.dsl.module
import org.koin.test.KoinTest
import org.koin.test.get
/**
* Gives access to internals of Networking so it can be used in MockWebServer more easily.
*/
object NetworkTestConfigurationHelper : KoinTest {
/**
* For some reason importing these didn't work. Still keeping internal, cause it shouldn't leave the module.
*
* import org.fnives.test.showcase.network.di.session
* import org.fnives.test.showcase.network.di.sessionless
*/
internal val session = StringQualifier("SESSION-NETWORKING")
internal val sessionless = StringQualifier("SESSIONLESS-NETWORKING")
/**
* After koin started, this gives you access for the OkHttpClients, so you can synchronize or keep track of them
*/
fun getOkHttpClients(): List<OkHttpClient> = listOf(
get<OkHttpClient>(sessionless),
get<OkHttpClient>(session)
)
/**
* After koin started, this sets up MockServer to be used with HTTPs.
*
* Url, and injected OkHttpClient is modified for this.
*/
fun startWithHTTPSMockWebServer(): MockServerScenarioSetup{
val mockServerScenarioSetup = MockServerScenarioSetup()
val url = mockServerScenarioSetup.start(true)
val handshakeCertificates = mockServerScenarioSetup.clientCertificates
?: throw IllegalStateException("ClientCertificate should be accessable")
reload(baseUrl = BaseUrl(url)) {
it.newBuilder()
.sslSocketFactory(handshakeCertificates.sslSocketFactory(), handshakeCertificates.trustManager)
.build()
}
return mockServerScenarioSetup
}
private fun reload(baseUrl: BaseUrl, adjustments: (OkHttpClient) -> OkHttpClient) {
val current = get<OkHttpClient>(sessionless)
val adjusted = adjustments(current)
loadKoinModules(
module {
// add https certificate to okhttp
single(qualifier = sessionless) { adjusted }
// replace base url with mockWebServer's
single { baseUrl }
}
)
}
}