From 3e0c28d1edc2ed816fa5e239a7c9a51a14b80f94 Mon Sep 17 00:00:00 2001
From: freelansam <79205526+freelansam@users.noreply.github.com>
Date: Mon, 20 Jun 2022 18:34:22 +0530
Subject: [PATCH] JAVA-4493: Add missing live test for Consumer Driven
Contracts article (#12362)
* JAVA-4493: Add missing live test for Consumer Driven Contracts article
* JAVA-4493: Add missing live test for Consumer Driven Contracts article
---
libraries-5/pom.xml | 21 +++--
.../baeldung/pact/config/MainApplication.java | 15 ++++
.../pact}/web/controller/PactController.java | 4 +-
.../com/baeldung/pact}/web/dto/PactDto.java | 2 +-
.../src/main/resources/application.properties | 2 +
.../PactConsumerDrivenContractUnitTest.java | 67 +++++++---------
.../baeldung/pact/PactProviderLiveTest.java | 2 +-
.../PactConsumerDrivenContractUnitTest.java | 76 -------------------
8 files changed, 62 insertions(+), 127 deletions(-)
create mode 100644 libraries-5/src/main/java/com/baeldung/pact/config/MainApplication.java
rename {spring-web-modules/spring-resttemplate/src/main/java/com/baeldung/sampleapp => libraries-5/src/main/java/com/baeldung/pact}/web/controller/PactController.java (90%)
rename {spring-web-modules/spring-resttemplate/src/main/java/com/baeldung/sampleapp => libraries-5/src/main/java/com/baeldung/pact}/web/dto/PactDto.java (93%)
create mode 100644 libraries-5/src/main/resources/application.properties
rename {spring-web-modules/spring-resttemplate => libraries-5}/src/test/java/com/baeldung/pact/PactProviderLiveTest.java (96%)
delete mode 100644 spring-web-modules/spring-resttemplate/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml
index 63d1924852..85b1f3b475 100644
--- a/libraries-5/pom.xml
+++ b/libraries-5/pom.xml
@@ -6,16 +6,16 @@
libraries-5
- parent-modules
com.baeldung
- 1.0.0-SNAPSHOT
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
org.springframework
spring-web
- ${spring.version}
org.jooq
@@ -24,10 +24,19 @@
au.com.dius
- pact-jvm-consumer-junit_2.11
+ pact-jvm-provider-junit5_2.12
+ ${pact.version}
+
+
+ au.com.dius
+ pact-jvm-consumer-junit5_2.12
${pact.version}
test
+
+ org.springframework.boot
+ spring-boot-starter-web
+
com.typesafe.akka
@@ -111,10 +120,10 @@
- 3.5.0
+ 3.6.3
0.9.12
4.3.8.RELEASE
- 2.11
+ 2.12
2.5.11
0.6.5
3.0.14
diff --git a/libraries-5/src/main/java/com/baeldung/pact/config/MainApplication.java b/libraries-5/src/main/java/com/baeldung/pact/config/MainApplication.java
new file mode 100644
index 0000000000..b8a92e4742
--- /dev/null
+++ b/libraries-5/src/main/java/com/baeldung/pact/config/MainApplication.java
@@ -0,0 +1,15 @@
+package com.baeldung.pact.config;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@EnableAutoConfiguration
+@ComponentScan("com.baeldung.pact")
+public class MainApplication implements WebMvcConfigurer {
+
+ public static void main(final String[] args) {
+ SpringApplication.run(MainApplication.class, args);
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-resttemplate/src/main/java/com/baeldung/sampleapp/web/controller/PactController.java b/libraries-5/src/main/java/com/baeldung/pact/web/controller/PactController.java
similarity index 90%
rename from spring-web-modules/spring-resttemplate/src/main/java/com/baeldung/sampleapp/web/controller/PactController.java
rename to libraries-5/src/main/java/com/baeldung/pact/web/controller/PactController.java
index 0f5d7f1acb..d38f4dceb2 100644
--- a/spring-web-modules/spring-resttemplate/src/main/java/com/baeldung/sampleapp/web/controller/PactController.java
+++ b/libraries-5/src/main/java/com/baeldung/pact/web/controller/PactController.java
@@ -1,4 +1,4 @@
-package com.baeldung.sampleapp.web.controller;
+package com.baeldung.pact.web.controller;
import java.util.ArrayList;
import java.util.List;
@@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
-import com.baeldung.sampleapp.web.dto.PactDto;
+import com.baeldung.pact.web.dto.PactDto;
@RestController
public class PactController {
diff --git a/spring-web-modules/spring-resttemplate/src/main/java/com/baeldung/sampleapp/web/dto/PactDto.java b/libraries-5/src/main/java/com/baeldung/pact/web/dto/PactDto.java
similarity index 93%
rename from spring-web-modules/spring-resttemplate/src/main/java/com/baeldung/sampleapp/web/dto/PactDto.java
rename to libraries-5/src/main/java/com/baeldung/pact/web/dto/PactDto.java
index e184119611..1525f23478 100644
--- a/spring-web-modules/spring-resttemplate/src/main/java/com/baeldung/sampleapp/web/dto/PactDto.java
+++ b/libraries-5/src/main/java/com/baeldung/pact/web/dto/PactDto.java
@@ -1,4 +1,4 @@
-package com.baeldung.sampleapp.web.dto;
+package com.baeldung.pact.web.dto;
public class PactDto {
diff --git a/libraries-5/src/main/resources/application.properties b/libraries-5/src/main/resources/application.properties
new file mode 100644
index 0000000000..1a26e3ad99
--- /dev/null
+++ b/libraries-5/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+server.port=8082
+server.servlet.context-path=/spring-rest
\ No newline at end of file
diff --git a/libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java b/libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
index 8d4918a3e7..6e8703be0d 100644
--- a/libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
+++ b/libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
@@ -1,46 +1,31 @@
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;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+import au.com.dius.pact.consumer.MockServer;
+import au.com.dius.pact.consumer.Pact;
+import au.com.dius.pact.consumer.dsl.PactDslWithProvider;
+import au.com.dius.pact.consumer.junit5.PactConsumerTestExt;
+import au.com.dius.pact.consumer.junit5.PactTestFor;
+import au.com.dius.pact.model.RequestResponsePact;
+
+@ExtendWith(PactConsumerTestExt.class)
+@PactTestFor(providerName = "test_provider", hostInterface="localhost")
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")
+ @Pact(provider="test_provider", consumer = "test_consumer")
public RequestResponsePact createPact(PactDslWithProvider builder) {
Map headers = new HashMap<>();
headers.put("Content-Type", "application/json");
@@ -66,10 +51,10 @@ public class PactConsumerDrivenContractUnitTest {
}
@Test
- @PactVerification()
- public void givenGet_whenSendRequest_shouldReturn200WithProperHeaderAndBody() {
+ @PactTestFor
+ void givenGet_whenSendRequest_shouldReturn200WithProperHeaderAndBody(MockServer mockServer) {
// when
- ResponseEntity response = new RestTemplate().getForEntity(mockProvider.getUrl() + "/pact", String.class);
+ ResponseEntity response = new RestTemplate().getForEntity(mockServer.getUrl() + "/pact", String.class);
// then
assertThat(response.getStatusCode().value()).isEqualTo(200);
@@ -82,7 +67,7 @@ public class PactConsumerDrivenContractUnitTest {
String jsonBody = "{\"name\": \"Michael\"}";
// when
- ResponseEntity postResponse = new RestTemplate().exchange(mockProvider.getUrl() + "/pact", HttpMethod.POST, new HttpEntity<>(jsonBody, httpHeaders), String.class);
+ ResponseEntity postResponse = new RestTemplate().exchange(mockServer.getUrl() + "/pact", HttpMethod.POST, new HttpEntity<>(jsonBody, httpHeaders), String.class);
// then
assertThat(postResponse.getStatusCode().value()).isEqualTo(201);
diff --git a/spring-web-modules/spring-resttemplate/src/test/java/com/baeldung/pact/PactProviderLiveTest.java b/libraries-5/src/test/java/com/baeldung/pact/PactProviderLiveTest.java
similarity index 96%
rename from spring-web-modules/spring-resttemplate/src/test/java/com/baeldung/pact/PactProviderLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/pact/PactProviderLiveTest.java
index c59a4ea59f..7b72dec852 100644
--- a/spring-web-modules/spring-resttemplate/src/test/java/com/baeldung/pact/PactProviderLiveTest.java
+++ b/libraries-5/src/test/java/com/baeldung/pact/PactProviderLiveTest.java
@@ -7,7 +7,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.SpringApplication;
import org.springframework.web.context.ConfigurableWebApplicationContext;
-import com.baeldung.sampleapp.config.MainApplication;
+import com.baeldung.pact.config.MainApplication;
import au.com.dius.pact.provider.junit.Provider;
import au.com.dius.pact.provider.junit.State;
diff --git a/spring-web-modules/spring-resttemplate/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java b/spring-web-modules/spring-resttemplate/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
deleted file mode 100644
index 6e8703be0d..0000000000
--- a/spring-web-modules/spring-resttemplate/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.baeldung.pact;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.client.RestTemplate;
-
-import au.com.dius.pact.consumer.MockServer;
-import au.com.dius.pact.consumer.Pact;
-import au.com.dius.pact.consumer.dsl.PactDslWithProvider;
-import au.com.dius.pact.consumer.junit5.PactConsumerTestExt;
-import au.com.dius.pact.consumer.junit5.PactTestFor;
-import au.com.dius.pact.model.RequestResponsePact;
-
-@ExtendWith(PactConsumerTestExt.class)
-@PactTestFor(providerName = "test_provider", hostInterface="localhost")
-public class PactConsumerDrivenContractUnitTest {
-
- @Pact(provider="test_provider", consumer = "test_consumer")
- public RequestResponsePact createPact(PactDslWithProvider builder) {
- Map 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
- @PactTestFor
- void givenGet_whenSendRequest_shouldReturn200WithProperHeaderAndBody(MockServer mockServer) {
- // when
- ResponseEntity response = new RestTemplate().getForEntity(mockServer.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 postResponse = new RestTemplate().exchange(mockServer.getUrl() + "/pact", HttpMethod.POST, new HttpEntity<>(jsonBody, httpHeaders), String.class);
-
- // then
- assertThat(postResponse.getStatusCode().value()).isEqualTo(201);
- }
-
-}