Improve tests for exception handling 49/138049/1
authorFiete Ostkamp <Fiete.Ostkamp@telekom.de>
Thu, 23 May 2024 13:22:07 +0000 (15:22 +0200)
committerFiete Ostkamp <Fiete.Ostkamp@telekom.de>
Thu, 23 May 2024 13:22:07 +0000 (15:22 +0200)
- add more assertions to ExceptionHandlerTest
- add class definitions for error responses to allow the usage of object mappers for that

Issue-ID: AAI-3691
Change-Id: I0a3f26c7f3a14bf536cc4f023b567aeb4191e963
Signed-off-by: Fiete Ostkamp <Fiete.Ostkamp@telekom.de>
aai-resources/pom.xml
aai-resources/src/main/java/org/onap/aai/entities/AAIErrorResponse.java [new file with mode: 0644]
aai-resources/src/main/java/org/onap/aai/entities/RequestError.java [new file with mode: 0644]
aai-resources/src/main/java/org/onap/aai/entities/ServiceException.java [new file with mode: 0644]
aai-resources/src/test/java/org/onap/aai/rest/ExceptionHandlerTest.java

index f39349a..5049e04 100644 (file)
             <version>${keycloak.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+                       <groupId>org.projectlombok</groupId>
+                       <artifactId>lombok</artifactId>
+                       <version>1.18.30</version>
+                       <scope>provided</scope>
+               </dependency>
+        <dependency>
+                       <groupId>com.fasterxml.jackson.dataformat</groupId>
+                       <artifactId>jackson-dataformat-xml</artifactId>
+            <scope>test</scope>
+               </dependency>
     </dependencies>
     <dependencyManagement>
         <dependencies>
diff --git a/aai-resources/src/main/java/org/onap/aai/entities/AAIErrorResponse.java b/aai-resources/src/main/java/org/onap/aai/entities/AAIErrorResponse.java
new file mode 100644 (file)
index 0000000..eeaecd4
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2024 Deutsche Telekom. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aai.entities;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.extern.jackson.Jacksonized;
+
+@Data
+@Builder
+@Jacksonized
+public class AAIErrorResponse {
+    private final RequestError requestError;
+}
diff --git a/aai-resources/src/main/java/org/onap/aai/entities/RequestError.java b/aai-resources/src/main/java/org/onap/aai/entities/RequestError.java
new file mode 100644 (file)
index 0000000..3fb051b
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2024 Deutsche Telekom. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aai.entities;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.extern.jackson.Jacksonized;
+
+@Data
+@Builder
+@Jacksonized
+public class RequestError {
+    private ServiceException serviceException;
+}
diff --git a/aai-resources/src/main/java/org/onap/aai/entities/ServiceException.java b/aai-resources/src/main/java/org/onap/aai/entities/ServiceException.java
new file mode 100644 (file)
index 0000000..38075c0
--- /dev/null
@@ -0,0 +1,36 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2024 Deutsche Telekom. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aai.entities;
+
+import java.util.List;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.extern.jackson.Jacksonized;
+
+@Data
+@Builder
+@Jacksonized
+public class ServiceException {
+    private String messageId;
+    private String text;
+    private List<String> variables;
+}
index 4b4c87b..0780649 100644 (file)
@@ -3,6 +3,7 @@
  * org.onap.aai
  * ================================================================================
  * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2024 Deutsche Telekom SA.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -30,6 +31,9 @@ import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonLocation;
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
 import com.sun.istack.SAXParseException2;
 
 import java.util.ArrayList;
@@ -49,11 +53,14 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.onap.aai.AAISetup;
+import org.onap.aai.entities.AAIErrorResponse;
 
 public class ExceptionHandlerTest extends AAISetup {
 
     protected static final MediaType APPLICATION_JSON = MediaType.valueOf("application/json");
 
+    private static final ObjectMapper objectMapper = new ObjectMapper();
+
     @Mock
     private HttpHeaders httpHeaders;
 
@@ -79,57 +86,105 @@ public class ExceptionHandlerTest extends AAISetup {
         outputMediaTypes.add(APPLICATION_JSON);
         when(httpHeaders.getAcceptableMediaTypes()).thenReturn(outputMediaTypes);
         when(httpHeaders.getRequestHeaders()).thenReturn(headersMultiMap);
+        when(request.getMethod()).thenReturn("PUT");
     }
 
     @Test
     public void testConversionOfWebApplicationResponse() throws Exception {
-
         Exception exception = new WebApplicationException();
         Response response = handler.toResponse(exception);
-
         assertNotNull(response);
         assertNull(response.getEntity());
         assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatus());
     }
-
     @Test
-    public void testConversionOfWebApplicationResponseWhenUmarshalExceptionResultBadRequest() throws Exception {
-
+    public void testConversionOfWebApplicationResponseWhenUmarshalExceptionResultBadRequest()
+        throws Exception {
         SAXParseException2 mockSaxParseException = mock(SAXParseException2.class);
         Exception exception = new WebApplicationException(mockSaxParseException);
         Response response = handler.toResponse(exception);
-
+        AAIErrorResponse responseEntity = objectMapper.readValue(response.getEntity().toString(), AAIErrorResponse.class);
         assertNotNull(response);
         assertNotNull(response.getEntity());
         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus());
+        assertEquals("SVC3102",responseEntity.getRequestError().getServiceException().getMessageId());
+        assertEquals("Error parsing input performing %1 on %2 (msg=%3) (ec=%4)",responseEntity.getRequestError().getServiceException().getText());
+        assertEquals("UnmarshalException",responseEntity.getRequestError().getServiceException().getVariables().get(0));
+        assertEquals("null",responseEntity.getRequestError().getServiceException().getVariables().get(1));
+        assertEquals("Input parsing error:javax.ws.rs.WebApplicationException: HTTP 500 Internal Server Error",responseEntity.getRequestError().getServiceException().getVariables().get(2));
+        assertEquals("ERR.5.4.4007",responseEntity.getRequestError().getServiceException().getVariables().get(3));
     }
 
     @Test
     public void testConversionWhenJsonParseExceptionResultBadRequest() throws Exception {
-
-        JsonParser parser = new JsonFactory().createParser("");
-        Exception exception = new JsonParseException(parser, "");
+        JsonParser jsonParser = mock(JsonParser.class);
+        Exception exception = new JsonParseException(jsonParser, "");
         Response response = handler.toResponse(exception);
-
+        AAIErrorResponse responseEntity = objectMapper.readValue(response.getEntity().toString(), AAIErrorResponse.class);
         assertNotNull(response);
         assertNotNull(response.getEntity());
         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus());
+        assertEquals("SVC3102",responseEntity.getRequestError().getServiceException().getMessageId());
+        assertEquals("Error parsing input performing %1 on %2 (msg=%3) (ec=%4)",responseEntity.getRequestError().getServiceException().getText());
+        assertEquals("JsonParseException",responseEntity.getRequestError().getServiceException().getVariables().get(0));
+        assertEquals("null",responseEntity.getRequestError().getServiceException().getVariables().get(1));
+        assertEquals("Input parsing error:com.fasterxml.jackson.core.JsonParseException: ",responseEntity.getRequestError().getServiceException().getVariables().get(2));
+        assertEquals("ERR.5.4.4007",responseEntity.getRequestError().getServiceException().getVariables().get(3));
     }
 
     @Test
     public void testConversionWhenJsonMappingExceptionResultBadRequest() throws Exception {
-
-        JsonLocation jsonLocation = mock(JsonLocation.class);
-        // Exception exception = new JsonMappingException("", jsonLocation);
-        JsonParser parser = new JsonFactory().createParser("");
-        Exception exception = new JsonParseException(parser, "");
+        JsonParser jsonParser = mock(JsonParser.class);
+        Exception exception = JsonMappingException.from(jsonParser,"");
         Response response = handler.toResponse(exception);
-
+        AAIErrorResponse responseEntity = objectMapper.readValue(response.getEntity().toString(), AAIErrorResponse.class);
         assertNotNull(response);
         assertNotNull(response.getEntity());
         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus());
+        assertEquals("SVC3102",responseEntity.getRequestError().getServiceException().getMessageId());
+        assertEquals("Error parsing input performing %1 on %2 (msg=%3) (ec=%4)",responseEntity.getRequestError().getServiceException().getText());
+        assertEquals("JsonMappingException",responseEntity.getRequestError().getServiceException().getVariables().get(0));
+        assertEquals("null",responseEntity.getRequestError().getServiceException().getVariables().get(1));
+        assertEquals("Input parsing error:com.fasterxml.jackson.databind.JsonMappingException: ",responseEntity.getRequestError().getServiceException().getVariables().get(2));
+        assertEquals("ERR.5.4.4007",responseEntity.getRequestError().getServiceException().getVariables().get(3));
     }
 
+    @Test
+    public void testJsonDefaultErrorResponse()
+        throws Exception {
+        Exception exception = new Exception();
+        Response response = handler.toResponse(exception);
+        AAIErrorResponse responseEntity = objectMapper.readValue(response.getEntity().toString(), AAIErrorResponse.class);
+        assertNotNull(response);
+        assertNotNull(response.getEntity());
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus());
+        assertEquals("SVC3002",responseEntity.getRequestError().getServiceException().getMessageId());
+        assertEquals("Error writing output performing %1 on %2 (msg=%3) (ec=%4)",responseEntity.getRequestError().getServiceException().getText());
+        assertEquals("PUT",responseEntity.getRequestError().getServiceException().getVariables().get(0));
+        assertEquals("unknown",responseEntity.getRequestError().getServiceException().getVariables().get(1));
+        assertEquals("Internal Error:java.lang.Exception",responseEntity.getRequestError().getServiceException().getVariables().get(2));
+        assertEquals("ERR.5.4.4000",responseEntity.getRequestError().getServiceException().getVariables().get(3));
+    }
+    @Test
+    public void testXmlDefaultErrorResponse()
+        throws Exception {
+        List<MediaType> outputMediaTypes = new ArrayList<>();
+        outputMediaTypes.add(MediaType.APPLICATION_XML_TYPE);
+        when(httpHeaders.getAcceptableMediaTypes()).thenReturn(outputMediaTypes);
+        Exception exception = new Exception();
+        Response response = handler.toResponse(exception);
+        XmlMapper xmlMapper = new XmlMapper();
+        AAIErrorResponse responseEntity = xmlMapper.readValue(response.getEntity().toString(), AAIErrorResponse.class);
+        assertNotNull(response);
+        assertNotNull(response.getEntity());
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus());
+        assertEquals("SVC3002",responseEntity.getRequestError().getServiceException().getMessageId());
+        assertEquals("Error writing output performing %1 on %2 (msg=%3) (ec=%4)",responseEntity.getRequestError().getServiceException().getText());
+        assertEquals("PUT",responseEntity.getRequestError().getServiceException().getVariables().get(0));
+        assertEquals("unknown",responseEntity.getRequestError().getServiceException().getVariables().get(1));
+        assertEquals("Internal Error:java.lang.Exception",responseEntity.getRequestError().getServiceException().getVariables().get(2));
+        assertEquals("ERR.5.4.4000",responseEntity.getRequestError().getServiceException().getVariables().get(3));
+    }
     @Test
     public void testConversionWhenUnknownExceptionResultBadRequest() throws Exception {