From dccbe54933f14780f6aa6225244e79e2a81408f6 Mon Sep 17 00:00:00 2001
From: Francois <ledroff@adobe.com>
Date: Thu, 18 Jan 2024 13:46:49 +0100
Subject: [PATCH] GH-207 `aio-lib-java-events-mgmt`:   adding missing
 `x-conflicting-id` header safe guard within `ConflictException` (#208)

---
 events_mgmt/pom.xml                           | 28 ++++++---
 .../management/feign/ConflictException.java   |  7 ++-
 .../feign/ConflictExceptionTest.java          | 60 +++++++++++++++++++
 3 files changed, 83 insertions(+), 12 deletions(-)
 create mode 100644 events_mgmt/src/test/java/com/adobe/aio/event/management/feign/ConflictExceptionTest.java

diff --git a/events_mgmt/pom.xml b/events_mgmt/pom.xml
index ac095f01..48dba3f3 100644
--- a/events_mgmt/pom.xml
+++ b/events_mgmt/pom.xml
@@ -33,25 +33,35 @@
       <artifactId>aio-lib-java-core</artifactId>
       <version>${project.version}</version>
     </dependency>
-
-    <!--  test -->
     <dependency>
-       <groupId>org.junit.jupiter</groupId>
-       <artifactId>junit-jupiter</artifactId>
+      <groupId>com.adobe.aio</groupId>
+      <artifactId>aio-lib-java-ims</artifactId>
+      <version>${project.version}</version>
     </dependency>
+
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-simple</artifactId>
     </dependency>
-    <dependency>
-      <groupId>com.adobe.aio</groupId>
-      <artifactId>aio-lib-java-ims</artifactId>
-      <version>${project.version}</version>
-    </dependency>
     <dependency>
       <groupId>io.openapitools.jackson.dataformat</groupId>
       <artifactId>jackson-dataformat-hal</artifactId>
     </dependency>
+
+    <!--  test -->
+    <dependency>
+       <groupId>org.junit.jupiter</groupId>
+       <artifactId>junit-jupiter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-junit-jupiter</artifactId>
+    </dependency>
+
   </dependencies>
 
 </project>
diff --git a/events_mgmt/src/main/java/com/adobe/aio/event/management/feign/ConflictException.java b/events_mgmt/src/main/java/com/adobe/aio/event/management/feign/ConflictException.java
index 4c18a23c..9d643c8a 100644
--- a/events_mgmt/src/main/java/com/adobe/aio/event/management/feign/ConflictException.java
+++ b/events_mgmt/src/main/java/com/adobe/aio/event/management/feign/ConflictException.java
@@ -13,16 +13,17 @@
 
 import feign.FeignException;
 import feign.Response;
-import java.util.Optional;
+import java.util.Collection;
 
 public class ConflictException extends FeignException {
 
+  public static final String X_CONFLICTING_ID = "x-conflicting-id";
   private final String conflictingId;
 
   public ConflictException(Response response, FeignException exception) {
     super(response.status(), exception.getMessage(), response.request(), exception);
-    Optional<String> conflictingIdOptional = response.headers().get("x-conflicting-id").stream().findFirst();
-    conflictingId  = conflictingIdOptional.isPresent() ? conflictingIdOptional.get() : null;
+    Collection<String> conflictingIdHeader = response.headers().get(X_CONFLICTING_ID);
+    conflictingId  = conflictingIdHeader!=null ? conflictingIdHeader.stream().findFirst().orElse(null) : null;
   }
 
   public String getConflictingId() {
diff --git a/events_mgmt/src/test/java/com/adobe/aio/event/management/feign/ConflictExceptionTest.java b/events_mgmt/src/test/java/com/adobe/aio/event/management/feign/ConflictExceptionTest.java
new file mode 100644
index 00000000..1d246256
--- /dev/null
+++ b/events_mgmt/src/test/java/com/adobe/aio/event/management/feign/ConflictExceptionTest.java
@@ -0,0 +1,60 @@
+package com.adobe.aio.event.management.feign;
+
+import static com.adobe.aio.event.management.feign.ConflictException.X_CONFLICTING_ID;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.when;
+
+import feign.FeignException;
+import feign.Request;
+import feign.Response;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+public class ConflictExceptionTest {
+
+  @Mock
+  private Response response ;
+
+  @Mock
+  private Request request;
+
+  @Mock
+  private FeignException feignException;
+
+  @BeforeEach
+  void beforeeach() {
+    when(response.request()).thenReturn(request);
+  }
+
+  @Test
+  void withNoConflictIdHeader() {
+    when(response.headers()).thenReturn(Collections.emptyMap());
+    assertEquals(null, new ConflictException(response, feignException).getConflictingId());
+  }
+
+  @Test
+  void withEmptyConflictIdHeader() {
+    Map<String, Collection<String>> headers = new HashMap<>();
+    headers.put(X_CONFLICTING_ID, Collections.emptyList());
+    when(response.headers()).thenReturn(headers);
+    assertEquals(null, new ConflictException(response, feignException).getConflictingId());
+  }
+
+  @Test
+  void withConflictIdHeader() {
+    String conflictingId = "someId";
+    Map<String, Collection<String>> headers = new HashMap<>();
+    headers.put(X_CONFLICTING_ID, Collections.singletonList(conflictingId));
+    when(response.headers()).thenReturn(headers);
+    assertEquals(conflictingId, new ConflictException(response, feignException).getConflictingId());
+  }
+
+}