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