diff --git a/architecture/instrumentation-test/src/main/java/com/mitteloupe/whoami/test/rule/WebServerRule.kt b/architecture/instrumentation-test/src/main/java/com/mitteloupe/whoami/test/rule/WebServerRule.kt index a3f2ab3b..ec8e52e6 100644 --- a/architecture/instrumentation-test/src/main/java/com/mitteloupe/whoami/test/rule/WebServerRule.kt +++ b/architecture/instrumentation-test/src/main/java/com/mitteloupe/whoami/test/rule/WebServerRule.kt @@ -1,6 +1,7 @@ package com.mitteloupe.whoami.test.rule import com.mitteloupe.whoami.test.annotation.ServerRequestResponse +import com.mitteloupe.whoami.test.server.MockRequest import com.mitteloupe.whoami.test.server.ResponseBinder import com.mitteloupe.whoami.test.server.ResponseStore import org.junit.rules.TestRule @@ -12,54 +13,54 @@ class WebServerRule( private val lazyResponseStore: Lazy ) : TestRule { override fun apply(base: Statement, description: Description): Statement = - WebServerInitializationStatement( - lazyMockDispatcher, - lazyResponseStore, - base, - description - ) + WebServerStatement(lazyMockDispatcher, lazyResponseStore, base, description) +} - private class WebServerInitializationStatement( - private val lazyMockDispatcher: Lazy, - private val lazyResponseStore: Lazy, - private val base: Statement, - private val description: Description - ) : Statement() { - val responseStore by lazy { lazyResponseStore.value } - val mockDispatcher by lazy { lazyMockDispatcher.value } +private class WebServerStatement( + private val lazyMockDispatcher: Lazy, + private val lazyResponseStore: Lazy, + private val base: Statement, + private val description: Description +) : Statement() { + val responseStore by lazy { lazyResponseStore.value } + val mockDispatcher by lazy { lazyMockDispatcher.value } - override fun evaluate() { - val requestResponses = description.requestResponseIds() - .map { requestResponseId -> - responseStore.responseFactories[requestResponseId] - ?: throw IllegalArgumentException( - "Request/Response ID $requestResponseId not found." - ) - } + override fun evaluate() { + mockDispatcher.testName = description.displayName + val stubbedResponseKeys = bindRequestResponseFactories() + base.evaluate() + assertAllStubsUsed(stubbedResponseKeys) + mockDispatcher.reset() + } - mockDispatcher.testName = description.displayName - requestResponses.forEach { requestResponse -> - mockDispatcher.bindResponse(requestResponse) + private fun bindRequestResponseFactories(): Set { + val requestResponses = description.requestResponseIds() + .map { requestResponseId -> + requireNotNull( + responseStore.responseFactories[requestResponseId] + ) { "Request/Response ID $requestResponseId not found." } } - val stubbedResponseKeys = requestResponses - .map { requestResponse -> requestResponse.request } - .toSet() - - base.evaluate() - val usedResponseKeys = mockDispatcher.usedEndpoints.toSet() + requestResponses.forEach { requestResponse -> + mockDispatcher.bindResponse(requestResponse) + } + val stubbedResponseKeys = requestResponses + .map { requestResponse -> requestResponse.request } + .toSet() + return stubbedResponseKeys + } - val unusedResponseKeys = stubbedResponseKeys - usedResponseKeys - check(unusedResponseKeys.isEmpty()) { - "${unusedResponseKeys.size} unused stubbed URLs:\n[" + - unusedResponseKeys.joinToString("]\n[") + "]" - } + private fun assertAllStubsUsed(stubbedResponseKeys: Set) { + val usedResponseKeys = mockDispatcher.usedEndpoints.toSet() - mockDispatcher.reset() + val unusedResponseKeys = stubbedResponseKeys - usedResponseKeys + check(unusedResponseKeys.isEmpty()) { + "${unusedResponseKeys.size} unused stubbed URLs:\n[" + + unusedResponseKeys.joinToString("]\n[") + "]" } - - private fun Description.requestResponseIds() = - annotations.filterIsInstance() - .flatMap { serverResponse -> serverResponse.requestResponseIds.toList() } } + + private fun Description.requestResponseIds() = + annotations.filterIsInstance() + .flatMap { serverResponse -> serverResponse.requestResponseIds.toList() } }