WIP
authorKai Moritz <kai@juplo.de>
Sat, 13 Mar 2021 14:06:42 +0000 (15:06 +0100)
committerKai Moritz <kai@juplo.de>
Sun, 14 Mar 2021 08:44:54 +0000 (09:44 +0100)
pom.xml
pwreset/pom.xml
pwreset/src/main/java/de/juplo/demos/consumer/adapter/RemoteUsersServiceConsumer.java [new file with mode: 0644]
pwreset/src/main/java/de/juplo/demos/consumer/adapter/UserDTO.java [new file with mode: 0644]
pwreset/src/main/java/de/juplo/demos/consumer/domain/User.java [new file with mode: 0644]
pwreset/src/main/java/de/juplo/demos/consumer/domain/UsersService.java [new file with mode: 0644]
pwreset/src/test/java/de/juplo/demos/consumer/adapter/RemoteUsersServiceConsumerIT.java [new file with mode: 0644]

diff --git a/pom.xml b/pom.xml
index 97f526e..9bee286 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -16,6 +16,7 @@
        <description>Pact-Demo based on Spring Boot</description>
        <properties>
                <java.version>11</java.version>
+               <pact.version>4.2.2</pact.version>
        </properties>
        <modules>
                <module>pwreset</module>
index e63871b..954f451 100644 (file)
                        <artifactId>spring-boot-starter-test</artifactId>
                        <scope>test</scope>
                </dependency>
+               <dependency>
+                       <groupId>au.com.dius.pact.consumer</groupId>
+                       <artifactId>junit5</artifactId>
+                       <version>${pact.version}</version>
+                       <scope>test</scope>
+               </dependency>
        </dependencies>
 
        <build>
@@ -44,6 +50,9 @@
                                        </excludes>
                                </configuration>
                        </plugin>
+                       <plugin>
+                               <artifactId>maven-failsafe-plugin</artifactId>
+                       </plugin>
                </plugins>
        </build>
 
diff --git a/pwreset/src/main/java/de/juplo/demos/consumer/adapter/RemoteUsersServiceConsumer.java b/pwreset/src/main/java/de/juplo/demos/consumer/adapter/RemoteUsersServiceConsumer.java
new file mode 100644 (file)
index 0000000..8cbc3eb
--- /dev/null
@@ -0,0 +1,40 @@
+package de.juplo.demos.consumer.adapter;
+
+import de.juplo.demos.consumer.domain.User;
+import de.juplo.demos.consumer.domain.UsersService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.Optional;
+
+
+@RequiredArgsConstructor
+public class RemoteUsersServiceConsumer implements UsersService
+{
+  private final String uriTemplate;
+  private final RestTemplate restTemplate;
+
+
+  @Override
+  public Optional<User> getUserByEmail(String email) {
+    ResponseEntity<UserDTO> response =
+        restTemplate.getForEntity(uriTemplate, UserDTO.class, email);
+    HttpStatus status = response.getStatusCode();
+    UserDTO dto = response.getBody();
+    switch (response.getStatusCode()) {
+      case OK:
+        return
+            Optional.of(
+                User.builder()
+                    .id(dto.id)
+                    .email(dto.email)
+                    .build());
+      case NOT_FOUND:
+        return Optional.empty();
+      default:
+        throw new RuntimeException(status.toString());
+    }
+  }
+}
diff --git a/pwreset/src/main/java/de/juplo/demos/consumer/adapter/UserDTO.java b/pwreset/src/main/java/de/juplo/demos/consumer/adapter/UserDTO.java
new file mode 100644 (file)
index 0000000..bcf2692
--- /dev/null
@@ -0,0 +1,13 @@
+package de.juplo.demos.consumer.adapter;
+
+import lombok.Setter;
+
+import java.util.UUID;
+
+
+@Setter
+public class UserDTO
+{
+  UUID id;
+  String email;
+}
diff --git a/pwreset/src/main/java/de/juplo/demos/consumer/domain/User.java b/pwreset/src/main/java/de/juplo/demos/consumer/domain/User.java
new file mode 100644 (file)
index 0000000..521ad27
--- /dev/null
@@ -0,0 +1,15 @@
+package de.juplo.demos.consumer.domain;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.UUID;
+
+
+@Data
+@Builder
+public class User
+{
+  private UUID id;
+  private String email;
+}
diff --git a/pwreset/src/main/java/de/juplo/demos/consumer/domain/UsersService.java b/pwreset/src/main/java/de/juplo/demos/consumer/domain/UsersService.java
new file mode 100644 (file)
index 0000000..f6738e9
--- /dev/null
@@ -0,0 +1,9 @@
+package de.juplo.demos.consumer.domain;
+
+import java.util.Optional;
+
+
+public interface UsersService
+{
+  Optional<User> getUserByEmail(String email);
+}
diff --git a/pwreset/src/test/java/de/juplo/demos/consumer/adapter/RemoteUsersServiceConsumerIT.java b/pwreset/src/test/java/de/juplo/demos/consumer/adapter/RemoteUsersServiceConsumerIT.java
new file mode 100644 (file)
index 0000000..f3786af
--- /dev/null
@@ -0,0 +1,64 @@
+package de.juplo.demos.consumer.adapter;
+
+import au.com.dius.pact.consumer.MockServer;
+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.core.model.RequestResponsePact;
+import au.com.dius.pact.core.model.annotations.Pact;
+import de.juplo.demos.consumer.domain.User;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Optional;
+import java.util.UUID;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.fail;
+
+
+@ExtendWith(PactConsumerTestExt.class)
+@PactTestFor(providerName = "UsersProvider")
+public class RemoteUsersServiceConsumerIT
+{
+  @Pact(consumer="EmailServicesConsumer")
+  public RequestResponsePact getExistingUserByEmail(PactDslWithProvider builder) {
+    return builder
+        .given("User with email pact@juplo.de exists")
+          .uponReceiving("Request for user with email pact@juplo.de")
+            .path("/get")
+            .query("email=pact@juplo.de")
+            .method("GET")
+          .willRespondWith()
+            .status(200)
+            .headers(Map.of("Content-Type", "application/json;charset=UTF-8"))
+            .body("{\"id\": \"123e4567-e89b-12d3-a456-426614174000\", \"email\": \"pact@juplo.de\"}")
+        .toPact();
+  }
+
+  @Test
+  @PactTestFor(pactMethod = "getExistingUserByEmail")
+  public void testGetExistingUserByEmail(MockServer mockServer) {
+    RestTemplate restTemplate = new RestTemplateBuilder().rootUri(mockServer.getUrl()).build();
+    RemoteUsersServiceConsumer usersService = new RemoteUsersServiceConsumer("/get?email={email}", restTemplate);
+    try {
+      Optional<User> result = usersService.getUserByEmail("pact@juplo.de");
+
+      assertThat(result.isPresent()).isTrue();
+      User user = result.get();
+      assertThat(user.getId()).isEqualTo(UUID.fromString("123e4567-e89b-12d3-a456-426614174000"));
+      assertThat(user.getEmail()).isEqualTo("pact@juplo.de");
+    }
+    catch (Exception e) {
+      fail("Unexpected exception", e);
+    }
+  }
+}