92 lines
3.0 KiB
Java
92 lines
3.0 KiB
Java
package com.baeldung.pact;
|
|
|
|
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.PactDslWithProvider;
|
|
import au.com.dius.pact.model.RequestResponsePact;
|
|
import org.junit.Rule;
|
|
import org.junit.Test;
|
|
import org.springframework.http.*;
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
|
import java.io.IOException;
|
|
import java.net.ServerSocket;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.Random;
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
|
|
public class PactConsumerDrivenContractUnitTest {
|
|
|
|
private static int getAvailablePort() {
|
|
return new Random()
|
|
.ints(6000, 9000)
|
|
.filter(PactConsumerDrivenContractUnitTest::isFree)
|
|
.findFirst()
|
|
.orElse(8080);
|
|
}
|
|
|
|
private static boolean isFree(int port) {
|
|
try {
|
|
new ServerSocket(port).close();
|
|
return true;
|
|
} catch (IOException e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Rule
|
|
public PactProviderRuleMk2 mockProvider = new PactProviderRuleMk2("test_provider", "localhost", getAvailablePort(), this);
|
|
|
|
@Pact(consumer = "test_consumer")
|
|
public RequestResponsePact createPact(PactDslWithProvider builder) {
|
|
Map<String, String> headers = new HashMap<>();
|
|
headers.put("Content-Type", "application/json");
|
|
|
|
return builder
|
|
.given("test GET")
|
|
.uponReceiving("GET REQUEST")
|
|
.path("/pact")
|
|
.method("GET")
|
|
.willRespondWith()
|
|
.status(200)
|
|
.headers(headers)
|
|
.body("{\"condition\": true, \"name\": \"tom\"}")
|
|
.given("test POST")
|
|
.uponReceiving("POST REQUEST")
|
|
.method("POST")
|
|
.headers(headers)
|
|
.body("{\"name\": \"Michael\"}")
|
|
.path("/pact")
|
|
.willRespondWith()
|
|
.status(201)
|
|
.toPact();
|
|
}
|
|
|
|
@Test
|
|
@PactVerification()
|
|
public void givenGet_whenSendRequest_shouldReturn200WithProperHeaderAndBody() {
|
|
// when
|
|
ResponseEntity<String> response = new RestTemplate().getForEntity(mockProvider.getUrl() + "/pact", String.class);
|
|
|
|
// then
|
|
assertThat(response.getStatusCode().value()).isEqualTo(200);
|
|
assertThat(response.getHeaders().get("Content-Type").contains("application/json")).isTrue();
|
|
assertThat(response.getBody()).contains("condition", "true", "name", "tom");
|
|
|
|
// and
|
|
HttpHeaders httpHeaders = new HttpHeaders();
|
|
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
|
|
String jsonBody = "{\"name\": \"Michael\"}";
|
|
|
|
// when
|
|
ResponseEntity<String> postResponse = new RestTemplate().exchange(mockProvider.getUrl() + "/pact", HttpMethod.POST, new HttpEntity<>(jsonBody, httpHeaders), String.class);
|
|
|
|
// then
|
|
assertThat(postResponse.getStatusCode().value()).isEqualTo(201);
|
|
}
|
|
|
|
}
|