From 3f4d22528cb4a3638541d68f777bfe1285d3a42d Mon Sep 17 00:00:00 2001 From: Gergely Hegedus Date: Thu, 27 Jan 2022 22:46:03 +0200 Subject: [PATCH] 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 --- app/build.gradle | 3 + ...MockServerScenarioSetupResetingTestRule.kt | 32 +-------- .../idling/NetworkSynchronizationTestRule.kt | 19 ++---- build.gradle | 2 +- core/build.gradle | 2 + .../core/integration/AuthIntegrationTest.kt | 13 ++-- .../integration/ContentIntegrationTest.kt | 13 ++-- .../SessionExpirationIntegrationTest.kt | 13 ++-- gradle/wrapper/gradle-wrapper.properties | 6 +- gradlescripts/testoptions.gradle | 1 + network/build.gradle | 8 ++- .../network/di/createNetworkmodules.kt | 4 +- .../LoginRemoteSourceRefreshActionImplTest.kt | 2 +- .../network/auth/LoginRemoteSourceTest.kt | 2 +- .../content/ContentRemoteSourceImplTest.kt | 2 +- .../network/content/SessionExpirationTest.kt | 2 +- .../MockServerScenarioSetupExtensions.kt | 2 +- .../NetworkTestConfigurationHelper.kt | 68 +++++++++++++++++++ 18 files changed, 117 insertions(+), 77 deletions(-) rename network/src/{test/java/org/fnives/test/showcase/network/shared => testFixtures/java/org/fnives/test/showcase/network/testutil}/MockServerScenarioSetupExtensions.kt (93%) create mode 100644 network/src/testFixtures/java/org/fnives/test/showcase/network/testutil/NetworkTestConfigurationHelper.kt diff --git a/app/build.gradle b/app/build.gradle index 163f056..e27ddf4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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')) } diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/MockServerScenarioSetupResetingTestRule.kt b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/MockServerScenarioSetupResetingTestRule.kt index 72b48fe..421eb28 100644 --- a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/MockServerScenarioSetupResetingTestRule.kt +++ b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/MockServerScenarioSetupResetingTestRule.kt @@ -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(sessionlessQualifier).newBuilder() - .sslSocketFactory(handshakeCertificates.sslSocketFactory(), handshakeCertificates.trustManager) - .build() - private fun after() { mockServerScenarioSetup.stop() } diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/idling/NetworkSynchronizationTestRule.kt b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/idling/NetworkSynchronizationTestRule.kt index dc97866..d2cf705 100644 --- a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/idling/NetworkSynchronizationTestRule.kt +++ b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/idling/NetworkSynchronizationTestRule.kt @@ -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) - } } diff --git a/build.gradle b/build.gradle index 9c84311..508e9e8 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } } dependencies { - classpath 'com.android.tools.build:gradle:7.0.4' + classpath 'com.android.tools.build:gradle:7.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jlleitschuh.gradle:ktlint-gradle:10.2.1" } diff --git a/core/build.gradle b/core/build.gradle index 9a43f9a..617bb40 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java-library' id 'kotlin' id 'kotlin-kapt' + id 'java-test-fixtures' } java { @@ -30,4 +31,5 @@ dependencies { testImplementation "org.junit.jupiter:junit-jupiter-params:$testing_junit5_version" testImplementation project(':mockserver') + testFixturesApi testFixtures(project(':network')) } \ No newline at end of file diff --git a/core/src/test/java/org/fnives/test/showcase/core/integration/AuthIntegrationTest.kt b/core/src/test/java/org/fnives/test/showcase/core/integration/AuthIntegrationTest.kt index 41a2b77..c1afe1d 100644 --- a/core/src/test/java/org/fnives/test/showcase/core/integration/AuthIntegrationTest.kt +++ b/core/src/test/java/org/fnives/test/showcase/core/integration/AuthIntegrationTest.kt @@ -14,13 +14,14 @@ import org.fnives.test.showcase.model.auth.LoginStatus import org.fnives.test.showcase.model.network.BaseUrl import org.fnives.test.showcase.model.shared.Answer import org.fnives.test.showcase.network.mockserver.ContentData -import org.fnives.test.showcase.network.mockserver.MockServerScenarioSetup import org.fnives.test.showcase.network.mockserver.scenario.auth.AuthScenario +import org.fnives.test.showcase.network.testutil.MockServerScenarioSetupExtensions import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.RegisterExtension import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource @@ -35,7 +36,10 @@ import java.util.stream.Stream @OptIn(ExperimentalCoroutinesApi::class) class AuthIntegrationTest : KoinTest { - private lateinit var mockServerScenarioSetup: MockServerScenarioSetup + @RegisterExtension + @JvmField + val mockServerScenarioSetupExtensions = MockServerScenarioSetupExtensions() + private val mockServerScenarioSetup get() = mockServerScenarioSetupExtensions.mockServerScenarioSetup private lateinit var fakeFavouriteContentLocalStorage: FakeFavouriteContentLocalStorage private lateinit var mockSessionExpirationListener: SessionExpirationListener private lateinit var fakeUserDataLocalStorage: FakeUserDataLocalStorage @@ -46,15 +50,13 @@ class AuthIntegrationTest : KoinTest { @BeforeEach fun setup() { mockSessionExpirationListener = mock() - mockServerScenarioSetup = MockServerScenarioSetup() - val url = mockServerScenarioSetup.start(false) fakeFavouriteContentLocalStorage = FakeFavouriteContentLocalStorage() fakeUserDataLocalStorage = FakeUserDataLocalStorage(null) startKoin { modules( createCoreModule( - baseUrl = BaseUrl(url), + baseUrl = BaseUrl(mockServerScenarioSetupExtensions.url), enableNetworkLogging = true, favouriteContentLocalStorageProvider = { fakeFavouriteContentLocalStorage }, sessionExpirationListenerProvider = { mockSessionExpirationListener }, @@ -66,7 +68,6 @@ class AuthIntegrationTest : KoinTest { @AfterEach fun tearDown() { - mockServerScenarioSetup.stop() stopKoin() } diff --git a/core/src/test/java/org/fnives/test/showcase/core/integration/ContentIntegrationTest.kt b/core/src/test/java/org/fnives/test/showcase/core/integration/ContentIntegrationTest.kt index adc9e15..068ed08 100644 --- a/core/src/test/java/org/fnives/test/showcase/core/integration/ContentIntegrationTest.kt +++ b/core/src/test/java/org/fnives/test/showcase/core/integration/ContentIntegrationTest.kt @@ -23,15 +23,16 @@ import org.fnives.test.showcase.model.network.BaseUrl import org.fnives.test.showcase.model.session.Session import org.fnives.test.showcase.model.shared.Resource import org.fnives.test.showcase.network.mockserver.ContentData -import org.fnives.test.showcase.network.mockserver.MockServerScenarioSetup import org.fnives.test.showcase.network.mockserver.scenario.content.ContentScenario import org.fnives.test.showcase.network.mockserver.scenario.refresh.RefreshTokenScenario +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 import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.RegisterExtension import org.koin.core.context.startKoin import org.koin.core.context.stopKoin import org.koin.test.KoinTest @@ -42,7 +43,10 @@ import org.mockito.kotlin.verifyZeroInteractions @OptIn(ExperimentalCoroutinesApi::class) class ContentIntegrationTest : KoinTest { - private lateinit var mockServerScenarioSetup: MockServerScenarioSetup + @RegisterExtension + @JvmField + val mockServerScenarioSetupExtensions = MockServerScenarioSetupExtensions() + private val mockServerScenarioSetup get() = mockServerScenarioSetupExtensions.mockServerScenarioSetup private lateinit var fakeFavouriteContentLocalStorage: FakeFavouriteContentLocalStorage private lateinit var mockSessionExpirationListener: SessionExpirationListener private lateinit var fakeUserDataLocalStorage: FakeUserDataLocalStorage @@ -55,15 +59,13 @@ class ContentIntegrationTest : KoinTest { @BeforeEach fun setup() { mockSessionExpirationListener = mock() - mockServerScenarioSetup = MockServerScenarioSetup() - val url = mockServerScenarioSetup.start(false) fakeFavouriteContentLocalStorage = FakeFavouriteContentLocalStorage() fakeUserDataLocalStorage = FakeUserDataLocalStorage(session) startKoin { modules( createCoreModule( - baseUrl = BaseUrl(url), + baseUrl = BaseUrl(mockServerScenarioSetupExtensions.url), enableNetworkLogging = true, favouriteContentLocalStorageProvider = { fakeFavouriteContentLocalStorage }, sessionExpirationListenerProvider = { mockSessionExpirationListener }, @@ -76,7 +78,6 @@ class ContentIntegrationTest : KoinTest { @AfterEach fun tearDown() { stopKoin() - mockServerScenarioSetup.stop() } @DisplayName("GIVEN normal response without favourites WHEN observed THEN data is returned") diff --git a/core/src/test/java/org/fnives/test/showcase/core/integration/SessionExpirationIntegrationTest.kt b/core/src/test/java/org/fnives/test/showcase/core/integration/SessionExpirationIntegrationTest.kt index 6417136..6dcca45 100644 --- a/core/src/test/java/org/fnives/test/showcase/core/integration/SessionExpirationIntegrationTest.kt +++ b/core/src/test/java/org/fnives/test/showcase/core/integration/SessionExpirationIntegrationTest.kt @@ -16,16 +16,17 @@ import org.fnives.test.showcase.core.session.SessionExpirationListener import org.fnives.test.showcase.model.auth.LoginCredentials import org.fnives.test.showcase.model.network.BaseUrl import org.fnives.test.showcase.model.shared.Resource -import org.fnives.test.showcase.network.mockserver.MockServerScenarioSetup import org.fnives.test.showcase.network.mockserver.scenario.auth.AuthScenario import org.fnives.test.showcase.network.mockserver.scenario.content.ContentScenario import org.fnives.test.showcase.network.mockserver.scenario.refresh.RefreshTokenScenario import org.fnives.test.showcase.network.shared.exceptions.NetworkException +import org.fnives.test.showcase.network.testutil.MockServerScenarioSetupExtensions import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.RegisterExtension import org.koin.core.context.startKoin import org.koin.core.context.stopKoin import org.koin.test.KoinTest @@ -39,7 +40,10 @@ import org.mockito.kotlin.verifyZeroInteractions @OptIn(ExperimentalCoroutinesApi::class) class SessionExpirationIntegrationTest : KoinTest { - private lateinit var mockServerScenarioSetup: MockServerScenarioSetup + @RegisterExtension + @JvmField + val mockServerScenarioSetupExtensions = MockServerScenarioSetupExtensions() + private val mockServerScenarioSetup get() = mockServerScenarioSetupExtensions.mockServerScenarioSetup private lateinit var fakeFavouriteContentLocalStorage: FakeFavouriteContentLocalStorage private lateinit var mockSessionExpirationListener: SessionExpirationListener private lateinit var fakeUserDataLocalStorage: FakeUserDataLocalStorage @@ -51,15 +55,13 @@ class SessionExpirationIntegrationTest : KoinTest { @BeforeEach fun setup() { mockSessionExpirationListener = mock() - mockServerScenarioSetup = MockServerScenarioSetup() - val url = mockServerScenarioSetup.start(false) fakeFavouriteContentLocalStorage = FakeFavouriteContentLocalStorage() fakeUserDataLocalStorage = FakeUserDataLocalStorage(null) startKoin { modules( createCoreModule( - baseUrl = BaseUrl(url), + baseUrl = BaseUrl(mockServerScenarioSetupExtensions.url), enableNetworkLogging = true, favouriteContentLocalStorageProvider = { fakeFavouriteContentLocalStorage }, sessionExpirationListenerProvider = { mockSessionExpirationListener }, @@ -71,7 +73,6 @@ class SessionExpirationIntegrationTest : KoinTest { @AfterEach fun tearDown() { - mockServerScenarioSetup.stop() stopKoin() } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4ee106d..804c205 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Apr 11 21:03:49 EEST 2021 +#Thu Jan 27 21:44:07 EET 2022 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlescripts/testoptions.gradle b/gradlescripts/testoptions.gradle index 9c0e171..ce6575a 100644 --- a/gradlescripts/testoptions.gradle +++ b/gradlescripts/testoptions.gradle @@ -72,6 +72,7 @@ task jvmTests(dependsOn: ["app:testDebugUnitTest", "core:test", "network:test"]) task robolectricTests(type: Exec) { group = 'Tests' description = 'Run all Robolectric tests based on the Instrumented naming convention' + // todo is there a better way? commandLine 'sh', './gradlew', 'testDebugUnitTest', '--tests', 'org.fnives.test.*InstrumentedTest' } diff --git a/network/build.gradle b/network/build.gradle index cbd2de4..e8cf19c 100644 --- a/network/build.gradle +++ b/network/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java-library' id 'kotlin' id 'kotlin-kapt' + id 'java-test-fixtures' } java { @@ -25,9 +26,10 @@ dependencies { testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version" testImplementation "org.mockito.kotlin:mockito-kotlin:$testing_kotlin_mockito_version" - testImplementation "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_version" - testImplementation project(':mockserver') - testImplementation "io.insert-koin:koin-test-junit5:$koin_version" testImplementation "org.skyscreamer:jsonassert:$testing_json_assert_version" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_version" + + testFixturesApi project(':mockserver') + testFixturesApi "org.junit.jupiter:junit-jupiter-engine:$testing_junit5_version" + testFixturesApi "io.insert-koin:koin-test-junit5:$koin_version" } \ No newline at end of file diff --git a/network/src/main/java/org/fnives/test/showcase/network/di/createNetworkmodules.kt b/network/src/main/java/org/fnives/test/showcase/network/di/createNetworkmodules.kt index 019faa7..974390a 100644 --- a/network/src/main/java/org/fnives/test/showcase/network/di/createNetworkmodules.kt +++ b/network/src/main/java/org/fnives/test/showcase/network/di/createNetworkmodules.kt @@ -88,5 +88,5 @@ private fun sessionNetworkingModule( single(qualifier = session) { get(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") diff --git a/network/src/test/java/org/fnives/test/showcase/network/auth/LoginRemoteSourceRefreshActionImplTest.kt b/network/src/test/java/org/fnives/test/showcase/network/auth/LoginRemoteSourceRefreshActionImplTest.kt index dc982fe..a3e4270 100644 --- a/network/src/test/java/org/fnives/test/showcase/network/auth/LoginRemoteSourceRefreshActionImplTest.kt +++ b/network/src/test/java/org/fnives/test/showcase/network/auth/LoginRemoteSourceRefreshActionImplTest.kt @@ -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 diff --git a/network/src/test/java/org/fnives/test/showcase/network/auth/LoginRemoteSourceTest.kt b/network/src/test/java/org/fnives/test/showcase/network/auth/LoginRemoteSourceTest.kt index 0075cf9..cd0925e 100644 --- a/network/src/test/java/org/fnives/test/showcase/network/auth/LoginRemoteSourceTest.kt +++ b/network/src/test/java/org/fnives/test/showcase/network/auth/LoginRemoteSourceTest.kt @@ -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 diff --git a/network/src/test/java/org/fnives/test/showcase/network/content/ContentRemoteSourceImplTest.kt b/network/src/test/java/org/fnives/test/showcase/network/content/ContentRemoteSourceImplTest.kt index 9fe16ff..fe5c9f5 100644 --- a/network/src/test/java/org/fnives/test/showcase/network/content/ContentRemoteSourceImplTest.kt +++ b/network/src/test/java/org/fnives/test/showcase/network/content/ContentRemoteSourceImplTest.kt @@ -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 diff --git a/network/src/test/java/org/fnives/test/showcase/network/content/SessionExpirationTest.kt b/network/src/test/java/org/fnives/test/showcase/network/content/SessionExpirationTest.kt index c4ee725..cffd7f5 100644 --- a/network/src/test/java/org/fnives/test/showcase/network/content/SessionExpirationTest.kt +++ b/network/src/test/java/org/fnives/test/showcase/network/content/SessionExpirationTest.kt @@ -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 diff --git a/network/src/test/java/org/fnives/test/showcase/network/shared/MockServerScenarioSetupExtensions.kt b/network/src/testFixtures/java/org/fnives/test/showcase/network/testutil/MockServerScenarioSetupExtensions.kt similarity index 93% rename from network/src/test/java/org/fnives/test/showcase/network/shared/MockServerScenarioSetupExtensions.kt rename to network/src/testFixtures/java/org/fnives/test/showcase/network/testutil/MockServerScenarioSetupExtensions.kt index 6c6fd7d..5a1c9dd 100644 --- a/network/src/test/java/org/fnives/test/showcase/network/shared/MockServerScenarioSetupExtensions.kt +++ b/network/src/testFixtures/java/org/fnives/test/showcase/network/testutil/MockServerScenarioSetupExtensions.kt @@ -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 diff --git a/network/src/testFixtures/java/org/fnives/test/showcase/network/testutil/NetworkTestConfigurationHelper.kt b/network/src/testFixtures/java/org/fnives/test/showcase/network/testutil/NetworkTestConfigurationHelper.kt new file mode 100644 index 0000000..7c54124 --- /dev/null +++ b/network/src/testFixtures/java/org/fnives/test/showcase/network/testutil/NetworkTestConfigurationHelper.kt @@ -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 = listOf( + get(sessionless), + get(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(sessionless) + + val adjusted = adjustments(current) + loadKoinModules( + module { + // add https certificate to okhttp + single(qualifier = sessionless) { adjusted } + // replace base url with mockWebServer's + single { baseUrl } + } + ) + } +} \ No newline at end of file