Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -12,54 +13,54 @@ class WebServerRule(
private val lazyResponseStore: Lazy<ResponseStore>
) : 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<ResponseBinder>,
private val lazyResponseStore: Lazy<ResponseStore>,
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<ResponseBinder>,
private val lazyResponseStore: Lazy<ResponseStore>,
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<MockRequest> {
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<MockRequest>) {
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<ServerRequestResponse>()
.flatMap { serverResponse -> serverResponse.requestResponseIds.toList() }
}

private fun Description.requestResponseIds() =
annotations.filterIsInstance<ServerRequestResponse>()
.flatMap { serverResponse -> serverResponse.requestResponseIds.toList() }
}