-
Notifications
You must be signed in to change notification settings - Fork 2
/
DecisionServiceImplPactTest.java
135 lines (114 loc) · 4.99 KB
/
DecisionServiceImplPactTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package au.com.pact.demo.service;
import au.com.dius.pact.consumer.Pact;
import au.com.dius.pact.consumer.PactProviderRuleMk2;
import au.com.dius.pact.consumer.PactVerification;
import au.com.dius.pact.consumer.dsl.PactDslJsonBody;
import au.com.dius.pact.consumer.dsl.PactDslWithProvider;
import au.com.dius.pact.model.RequestResponsePact;
import au.com.pact.demo.model.DecisionRequest;
import au.com.pact.demo.model.DecisionResponse;
import au.com.pact.demo.util.RestTemplateExecutor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import org.skyscreamer.jsonassert.JSONAssert;
import java.io.FileInputStream;
import static au.com.pact.demo.constant.DefaultValues.*;
import static au.com.pact.demo.util.RestTemplateExecutorBuilder.buildRestTemplate;
import static com.google.common.collect.ImmutableMap.of;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
@RunWith(MockitoJUnitRunner.class)
public class DecisionServiceImplPactTest {
@InjectMocks
private DecisionServiceImpl decisionService;
@Spy
private RestTemplateExecutor restTemplate = buildRestTemplate("http://localhost:8081");
// TODO: Create rule PactProviderRuleMk2 to enable mock provider
@Rule
public PactProviderRuleMk2 mockProvider = new PactProviderRuleMk2(PROVIDER_APPLE, "localhost", 8081, this);
// TODO: Create Decision Pact (Provider Apple <--> Consumer Blue)
@Pact(provider = PROVIDER_APPLE, consumer = CONSUMER_BLUE)
public RequestResponsePact createRejectedDecisionPact(PactDslWithProvider builder) {
return builder
.given("Transaction No")
.uponReceiving("Process Decision")
.path("/decision")
.method("POST")
.body(newRejectedRequest())
.willRespondWith()
.status(200)
.headers(of("Content-Type", CONTENT_TYPE))
.body(newRejectedResponse())
.toPact();
}
@Pact(provider = PROVIDER_APPLE, consumer = CONSUMER_BLUE)
public RequestResponsePact createApprovedDecisionPact(PactDslWithProvider builder) {
return builder
.given("Transaction Yes")
.uponReceiving("Process Decision")
.path("/decision")
.method("POST")
.headers(of("Content-Type", CONTENT_TYPE))
.body(newApprovedRequest())
.willRespondWith()
.status(200)
.headers(of("Content-Type", CONTENT_TYPE))
.body(newApprovedResponse())
.toPact();
}
// TODO: Create Pact Test for Provider Apple
@Test
@PactVerification(value = PROVIDER_APPLE, fragment = "createRejectedDecisionPact")
public void shouldProcessDecisionToReturnRejectedGivenDecisionRequestTransactionNo() {
DecisionRequest request = new DecisionRequest();
request.setProfileId("id12345");
request.setTransaction("no");
DecisionResponse response = decisionService.processDecision(request);
assertThat(response.getDecision(), is("Rejected"));
assertThat(response.getPolicyRule(), is("PR-8"));
assertThat(response.getCredRule(), is("CR-6"));
assertThat(response.isFlag(), is(true));
// JSONAssert.assertEquals(); // Use JSONAssert, ObjectMapper, FileStream for large payload assertion
}
@Test
@PactVerification(value = PROVIDER_APPLE, fragment = "createApprovedDecisionPact")
public void shouldProcessDecisionToReturnApprovedGivenDecisionRequestTransactionYes() {
DecisionRequest request = new DecisionRequest();
request.setProfileId("id54321");
request.setTransaction("yes");
DecisionResponse response = decisionService.processDecision(request);
assertThat(response.getDecision(), is("Approved"));
}
// TODO: load from json file if the request body is too large
private PactDslJsonBody newApprovedRequest() {
return new PactDslJsonBody()
.stringType("profileId")
.stringValue("transaction", "yes")
.asBody();
}
private PactDslJsonBody newApprovedResponse() {
return new PactDslJsonBody()
.stringType("decision", "Approved")
.booleanType("flag", true)
.asBody();
}
private PactDslJsonBody newRejectedRequest() {
return new PactDslJsonBody()
.stringType("profileId")
.stringValue("transaction", "no")
.asBody();
}
private PactDslJsonBody newRejectedResponse() {
return new PactDslJsonBody()
.stringType("decision", "Rejected")
.stringType("policyRule", "PR-8")
.stringType("credRule", "CR-6")
.booleanType("flag", true)
.asBody();
}
}