/
BiscuitsContractTest.kt
124 lines (97 loc) · 3.9 KB
/
BiscuitsContractTest.kt
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
package contracts
import au.com.dius.pact.consumer.ConsumerPactBuilder
import au.com.dius.pact.consumer.MockServer
import au.com.dius.pact.consumer.PactTestExecutionContext
import au.com.dius.pact.consumer.PactTestRun
import au.com.dius.pact.consumer.PactVerificationResult
import au.com.dius.pact.consumer.dsl.PactDslJsonArray.*
import au.com.dius.pact.consumer.model.MockProviderConfig
import au.com.dius.pact.consumer.runConsumerTest
import au.com.dius.pact.core.model.RequestResponsePact
import clients.DefaultBiscuitClient
import clients.DefaultBiscuitRepository
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
private const val PACT_PORT = 6060
class BiscuitsContractTest {
private val pactMockServer = "http://localhost:$PACT_PORT"
private val biscuitRepository = DefaultBiscuitRepository(DefaultBiscuitClient(pactMockServer))
@Test
fun `should find a biscuit for given id`() {
val biscuitId = "1"
val primedResponse = ConsumerPactBuilder
.consumer("shop")
.hasPactWith("biscuits")
.given("Biscuit exists")
.uponReceiving("Request for existing biscuit")
.path("/biscuits/$biscuitId")
.method("GET")
.willRespondWith()
.status(200)
.headers(mapOf("Content-Type" to "application/json"))
.body(
"""
{ "name" : "Club" }
"""
)
.toPact()
val deferredResult = primedResponse.runTest {
val biscuit = biscuitRepository.getBiscuit(biscuitId)
assertThat(biscuit?.name).isNotNull()
}
// This is super important! If you don't include this, your test will
// always pass
assertThat(deferredResult).isEqualTo(PactVerificationResult.Ok())
}
@Test
fun `should handle no biscuit found`() {
val biscuitId = "DUMMY"
val primedNotFoundResponse = ConsumerPactBuilder
.consumer("shop")
.hasPactWith("biscuits")
.given("Biscuit does not exist")
.uponReceiving("Request for missing biscuit")
.path("/biscuits/$biscuitId")
.method("GET")
.willRespondWith()
.status(404)
.headers(mapOf("Content-Type" to "application/json"))
.toPact()
val deferredResult = primedNotFoundResponse.runTest {
val biscuit = biscuitRepository.getBiscuit(biscuitId)
assertThat(biscuit).isNull()
}
assertThat(deferredResult).isEqualTo(PactVerificationResult.Ok())
}
@Test
fun `should find all biscuits`() {
val biscuitsService = ConsumerPactBuilder
.consumer("shop")
.hasPactWith("biscuits")
.uponReceiving("Request for all biscuits")
.path("/biscuits")
.method("GET")
val patternMatchAllBiscuitsArray = arrayEachLike()
.stringType("name", "My Biscuit Name")
val mockedServer = biscuitsService
.willRespondWith()
.status(200)
.headers(mapOf("Content-Type" to "application/json"))
.body(patternMatchAllBiscuitsArray)
.toPact()
val deferredResult = mockedServer.runTest {
val biscuits = biscuitRepository.getAllBiscuits()
assertThat(biscuits.first().name).isEqualTo("My Biscuit Name")
}
assertThat(deferredResult).isEqualTo(PactVerificationResult.Ok())
}
}
private fun RequestResponsePact.runTest(testAndAssertions: () -> Unit): PactVerificationResult {
val config = MockProviderConfig.httpConfig(port = PACT_PORT)
return runConsumerTest(this, config, object : PactTestRun<Nothing?> {
override fun run(mockServer: MockServer, context: PactTestExecutionContext?): Nothing? {
testAndAssertions()
return null
}
})
}