Re-staged the contract for `delete order`
[demos/example-siren] / spring-consumer / src / test / java / de / juplo / demos / pact / ContractTest.java
index 8db0dbc..b863b23 100644 (file)
@@ -1,10 +1,7 @@
 package de.juplo.demos.pact;
 
 import au.com.dius.pact.consumer.MockServer;
-import au.com.dius.pact.consumer.dsl.LambdaDsl;
-import au.com.dius.pact.consumer.dsl.PactDslJsonBody;
-import au.com.dius.pact.consumer.dsl.PactDslJsonRootValue;
-import au.com.dius.pact.consumer.dsl.PactDslWithProvider;
+import au.com.dius.pact.consumer.dsl.*;
 import au.com.dius.pact.consumer.junit5.PactConsumerTestExt;
 import au.com.dius.pact.consumer.junit5.PactTestFor;
 import au.com.dius.pact.core.model.RequestResponsePact;
@@ -20,11 +17,60 @@ import static org.assertj.core.api.Assertions.fail;
 
 
 @ExtendWith(PactConsumerTestExt.class)
-@PactTestFor(providerName = "Siren Order Provider")
+@PactTestFor(providerName = "SirenOrderProvider")
 public class ContractTest
 {
   @Pact(consumer="SpringConsumer")
-  public RequestResponsePact getOrders(PactDslWithProvider builder)
+  public RequestResponsePact getRoot(PactDslWithProvider builder)
+  {
+    return builder
+        .uponReceiving("get root")
+        .path("/")
+        .method("GET")
+        .willRespondWith()
+        .status(200)
+        .headers(Map.of("Content-Type", "application/vnd.siren+json"))
+        .body(LambdaDsl.newJsonBody(body ->
+        {
+          body.array("class", classArray ->
+          {
+            classArray.stringValue("representation");
+          });
+          body.array("links", linksArray ->
+          {
+            linksArray.object(object->
+            {
+              object.matchUrl2("href", "orders");
+              object.array("rel", relArray ->
+              {
+                relArray.stringValue("orders");
+              });
+            });
+          });
+        }).build())
+        .toPact();
+  }
+
+  @Test
+  @PactTestFor(pactMethod = "getRoot")
+  public void testGetRoot(MockServer mockServer)
+  {
+    RestTemplate restTemplate =
+        new RestTemplateBuilder()
+            .rootUri(mockServer.getUrl())
+            .build();
+    try
+    {
+      restTemplate.getForEntity("/", String.class);
+    }
+    catch (Exception e)
+    {
+      fail("Unexpected exception", e);
+    }
+  }
+
+  @Pact(consumer="SpringConsumer")
+  public RequestResponsePact getAllOrders(PactDslWithProvider builder)
   {
     return builder
           .uponReceiving("get all orders")
@@ -35,18 +81,68 @@ public class ContractTest
             .headers(Map.of("Content-Type", "application/vnd.siren+json"))
             .body(LambdaDsl.newJsonBody(body ->
             {
-              body.stringType("name");
-              body.booleanType("happy");
-              // body.hexValue("hexCode");
-              body.id();
-              body.ipV4Address("localAddress");
-              body.numberValue("age", 100);
+              body.array("class", classArray ->
+              {
+                classArray.stringValue("entity");
+              });
+              body.eachLike("entities", entities ->
+              {
+                entities.arrayContaining("actions", actionsArray->
+                {
+                  actionsArray.object(object ->
+                  {
+                    object.stringType("name","update");
+                    object.stringType("method", "PUT");
+                    object.matchUrl2("href", "orders", Matchers.regexp("\\d+", "1234").getValue());
+                  });
+                  actionsArray.object(object ->
+                  {
+                    object.stringType("name","delete");
+                    object.stringType("method", "DELETE");
+                    object.matchUrl2("href", "orders", Matchers.regexp("\\d+", "1234").getValue());
+                  });
+                });
+                entities.array("class", classArray ->
+                {
+                  classArray.stringValue("entity");
+                });
+                entities.array("links", linksArray ->
+                {
+                  linksArray.object(object->
+                  {
+                    object.matchUrl2("href", "orders", Matchers.regexp("\\d+", "1234").getMatcher());
+                    object.array("rel", relArray ->
+                    {
+                      relArray.stringValue("self");
+                    });
+                  });
+                });
+                entities.object("properties", object->
+                {
+                  object.integerType("id", 1234);
+                });
+                entities.array("rel", relArray ->
+                {
+                  relArray.stringValue("item");
+                });
+              });
+              body.array("links", linksArray ->
+              {
+                linksArray.object(object->
+                {
+                  object.matchUrl2("href", "orders");
+                  object.array("rel", relArray ->
+                  {
+                    relArray.stringValue("self");
+                  });
+                });
+              });
             }).build())
         .toPact();
   }
 
   @Test
-  @PactTestFor(pactMethod = "getOrders")
+  @PactTestFor(pactMethod = "getAllOrders")
   public void testGetExistingUserByEmail(MockServer mockServer)
   {
     RestTemplate restTemplate =
@@ -62,4 +158,34 @@ public class ContractTest
       fail("Unexpected exception", e);
     }
   }
+
+  @Pact(consumer="SpringConsumer")
+  public RequestResponsePact deleteOrder(PactDslWithProvider builder)
+  {
+    return builder
+        .uponReceiving("delete order")
+        .matchPath("/orders/\\d+", "/orders/1234")
+        .method("DELETE")
+        .willRespondWith()
+        .status(200)
+        .toPact();
+  }
+
+  @Test
+  @PactTestFor(pactMethod = "deleteOrder")
+  public void testDeleteOrder(MockServer mockServer)
+  {
+    RestTemplate restTemplate =
+        new RestTemplateBuilder()
+            .rootUri(mockServer.getUrl())
+            .build();
+    try
+    {
+      restTemplate.delete("/orders/1234");
+    }
+    catch (Exception e)
+    {
+      fail("Unexpected exception", e);
+    }
+  }
 }