Skip to content

Commit 53baadf

Browse files
author
Ronald Holshausen
committed
feat: Plugin verifyInteraction requires the Pact and Interaction
1 parent 1220ed2 commit 53baadf

File tree

9 files changed

+45
-17
lines changed

9 files changed

+45
-17
lines changed

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
groovyVersion=3.0.8
1+
groovyVersion=3.0.10
22
kotlinVersion=1.6.10
33
httpBuilderVersion=1.0.4
44
commonsLang3Version=3.12.0

provider/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class ReadmeExamplePactJVMProviderJUnitTest {
4848
consumer.setPactSource(new UrlSource(
4949
ReadmeExamplePactJVMProviderJUnitTest.getResource('/pacts/zoo_app-animal_service.json').toString()))
5050
51-
testConsumerPact = DefaultPactReader.INSTANCE.loadPact(consumer.getPactSource()) as Pact<RequestResponseInteraction>
51+
testConsumerPact = DefaultPactReader.INSTANCE.loadPact(consumer.getPactSource())
5252
}
5353
5454
@Test

provider/junit5/src/main/kotlin/au/com/dius/pact/provider/junit5/PactVerificationContext.kt

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package au.com.dius.pact.provider.junit5
22

33
import au.com.dius.pact.core.matchers.DefaultResponseGenerator
44
import au.com.dius.pact.core.model.Interaction
5+
import au.com.dius.pact.core.model.Pact
56
import au.com.dius.pact.core.model.PactSource
67
import au.com.dius.pact.core.model.RequestResponseInteraction
78
import au.com.dius.pact.core.model.V4Interaction
@@ -19,6 +20,8 @@ import au.com.dius.pact.provider.ProviderVerifier
1920
import au.com.dius.pact.provider.VerificationFailureType
2021
import au.com.dius.pact.provider.VerificationResult
2122
import au.com.dius.pact.provider.junitsupport.TestDescription
23+
import com.github.michaelbull.result.Err
24+
import com.github.michaelbull.result.Ok
2225
import org.junit.jupiter.api.extension.ExtensionContext
2326

2427
/**
@@ -34,6 +37,7 @@ data class PactVerificationContext @JvmOverloads constructor(
3437
var providerInfo: IProviderInfo,
3538
val consumer: IConsumerInfo,
3639
val interaction: Interaction,
40+
val pact: Pact,
3741
var testExecutionResult: MutableList<VerificationResult.Failed> = mutableListOf()
3842
) {
3943
val stateChangeHandlers: MutableList<Any> = mutableListOf()
@@ -120,7 +124,11 @@ data class PactVerificationContext @JvmOverloads constructor(
120124
}
121125
}
122126
PactVerification.PLUGIN -> {
123-
return listOf(verifier!!.verifyInteractionViaPlugin(providerInfo, consumer, interaction,
127+
val v4pact = when(val p = pact.asV4Pact()) {
128+
is Ok -> p.value
129+
is Err -> throw RuntimeException("Plugins can only be used with V4 Pacts")
130+
}
131+
return listOf(verifier!!.verifyInteractionViaPlugin(providerInfo, consumer, v4pact, interaction.asV4Interaction(),
124132
client, request, context + ("userConfig" to target.userConfig)))
125133
}
126134
else -> {

provider/junit5/src/main/kotlin/au/com/dius/pact/provider/junit5/PactVerificationExtension.kt

+7-2
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,14 @@ open class PactVerificationExtension(
9797
val store = context.getStore(namespace)
9898
val pending = interaction.isV4() && interaction.asV4Interaction().pending ||
9999
pactSource is BrokerUrlSource && pactSource.result?.pending == true
100-
val verificationContext = PactVerificationContext(store, context,
100+
val verificationContext = PactVerificationContext(
101+
store,
102+
context,
101103
consumer = ConsumerInfo(pact.consumer.name, pactSource = pactSource, pending = pending),
102-
interaction = interaction, providerInfo = ProviderInfo(serviceName))
104+
interaction = interaction,
105+
pact = pact,
106+
providerInfo = ProviderInfo(serviceName)
107+
)
103108
store.put("interactionContext", verificationContext)
104109
}
105110

provider/junit5/src/test/groovy/au/com/dius/pact/provider/junit5/PactVerificationContextSpec.groovy

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package au.com.dius.pact.provider.junit5
22

3+
import au.com.dius.pact.core.model.Consumer
34
import au.com.dius.pact.core.model.Interaction
5+
import au.com.dius.pact.core.model.Provider
46
import au.com.dius.pact.core.model.Request
57
import au.com.dius.pact.core.model.RequestResponseInteraction
8+
import au.com.dius.pact.core.model.RequestResponsePact
69
import au.com.dius.pact.core.model.Response
710
import au.com.dius.pact.core.support.expressions.ValueResolver
811
import au.com.dius.pact.provider.ConsumerInfo
@@ -41,10 +44,11 @@ class PactVerificationContextSpec extends Specification {
4144
IConsumerInfo consumer = new ConsumerInfo('Test')
4245
Interaction interaction = new RequestResponseInteraction('Test Interaction', [], new Request(),
4346
new Response(), '12345')
47+
def pact = new RequestResponsePact(new Provider(), new Consumer(), [interaction ])
4448
List<VerificationResult> testResults = []
4549

4650
context = new PactVerificationContext(store, extContext, target, verifier, valueResolver,
47-
provider, consumer, interaction, testResults)
51+
provider, consumer, interaction, pact, testResults)
4852

4953
when:
5054
context.verifyInteraction()
@@ -85,10 +89,11 @@ class PactVerificationContextSpec extends Specification {
8589
}
8690
Interaction interaction = new RequestResponseInteraction('Test Interaction', [], new Request(),
8791
new Response(), '12345')
92+
def pact = new RequestResponsePact(new Provider(), new Consumer(), [ interaction ])
8893
List<VerificationResult> testResults = []
8994

9095
context = new PactVerificationContext(store, extContext, target, verifier, valueResolver,
91-
provider, consumer, interaction, testResults)
96+
provider, consumer, interaction, pact, testResults)
9297

9398
when:
9499
context.verifyInteraction()

provider/junit5/src/test/groovy/au/com/dius/pact/provider/junit5/PactVerificationExtensionSpec.groovy

+3-3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class PactVerificationExtensionSpec extends Specification {
4242
PactBrokerSource pactSource = new PactBrokerSource('localhost', '80', 'http')
4343

4444
context = new PactVerificationContext(store, extContext, Stub(TestTarget), Stub(IProviderVerifier),
45-
Stub(ValueResolver), Stub(IProviderInfo), Stub(IConsumerInfo), interaction1, [])
45+
Stub(ValueResolver), Stub(IProviderInfo), Stub(IConsumerInfo), interaction1, pact, [])
4646

4747
PactVerificationExtension extension = new PactVerificationExtension(filteredPact, pactSource, interaction1,
4848
'service', 'consumer', mockValueResolver)
@@ -77,7 +77,7 @@ class PactVerificationExtensionSpec extends Specification {
7777
PactBrokerSource pactSource = new PactBrokerSource('localhost', '80', 'http')
7878

7979
context = new PactVerificationContext(store, extContext, Stub(TestTarget), Stub(IProviderVerifier),
80-
Stub(ValueResolver), Stub(IProviderInfo), Stub(IConsumerInfo), interaction1, [])
80+
Stub(ValueResolver), Stub(IProviderInfo), Stub(IConsumerInfo), interaction1, pact, [])
8181

8282
PactVerificationExtension extension = new PactVerificationExtension(pact, pactSource, interaction1,
8383
'service', 'consumer', mockValueResolver)
@@ -111,7 +111,7 @@ class PactVerificationExtensionSpec extends Specification {
111111
def pact = new RequestResponsePact(new Provider(), new Consumer(), [interaction1, interaction2 ], [:], pactSource)
112112

113113
context = new PactVerificationContext(store, extContext, Stub(TestTarget), Stub(IProviderVerifier),
114-
Stub(ValueResolver), Stub(IProviderInfo), Stub(IConsumerInfo), interaction1, [])
114+
Stub(ValueResolver), Stub(IProviderInfo), Stub(IConsumerInfo), interaction1, pact, [])
115115

116116
PactVerificationExtension extension = new PactVerificationExtension(pact, pactSource, interaction1,
117117
'service', 'consumer', mockValueResolver)

provider/junit5/src/test/groovy/au/com/dius/pact/provider/junit5/PactVerificationStateChangeExtensionSpec.groovy

+3-2
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class PactVerificationStateChangeExtensionSpec extends Specification {
8080
store = Mock(ExtensionContext.Store)
8181
provider = Mock()
8282
consumer = Mock()
83-
pactContext = new PactVerificationContext(store, testContext, provider, consumer, interaction)
83+
pactContext = new PactVerificationContext(store, testContext, provider, consumer, interaction, pact)
8484
}
8585

8686
@Unroll
@@ -120,6 +120,7 @@ class PactVerificationStateChangeExtensionSpec extends Specification {
120120
given:
121121
def state = new ProviderState('test state')
122122
def interaction = new RequestResponseInteraction('test', [ state ])
123+
pact = new RequestResponsePact(new Provider(), new Consumer(), [ interaction ])
123124
def context = Mock(ExtensionContext) {
124125
getStore(_) >> store
125126
getRequiredTestClass() >> TestClass
@@ -129,7 +130,7 @@ class PactVerificationStateChangeExtensionSpec extends Specification {
129130
IProviderVerifier verifier = Mock()
130131
ValueResolver resolver = Mock()
131132
def verificationContext = new PactVerificationContext(store, context, target, verifier, resolver, provider,
132-
consumer, interaction, [])
133+
consumer, interaction, pact, [])
133134
store.get(_) >> verificationContext
134135
verificationExtension = new PactVerificationStateChangeExtension(interaction, pactSource)
135136

provider/src/main/kotlin/au/com/dius/pact/provider/ProviderVerifier.kt

+13-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import au.com.dius.pact.core.model.ProviderState
1919
import au.com.dius.pact.core.model.SynchronousRequestResponse
2020
import au.com.dius.pact.core.model.UrlPactSource
2121
import au.com.dius.pact.core.model.UrlSource
22+
import au.com.dius.pact.core.model.V4Interaction
23+
import au.com.dius.pact.core.model.V4Pact
2224
import au.com.dius.pact.core.model.generators.GeneratorTestMode
2325
import au.com.dius.pact.core.model.messaging.Message
2426
import au.com.dius.pact.core.model.messaging.MessageInteraction
@@ -290,7 +292,8 @@ interface IProviderVerifier {
290292
fun verifyInteractionViaPlugin(
291293
providerInfo: IProviderInfo,
292294
consumer: IConsumerInfo,
293-
interaction: Interaction,
295+
pact: V4Pact,
296+
interaction: V4Interaction,
294297
client: Any?,
295298
request: Any?,
296299
context: Map<String, Any>
@@ -943,13 +946,20 @@ open class ProviderVerifier @JvmOverloads constructor (
943946
override fun verifyInteractionViaPlugin(
944947
providerInfo: IProviderInfo,
945948
consumer: IConsumerInfo,
946-
interaction: Interaction,
949+
pact: V4Pact,
950+
interaction: V4Interaction,
947951
client: Any?,
948952
request: Any?,
949953
context: Map<String, Any>
950954
): VerificationResult {
951955
val userConfig = context["userConfig"] as Map<String, Any?>? ?: emptyMap()
952-
return when (val result = DefaultPluginManager.verifyInteraction(client as CatalogueEntry, request as InteractionVerificationData, userConfig)) {
956+
return when (val result = DefaultPluginManager.verifyInteraction(
957+
client as CatalogueEntry,
958+
request as InteractionVerificationData,
959+
userConfig,
960+
pact,
961+
interaction
962+
)) {
953963
is Ok -> if (result.value.ok) {
954964
VerificationResult.Ok(interaction.interactionId)
955965
} else {

provider/src/test/groovy/au/com/dius/pact/provider/readme/ReadmeExamplePactJVMProviderJUnitTest.groovy

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import au.com.dius.pact.core.model.DefaultPactReader
44
import au.com.dius.pact.core.model.Interaction
55
import au.com.dius.pact.core.model.Pact
66
import au.com.dius.pact.core.model.ProviderState
7-
import au.com.dius.pact.core.model.RequestResponseInteraction
87
import au.com.dius.pact.core.model.UrlSource
98
import au.com.dius.pact.provider.ConsumerInfo
109
import au.com.dius.pact.provider.HttpClientFactory
@@ -56,7 +55,7 @@ class ReadmeExamplePactJVMProviderJUnitTest {
5655
consumer.setPactSource(new UrlSource(
5756
ReadmeExamplePactJVMProviderJUnitTest.getResource('/pacts/zoo_app-animal_service.json').toString()))
5857

59-
testConsumerPact = DefaultPactReader.INSTANCE.loadPact(consumer.getPactSource()) as Pact<RequestResponseInteraction>
58+
testConsumerPact = DefaultPactReader.INSTANCE.loadPact(consumer.getPactSource())
6059
}
6160

6261
@Test

0 commit comments

Comments
 (0)