8000 feat: add listener support for mock events in HttpStub by mik047 · Pull Request #1908 · specmatic/specmatic · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

feat: add listener support for mock events in HttpStub #1908

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 10, 2025
Merged
Show file tree
Hide file tree
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
9 changes: 5 additions & 4 deletions application/src/main/kotlin/application/HTTPStubEngine.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@ package application

import io.specmatic.core.Feature
import io.specmatic.core.WorkingDirectory
import io.specmatic.core.log.NewLineLogMessage
import io.specmatic.core.log.StringLog
import io.specmatic.core.log.consoleLog
import io.specmatic.mock.ScenarioStub
import io.specmatic.stub.HttpClientFactory
import io.specmatic.stub.HttpStub
import io.specmatic.stub.contractInfoToHttpExpectations
import io.specmatic.stub.listener.MockEventListener

class HTTPStubEngine {
fun runHTTPStub(
Expand All @@ -22,7 +21,8 @@ class HTTPStubEngine {
httpClientFactory: HttpClientFactory,
workingDirectory: WorkingDirectory,
gracefulRestartTimeoutInMs: Long,
specToBaseUrlMap: Map<String, String?>
specToBaseUrlMap: Map<String, String?>,
listeners: List<MockEventListener> = emptyList()
): HttpStub {
val keyData = certInfo.getHttpsCert()

Expand All @@ -39,7 +39,8 @@ class HTTPStubEngine {
workingDirectory = workingDirectory,
specmaticConfigPath = specmaticConfigPath,
timeoutMillis = gracefulRestartTimeoutInMs,
specToStubBaseUrlMap = specToBaseUrlMap
specToStubBaseUrlMap = specToBaseUrlMap,
listeners = listeners
).also {
it.printStartupMessage()
}
Expand Down
6 changes: 5 additions & 1 deletion application/src/main/kotlin/application/StubCommand.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import io.specmatic.core.utilities.exitWithMessage
import io.specmatic.stub.ContractStub
import io.specmatic.stub.HttpClientFactory
import io.specmatic.stub.endPointFromHostAndPort
import io.specmatic.stub.listener.MockEventListener
import picocli.CommandLine.*
import java.io.File
import java.util.concurrent.Callable
Expand Down Expand Up @@ -119,6 +120,8 @@ https://docs.specmatic.io/documentation/contract_tests.html#supported-filters--o

var specmaticConfigPath: String? = null

var listeners : List<MockEventListener> = emptyList()

override fun call() {
if (delayInMilliseconds > 0) {
System.setProperty(SPECMATIC_STUB_DELAY, delayInMilliseconds.toString())
Expand Down Expand Up @@ -243,7 +246,8 @@ https://docs.specmatic.io/documentation/contract_tests.html#supported-filters--o
httpClientFactory = httpClientFactory,
workingDirectory = workingDirectory,
gracefulRestartTimeoutInMs = gracefulRestartTimeoutInMs,
specToBaseUrlMap = contractSources.specToBaseUrlMap()
specToBaseUrlMap = contractSources.specToBaseUrlMap(),
listeners = listeners
)

LogTail.storeSnapshot()
Expand Down
9 changes: 6 additions & 3 deletions core/src/main/kotlin/io/specmatic/stub/HttpStub.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import io.ktor.server.response.*
import io.ktor.util.*
import io.ktor.util.pipeline.*
import io.specmatic.core.*
import io.specmatic.core.lifecycle.LifecycleHooks
import io.specmatic.core.loadSpecmaticConfig
import io.specmatic.core.log.*
import io.specmatic.core.pattern.ContractException
Expand All @@ -33,6 +32,7 @@ import io.specmatic.mock.ScenarioStub
import io.specmatic.mock.TRANSIENT_MOCK
import io.specmatic.mock.mockFromJSON
import io.specmatic.mock.validateMock
import io.specmatic.stub.listener.MockEventListener
import io.specmatic.stub.report.StubEndpoint
import io.specmatic.stub.report.StubUsageReport
import io.specmatic.stub.report.StubUsageReportJson
Expand Down Expand Up @@ -76,7 +76,8 @@ class HttpStub(
private val timeoutMillis: Long = 0,
private val specToStubBaseUrlMap: Map<String, String?> = features.associate {
it.path to endPointFromHostAndPort(host, port, keyData)
}
},
private val listeners: List<MockEventListener> = emptyList()
) : ContractStub {
constructor(
feature: Feature,
Expand Down Expand Up @@ -298,7 +299,9 @@ class HttpStub(
handleSse(httpRequest, this@HttpStub, this)
} else {
httpStubResponse.scenario?.let { matchingScenario ->
LifecycleHooks.requestResponseMatchingScenarioHooks.call(httpRequest, httpResponse, matchingScenario)
listeners.forEach { listener ->
listener.call(httpRequest, httpResponse, matchingScenario)
}
}

val updatedHttpStubResponse = httpStubResponse.copy(response = httpResponse)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.specmatic.stub.listener

import io.specmatic.core.HttpRequest
import io.specmatic.core.HttpResponse
import io.specmatic.core.Scenario

interface MockEventListener {
fun call(
request: HttpRequest,
response: HttpResponse,
scenario: Scenario
)
}
Loading
0