Change to use checked exceptions in rAPP Catalogue
[nonrtric.git] / r-app-catalogue / src / test / java / org / oransc / rappcatalogue / api / ServicesApiDelegateImplTest.java
index 53dfc1a..dd10a65 100644 (file)
-package org.oransc.rappcatalogue.api;\r
-\r
-import static org.assertj.core.api.Assertions.assertThat;\r
-\r
-import java.util.Arrays;\r
-import java.util.List;\r
-\r
-import org.junit.jupiter.api.Test;\r
-import org.junit.jupiter.api.extension.ExtendWith;\r
-import org.springframework.http.HttpStatus;\r
-import org.springframework.http.ResponseEntity;\r
-import org.springframework.test.context.junit.jupiter.SpringExtension;\r
-\r
-@ExtendWith(SpringExtension.class)\r
-class ServicesApiDelegateImplTest {\r
-\r
-    @Test\r
-    void putValidService_shouldBeOk() {\r
-        ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl();\r
-\r
-        ResponseEntity<List<String>> response = delegateUnderTest.getServiceNamesUsingGET();\r
-    }\r
-\r
-    @Test\r
-    void getServices_shouldProvideArrayOfServices() throws Exception {\r
-        ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl();\r
-\r
-        ResponseEntity<List<String>> response = delegateUnderTest.getServiceNamesUsingGET();\r
-\r
-        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);\r
-        assertThat(response.getBody()).isEqualTo(Arrays.asList("a", "b"));\r
-    }\r
-}\r
+
+package org.oransc.rappcatalogue.api;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.springframework.http.HttpStatus.CREATED;
+import static org.springframework.http.HttpStatus.NO_CONTENT;
+import static org.springframework.http.HttpStatus.OK;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.sql.Date;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.oransc.rappcatalogue.exception.HeaderException;
+import org.oransc.rappcatalogue.exception.InvalidServiceException;
+import org.oransc.rappcatalogue.exception.ServiceNotFoundException;
+import org.oransc.rappcatalogue.model.InputService;
+import org.oransc.rappcatalogue.model.Service;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.context.request.NativeWebRequest;
+
+@ExtendWith(MockitoExtension.class)
+class ServicesApiDelegateImplTest {
+
+    @Mock
+    NativeWebRequest webRequestMock;
+
+    private static final String INVALID_SERVICE_MESSAGE = "Service is missing required property: version";
+    private static final String SERVICE_NAME = "Service Name";
+    private static final String SERVICE_DESCRIPTION = "description";
+    private static final String SERVICE_VERSION = "1.0";
+    private static final String SERVICE_DISPLAY_NAME = "Display Name";
+
+    @Test
+    void getAddedService_shouldReturnService() throws Exception {
+        ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
+
+        InputService service = new InputService();
+        service.setDescription(SERVICE_DESCRIPTION);
+        service.setVersion(SERVICE_VERSION);
+        service.setDisplayName(SERVICE_DISPLAY_NAME);
+
+        whenPrintResponseShouldWork();
+
+        delegateUnderTest.putIndividualService(SERVICE_NAME, service);
+
+        ResponseEntity<Service> response = delegateUnderTest.getIndividualService(SERVICE_NAME);
+
+        assertThat(response.getStatusCode()).isEqualTo(OK);
+        assertThat(response.getBody().getName()).isEqualTo(SERVICE_NAME);
+    }
+
+    @Test
+    void getMissingService_shouldThrowException() {
+        ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(null);
+
+        Exception exception = assertThrows(ServiceNotFoundException.class, () -> {
+            delegateUnderTest.getIndividualService(SERVICE_NAME);
+        });
+
+        String expectedMessage = "Service " + SERVICE_NAME + " not found";
+        String actualMessage = exception.getMessage();
+
+        assertThat(actualMessage).isEqualTo(expectedMessage);
+    }
+
+    @Test
+    void putNewValidService_shouldBeCreatedAndRegisteredAndUrlToNewServiceAddedToLocationHeaderInResponse()
+        throws Exception {
+        ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
+
+        InputService service = new InputService();
+        service.setDescription(SERVICE_DESCRIPTION);
+        service.setVersion(SERVICE_VERSION);
+        service.setDisplayName(SERVICE_DISPLAY_NAME);
+
+        String urlToCreatedService = "URL to created Service";
+        HttpServletResponse servletResponseMock = whenPrintResponseShouldWork(urlToCreatedService);
+
+        ResponseEntity<Void> putResponse = delegateUnderTest.putIndividualService(SERVICE_NAME, service);
+
+        assertThat(putResponse.getStatusCode()).isEqualTo(CREATED);
+        verify(servletResponseMock).addHeader("Location", urlToCreatedService);
+
+        ResponseEntity<Service> getResponse = delegateUnderTest.getIndividualService(SERVICE_NAME);
+
+        assertThat(getResponse.getStatusCode()).isEqualTo(OK);
+        Service body = getResponse.getBody();
+        assertThat(body.getName()).isEqualTo(SERVICE_NAME);
+        assertThat(body.getRegistrationDate()).isEqualTo(getTodaysDate());
+    }
+
+    @Test
+    void putModifiedService_shouldBeModified() throws Exception {
+        ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
+
+        InputService service = new InputService();
+        service.setDescription(SERVICE_DESCRIPTION);
+        service.setVersion(SERVICE_VERSION);
+        service.setDisplayName(SERVICE_DISPLAY_NAME);
+
+        whenPrintResponseShouldWork();
+
+        delegateUnderTest.putIndividualService(SERVICE_NAME, service);
+
+        String newDescription = "New description";
+        service.setDescription(newDescription);
+        ResponseEntity<Void> putResponse = delegateUnderTest.putIndividualService(SERVICE_NAME, service);
+
+        assertThat(putResponse.getStatusCode()).isEqualTo(OK);
+
+        ResponseEntity<Service> getResponse = delegateUnderTest.getIndividualService(SERVICE_NAME);
+
+        assertThat(getResponse.getStatusCode()).isEqualTo(OK);
+        assertThat(getResponse.getBody().getDescription()).isEqualTo(newDescription);
+    }
+
+    @Test
+    void putServiceWithVersionNull_shouldThrowException() {
+        ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(null);
+
+        InputService service = new InputService();
+        service.setDescription(SERVICE_DESCRIPTION);
+        service.setDisplayName(SERVICE_DISPLAY_NAME);
+
+        Exception exception = assertThrows(InvalidServiceException.class, () -> {
+            delegateUnderTest.putIndividualService(SERVICE_NAME, service);
+        });
+
+        assertThat(exception.getMessage()).isEqualTo(INVALID_SERVICE_MESSAGE);
+    }
+
+    @Test
+    void putServiceWithBlankVersion_shouldThrowException() {
+        ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(null);
+
+        InputService service = new InputService();
+        service.setVersion("");
+        service.setDescription(SERVICE_DESCRIPTION);
+        service.setDisplayName(SERVICE_DISPLAY_NAME);
+
+        Exception exception = assertThrows(InvalidServiceException.class, () -> {
+            delegateUnderTest.putIndividualService(SERVICE_NAME, service);
+        });
+
+        assertThat(exception.getMessage()).isEqualTo(INVALID_SERVICE_MESSAGE);
+    }
+
+    @Test
+    void putServiceWhenIoExceptionAddingHeader_shouldThrowExceptionAndNoServiceCreated() throws Exception {
+        ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
+
+        whenGetRequestUrlThenReturnUrl();
+        HttpServletResponse servletResponseMock = mock(HttpServletResponse.class);
+        when(webRequestMock.getNativeResponse(HttpServletResponse.class)).thenReturn(servletResponseMock);
+        when(servletResponseMock.getWriter()).thenThrow(new IOException("Error"));
+
+        InputService service = new InputService();
+        service.setVersion("1.0");
+        service.setDescription(SERVICE_DESCRIPTION);
+        service.setDisplayName(SERVICE_DISPLAY_NAME);
+
+        Exception exception = assertThrows(HeaderException.class, () -> {
+            delegateUnderTest.putIndividualService(SERVICE_NAME, service);
+        });
+
+        assertThat(exception.getMessage())
+            .isEqualTo("Unable to set header Location in put response for service " + SERVICE_NAME + ". Cause: Error");
+
+        ResponseEntity<List<Service>> response = delegateUnderTest.getServices();
+        assertThat(response.getBody()).isEmpty();
+    }
+
+    @Test
+    void getServices_shouldProvideArrayOfAddedServiceNames() throws Exception {
+        ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
+
+        InputService service1 = new InputService();
+        service1.setDescription("description 1");
+        service1.setVersion(SERVICE_VERSION);
+        service1.setDisplayName("Display Name 1");
+
+        InputService service2 = new InputService();
+        service2.setDescription("description 2");
+        service2.setVersion(SERVICE_VERSION);
+        service2.setDisplayName("Display Name 2");
+
+        whenPrintResponseShouldWork();
+
+        String serviceName1 = "Service Name 1";
+        delegateUnderTest.putIndividualService(serviceName1, service1);
+        String serviceName2 = "Service Name 2";
+        delegateUnderTest.putIndividualService(serviceName2, service2);
+
+        ResponseEntity<List<Service>> response = delegateUnderTest.getServices();
+
+        assertThat(response.getStatusCode()).isEqualTo(OK);
+        List<Service> services = response.getBody();
+        assertThat(services).hasSize(2);
+        List<String> expectedServiceNames = Arrays.asList(serviceName1, serviceName2);
+        assertThat(expectedServiceNames).contains(services.get(0).getName()) //
+            .contains(services.get(1).getName());
+    }
+
+    @Test
+    void deleteService_shouldBeOk() throws Exception {
+        ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
+
+        InputService service = new InputService();
+        service.setDescription(SERVICE_DESCRIPTION);
+        service.setVersion(SERVICE_VERSION);
+        service.setDisplayName(SERVICE_DISPLAY_NAME);
+
+        whenPrintResponseShouldWork();
+
+        delegateUnderTest.putIndividualService(SERVICE_NAME, service);
+
+        ResponseEntity<List<Service>> servicesResponse = delegateUnderTest.getServices();
+
+        assertThat(servicesResponse.getBody()).hasSize(1);
+
+        ResponseEntity<Void> deleteResponse = delegateUnderTest.deleteIndividualService(SERVICE_NAME);
+
+        assertThat(deleteResponse.getStatusCode()).isEqualTo(NO_CONTENT);
+
+        servicesResponse = delegateUnderTest.getServices();
+
+        assertThat(servicesResponse.getBody()).isEmpty();
+    }
+
+    private void whenGetRequestUrlThenReturnUrl() {
+        whenGetRequestUrlThenReturnUrl("URL");
+    }
+
+    private void whenGetRequestUrlThenReturnUrl(String url) {
+        HttpServletRequest servletRequestMock = mock(HttpServletRequest.class);
+        when(webRequestMock.getNativeRequest(HttpServletRequest.class)).thenReturn(servletRequestMock);
+        when(servletRequestMock.getRequestURL()).thenReturn(new StringBuffer(url));
+    }
+
+    private HttpServletResponse whenPrintResponseShouldWork() {
+        return whenPrintResponseShouldWork("URL");
+    }
+
+    private HttpServletResponse whenPrintResponseShouldWork(String url) {
+        whenGetRequestUrlThenReturnUrl(url);
+        HttpServletResponse servletResponseMock = mock(HttpServletResponse.class);
+        when(webRequestMock.getNativeResponse(HttpServletResponse.class)).thenReturn(servletResponseMock);
+        PrintWriter printWriterMock = mock(PrintWriter.class);
+        try {
+            when(servletResponseMock.getWriter()).thenReturn(printWriterMock);
+        } catch (IOException e) {
+            // Nothing
+        }
+        return servletResponseMock;
+    }
+
+    private String getTodaysDate() {
+        long millis = System.currentTimeMillis();
+        Date date = new Date(millis);
+        return date.toString();
+    }
+}