Skip to content

Commit 92018c0

Browse files
committed
fix: InteractionFilter ByRequestPath was using concrete class and did not work with V4 interactions #1673
1 parent 67a6670 commit 92018c0

File tree

3 files changed

+85
-33
lines changed

3 files changed

+85
-33
lines changed

core/model/src/main/kotlin/au/com/dius/pact/core/model/V4Pact.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,15 @@ sealed class V4Interaction(
183183
interactionMarkup, transport),
184184
SynchronousRequestResponse {
185185

186+
@JvmOverloads
187+
constructor(
188+
description: String,
189+
providerStates: List<ProviderState> = listOf(),
190+
request: HttpRequest = HttpRequest(),
191+
response: HttpResponse = HttpResponse(),
192+
interactionId: String? = null
193+
): this("", description, providerStates, request, response, interactionId)
194+
186195
override fun toString(): String {
187196
val pending = if (pending) " [PENDING]" else ""
188197
return "Interaction: $description$pending\n\tin states ${displayState()}\n" +
@@ -290,6 +299,14 @@ sealed class V4Interaction(
290299
interactionMarkup, transport),
291300
MessageInteraction {
292301

302+
@JvmOverloads
303+
constructor(
304+
description: String,
305+
providerStates: List<ProviderState> = listOf(),
306+
contents: MessageContents = MessageContents(),
307+
interactionId: String? = null
308+
): this("", description, contents, interactionId, providerStates)
309+
293310
override fun toString(): String {
294311
val pending = if (pending) " [PENDING]" else ""
295312
return "Interaction: $description$pending\n\tin states ${displayState()}\n" +
@@ -388,6 +405,16 @@ sealed class V4Interaction(
388405
transport: String? = null
389406
) : V4Interaction(key, description, interactionId, providerStates, comments, pending, pluginConfiguration,
390407
interactionMarkup, transport), MessageInteraction {
408+
409+
@JvmOverloads
410+
constructor(
411+
description: String,
412+
providerStates: List<ProviderState> = listOf(),
413+
request: MessageContents = MessageContents(),
414+
response: MutableList<MessageContents> = mutableListOf(),
415+
interactionId: String? = null
416+
): this("", description, interactionId, providerStates, mutableMapOf(), false, request, response)
417+
391418
override fun withGeneratedKey(): V4Interaction {
392419
return SynchronousMessages(
393420
generateKey(),

provider/src/main/java/au/com/dius/pact/provider/junitsupport/filter/InteractionFilter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import au.com.dius.pact.core.model.Interaction;
44
import au.com.dius.pact.core.model.RequestResponseInteraction;
5+
import au.com.dius.pact.core.model.SynchronousRequestResponse;
56

67
import java.util.Arrays;
78
import java.util.function.Predicate;
@@ -34,9 +35,9 @@ class ByRequestPath<I extends Interaction> implements InteractionFilter<I> {
3435
@Override
3536
public Predicate<I> buildPredicate(String[] values) {
3637
return interaction -> {
37-
if (interaction instanceof RequestResponseInteraction) {
38+
if (interaction instanceof SynchronousRequestResponse) {
3839
return Arrays.stream(values).anyMatch(value ->
39-
((RequestResponseInteraction) interaction).getRequest().getPath().matches(value)
40+
((SynchronousRequestResponse) interaction).getRequest().getPath().matches(value)
4041
);
4142
} else {
4243
return false;

provider/src/test/java/au/com/dius/pact/provider/junit/filter/InteractionFilterTest.java

Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
package au.com.dius.pact.provider.junit.filter;
22

3+
import au.com.dius.pact.core.model.HttpRequest;
34
import au.com.dius.pact.core.model.Interaction;
45
import au.com.dius.pact.core.model.ProviderState;
56
import au.com.dius.pact.core.model.Request;
67
import au.com.dius.pact.core.model.RequestResponseInteraction;
8+
import au.com.dius.pact.core.model.V4Interaction;
79
import au.com.dius.pact.core.model.messaging.Message;
810
import au.com.dius.pact.provider.junitsupport.filter.InteractionFilter;
911
import org.junit.Assert;
12+
import org.junit.jupiter.api.Assertions;
1013
import org.junit.jupiter.api.Nested;
1114
import org.junit.jupiter.api.Test;
15+
import org.junit.jupiter.params.ParameterizedTest;
16+
import org.junit.jupiter.params.provider.ValueSource;
1217

1318
import java.lang.reflect.InvocationTargetException;
1419
import java.util.Arrays;
1520
import java.util.Collections;
21+
import java.util.List;
1622

1723
class InteractionFilterTest {
1824

@@ -25,34 +31,27 @@ class ByProviderState {
2531
ByProviderState() throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
2632
}
2733

28-
@Test
29-
public void filterRequestResponseInteraction() {
30-
RequestResponseInteraction interaction = new RequestResponseInteraction(
34+
@ParameterizedTest
35+
@ValueSource(classes = {
36+
RequestResponseInteraction.class,
37+
Message.class,
38+
V4Interaction.SynchronousHttp.class,
39+
V4Interaction.SynchronousMessages.class,
40+
V4Interaction.AsynchronousMessage.class
41+
})
42+
public void filterInteraction(Class interactionClass)
43+
throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
44+
Interaction interaction = (Interaction) interactionClass.getDeclaredConstructor(String.class, List.class).newInstance(
3145
"test",
3246
Arrays.asList(new ProviderState("state1"), new ProviderState("state2"))
3347
);
3448

35-
Assert.assertTrue(interactionFilter.buildPredicate(new String[]{"state1"}).test(interaction));
36-
Assert.assertFalse(interactionFilter.buildPredicate(new String[]{"noop"}).test(interaction));
37-
Assert.assertTrue(interactionFilter.buildPredicate(new String[]{"state1", "state2"}).test(interaction));
38-
Assert.assertTrue(interactionFilter.buildPredicate(new String[]{"noop", "state2"}).test(interaction));
39-
Assert.assertTrue(interactionFilter.buildPredicate(new String[]{"state1", "state2"}).test(interaction));
40-
Assert.assertFalse(interactionFilter.buildPredicate(new String[]{""}).test(interaction));
41-
}
42-
43-
@Test
44-
public void filterMessageInteraction() {
45-
Message interaction = new Message(
46-
"test",
47-
Arrays.asList(new ProviderState("state1"), new ProviderState("state2"))
48-
);
49-
50-
Assert.assertTrue(interactionFilter.buildPredicate(new String[]{"state1"}).test(interaction));
51-
Assert.assertFalse(interactionFilter.buildPredicate(new String[]{"noop"}).test(interaction));
52-
Assert.assertTrue(interactionFilter.buildPredicate(new String[]{"state1", "state2"}).test(interaction));
53-
Assert.assertTrue(interactionFilter.buildPredicate(new String[]{"noop", "state2"}).test(interaction));
54-
Assert.assertTrue(interactionFilter.buildPredicate(new String[]{"state1", "state2"}).test(interaction));
55-
Assert.assertFalse(interactionFilter.buildPredicate(new String[]{""}).test(interaction));
49+
Assertions.assertTrue(interactionFilter.buildPredicate(new String[]{"state1"}).test(interaction));
50+
Assertions.assertFalse(interactionFilter.buildPredicate(new String[]{"noop"}).test(interaction));
51+
Assertions.assertTrue(interactionFilter.buildPredicate(new String[]{"state1", "state2"}).test(interaction));
52+
Assertions.assertTrue(interactionFilter.buildPredicate(new String[]{"noop", "state2"}).test(interaction));
53+
Assertions.assertTrue(interactionFilter.buildPredicate(new String[]{"state1", "state2"}).test(interaction));
54+
Assertions.assertFalse(interactionFilter.buildPredicate(new String[]{""}).test(interaction));
5655
}
5756
}
5857

@@ -73,16 +72,41 @@ public void filterRequestResponseInteraction() {
7372
new Request("GET", "/some-path")
7473
);
7574

76-
Assert.assertTrue(interactionFilter.buildPredicate(new String[]{"\\/some-path"}).test(interaction));
77-
Assert.assertFalse(interactionFilter.buildPredicate(new String[]{"other"}).test(interaction));
78-
Assert.assertTrue(interactionFilter.buildPredicate(new String[]{"\\/some-path.*"}).test(interaction));
79-
Assert.assertTrue(interactionFilter.buildPredicate(new String[]{".*some-path"}).test(interaction));
80-
Assert.assertFalse(interactionFilter.buildPredicate(new String[]{""}).test(interaction));
75+
Assertions.assertTrue(interactionFilter.buildPredicate(new String[]{"\\/some-path"}).test(interaction));
76+
Assertions.assertFalse(interactionFilter.buildPredicate(new String[]{"other"}).test(interaction));
77+
Assertions.assertTrue(interactionFilter.buildPredicate(new String[]{"\\/some-path.*"}).test(interaction));
78+
Assertions.assertTrue(interactionFilter.buildPredicate(new String[]{".*some-path"}).test(interaction));
79+
Assertions.assertFalse(interactionFilter.buildPredicate(new String[]{""}).test(interaction));
8180
}
8281

8382
@Test
84-
public void filterMessageInteraction() {
85-
Message interaction = new Message("test", Collections.emptyList());
83+
public void filterSynchronousHttpInteraction() {
84+
V4Interaction.SynchronousHttp interaction = new V4Interaction.SynchronousHttp(
85+
"key",
86+
"test",
87+
Collections.emptyList(),
88+
new HttpRequest("GET", "/some-path")
89+
);
90+
91+
Assertions.assertTrue(interactionFilter.buildPredicate(new String[]{"\\/some-path"}).test(interaction));
92+
Assertions.assertFalse(interactionFilter.buildPredicate(new String[]{"other"}).test(interaction));
93+
Assertions.assertTrue(interactionFilter.buildPredicate(new String[]{"\\/some-path.*"}).test(interaction));
94+
Assertions.assertTrue(interactionFilter.buildPredicate(new String[]{".*some-path"}).test(interaction));
95+
Assertions.assertFalse(interactionFilter.buildPredicate(new String[]{""}).test(interaction));
96+
}
97+
98+
@ParameterizedTest
99+
@ValueSource(classes = {
100+
Message.class,
101+
V4Interaction.SynchronousMessages.class,
102+
V4Interaction.AsynchronousMessage.class
103+
})
104+
public void filterMessageInteraction(Class interactionClass)
105+
throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
106+
Interaction interaction = (Interaction) interactionClass.getDeclaredConstructor(String.class, List.class).newInstance(
107+
"test",
108+
Collections.emptyList()
109+
);
86110
Assert.assertFalse(interactionFilter.buildPredicate(new String[]{".*"}).test(interaction));
87111
}
88112
}

0 commit comments

Comments
 (0)