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