]> juplo.de Git - demos/kafka/chat/commitdiff
test: Implemented a test for the pact with the frontend
authorKai Moritz <kai@juplo.de>
Sat, 11 Oct 2025 13:58:42 +0000 (15:58 +0200)
committerKai Moritz <kai@juplo.de>
Sat, 11 Oct 2025 21:05:47 +0000 (23:05 +0200)
.gitmodules [new file with mode: 0644]
pom.xml
src/test/java/de/juplo/kafka/chat/backend/api/PactProviderTest.java [new file with mode: 0644]
src/test/resources/pacts [new submodule]

diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..3a79d78
--- /dev/null
@@ -0,0 +1,4 @@
+[submodule "src/test/resources/pacts"]
+       path = src/test/resources/pacts
+       url = ./
+       branch = pacts
diff --git a/pom.xml b/pom.xml
index 50310cf3a423896749d4451fd648f7679370edd2..4bcc56388dbeeb44a666a56d76f3cedea9849d99 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -17,6 +17,7 @@
     <java.version>17</java.version>
     <assertj-reactor.version>1.0.8</assertj-reactor.version>
     <inject-resources-junit-jupiter.version>0.3.3</inject-resources-junit-jupiter.version>
+    <pact.version>4.6.17</pact.version>
   </properties>
   <dependencies>
     <dependency>
       <version>${inject-resources-junit-jupiter.version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>au.com.dius.pact.provider</groupId>
+      <artifactId>junit5</artifactId>
+      <version>${pact.version}</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/src/test/java/de/juplo/kafka/chat/backend/api/PactProviderTest.java b/src/test/java/de/juplo/kafka/chat/backend/api/PactProviderTest.java
new file mode 100644 (file)
index 0000000..5c15205
--- /dev/null
@@ -0,0 +1,77 @@
+package de.juplo.kafka.chat.backend.api;
+
+import au.com.dius.pact.provider.junit5.HttpTestTarget;
+import au.com.dius.pact.provider.junit5.PactVerificationContext;
+import au.com.dius.pact.provider.junit5.PactVerificationInvocationContextProvider;
+import au.com.dius.pact.provider.junitsupport.Provider;
+import au.com.dius.pact.provider.junitsupport.State;
+import au.com.dius.pact.provider.junitsupport.loader.PactFolder;
+import de.juplo.kafka.chat.backend.domain.ChatHomeService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.TestTemplate;
+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.test.web.server.LocalServerPort;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import java.util.UUID;
+
+
+@Provider("ChatBackendController")
+@PactFolder("src/test/resources/pacts")
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(
+    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
+    properties = {
+        "chat.backend.inmemory.storage-strategy=none",
+        "chat.backend.inmemory.sharding-strategy=kafkalike",
+        "chat.backend.inmemory.num-shards=10",
+        "chat.backend.inmemory.owned-shards=2" })
+@Slf4j
+public class PactProviderTest
+{
+
+  @Autowired
+  ChatHomeService chatHomeService;
+
+  @LocalServerPort
+  int port;
+
+  @BeforeEach
+  void setUp(PactVerificationContext context) {
+    context.setTarget(new HttpTestTarget("localhost", port));
+  }
+
+  @TestTemplate
+  @ExtendWith(PactVerificationInvocationContextProvider.class)
+  void verifyPact(PactVerificationContext context) {
+    context.verifyInteraction();
+  }
+
+  @State("there are 10 shards")
+  void stateThereAre10Shards() {}
+
+  @State("the server is responsible for shard 2")
+  void stateTheServerOwnsShard2() {}
+
+  @State("chatroom 5c73531c-6fc4-426c-adcb-afc5c140a0f7 exists in shard 2")
+  void stateChatroomExistsInOwnedShard() {
+    chatHomeService.createChatRoom(UUID.fromString("5c73531c-6fc4-426c-adcb-afc5c140a0f7"), "FOO");
+  }
+
+  @State("chatroom 7f59ec77-832e-4a17-8d22-55ef46242c17 does not exists in shard 2")
+  void stateChatroomDosNotExistsInOwnedShard() {}
+
+  @State("there are no chatrooms available at all in shard 2")
+  void stateNoChatroomsAvailableInOwnedShard() {
+    chatHomeService
+        .getChatRoomInfo()
+        .subscribe(chatRoomInfo ->
+        {
+          log.debug("Removing chatroom {}", chatRoomInfo);
+          chatHomeService.removeChatRoom(chatRoomInfo.getId());
+        });
+  }
+}
diff --git a/src/test/resources/pacts b/src/test/resources/pacts
new file mode 160000 (submodule)
index 0000000..b2bf161
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit b2bf161fa71acd4128b040ebb81af65fc1509cac