Merge "Add docker-compose file for odu-app"
[nonrtric.git] / r-app-catalogue / src / test / java / org / oransc / rappcatalogue / api / ServicesApiDelegateImplTest.java
1
2 package org.oransc.rappcatalogue.api;
3
4 import static org.assertj.core.api.Assertions.assertThat;
5 import static org.junit.jupiter.api.Assertions.assertThrows;
6 import static org.mockito.Mockito.mock;
7 import static org.mockito.Mockito.verify;
8 import static org.mockito.Mockito.when;
9 import static org.springframework.http.HttpStatus.CREATED;
10 import static org.springframework.http.HttpStatus.NO_CONTENT;
11 import static org.springframework.http.HttpStatus.OK;
12
13 import java.io.IOException;
14 import java.io.PrintWriter;
15 import java.sql.Date;
16 import java.util.Arrays;
17 import java.util.List;
18
19 import javax.servlet.http.HttpServletRequest;
20 import javax.servlet.http.HttpServletResponse;
21
22 import org.junit.jupiter.api.Test;
23 import org.junit.jupiter.api.extension.ExtendWith;
24 import org.mockito.Mock;
25 import org.mockito.junit.jupiter.MockitoExtension;
26 import org.oransc.rappcatalogue.exception.HeaderException;
27 import org.oransc.rappcatalogue.exception.InvalidServiceException;
28 import org.oransc.rappcatalogue.exception.ServiceNotFoundException;
29 import org.oransc.rappcatalogue.model.InputService;
30 import org.oransc.rappcatalogue.model.Service;
31 import org.springframework.http.ResponseEntity;
32 import org.springframework.web.context.request.NativeWebRequest;
33
34 @ExtendWith(MockitoExtension.class)
35 class ServicesApiDelegateImplTest {
36
37     @Mock
38     NativeWebRequest webRequestMock;
39
40     private static final String INVALID_SERVICE_MESSAGE = "Service is missing required property: version";
41     private static final String SERVICE_NAME = "Service Name";
42     private static final String SERVICE_DESCRIPTION = "description";
43     private static final String SERVICE_VERSION = "1.0";
44     private static final String SERVICE_DISPLAY_NAME = "Display Name";
45
46     @Test
47     void getAddedService_shouldReturnService() throws Exception {
48         ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
49
50         InputService service = new InputService();
51         service.setDescription(SERVICE_DESCRIPTION);
52         service.setVersion(SERVICE_VERSION);
53         service.setDisplayName(SERVICE_DISPLAY_NAME);
54
55         whenPrintResponseShouldWork();
56
57         delegateUnderTest.putIndividualService(SERVICE_NAME, service);
58
59         ResponseEntity<Service> response = delegateUnderTest.getIndividualService(SERVICE_NAME);
60
61         assertThat(response.getStatusCode()).isEqualTo(OK);
62         assertThat(response.getBody().getName()).isEqualTo(SERVICE_NAME);
63     }
64
65     @Test
66     void getMissingService_shouldThrowException() {
67         ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(null);
68
69         Exception exception = assertThrows(ServiceNotFoundException.class, () -> {
70             delegateUnderTest.getIndividualService(SERVICE_NAME);
71         });
72
73         String expectedMessage = "Service " + SERVICE_NAME + " not found";
74         String actualMessage = exception.getMessage();
75
76         assertThat(actualMessage).isEqualTo(expectedMessage);
77     }
78
79     @Test
80     void putNewValidService_shouldBeCreatedAndRegisteredAndUrlToNewServiceAddedToLocationHeaderInResponse()
81         throws Exception {
82         ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
83
84         InputService service = new InputService();
85         service.setDescription(SERVICE_DESCRIPTION);
86         service.setVersion(SERVICE_VERSION);
87         service.setDisplayName(SERVICE_DISPLAY_NAME);
88
89         String urlToCreatedService = "URL to created Service";
90         HttpServletResponse servletResponseMock = whenPrintResponseShouldWork(urlToCreatedService);
91
92         ResponseEntity<Void> putResponse = delegateUnderTest.putIndividualService(SERVICE_NAME, service);
93
94         assertThat(putResponse.getStatusCode()).isEqualTo(CREATED);
95         verify(servletResponseMock).addHeader("Location", urlToCreatedService);
96
97         ResponseEntity<Service> getResponse = delegateUnderTest.getIndividualService(SERVICE_NAME);
98
99         assertThat(getResponse.getStatusCode()).isEqualTo(OK);
100         Service body = getResponse.getBody();
101         assertThat(body.getName()).isEqualTo(SERVICE_NAME);
102         assertThat(body.getRegistrationDate()).isEqualTo(getTodaysDate());
103     }
104
105     @Test
106     void putModifiedService_shouldBeModified() throws Exception {
107         ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
108
109         InputService service = new InputService();
110         service.setDescription(SERVICE_DESCRIPTION);
111         service.setVersion(SERVICE_VERSION);
112         service.setDisplayName(SERVICE_DISPLAY_NAME);
113
114         whenPrintResponseShouldWork();
115
116         delegateUnderTest.putIndividualService(SERVICE_NAME, service);
117
118         String newDescription = "New description";
119         service.setDescription(newDescription);
120         ResponseEntity<Void> putResponse = delegateUnderTest.putIndividualService(SERVICE_NAME, service);
121
122         assertThat(putResponse.getStatusCode()).isEqualTo(OK);
123
124         ResponseEntity<Service> getResponse = delegateUnderTest.getIndividualService(SERVICE_NAME);
125
126         assertThat(getResponse.getStatusCode()).isEqualTo(OK);
127         assertThat(getResponse.getBody().getDescription()).isEqualTo(newDescription);
128     }
129
130     @Test
131     void putServiceWithVersionNull_shouldThrowException() {
132         ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(null);
133
134         InputService service = new InputService();
135         service.setDescription(SERVICE_DESCRIPTION);
136         service.setDisplayName(SERVICE_DISPLAY_NAME);
137
138         Exception exception = assertThrows(InvalidServiceException.class, () -> {
139             delegateUnderTest.putIndividualService(SERVICE_NAME, service);
140         });
141
142         assertThat(exception.getMessage()).isEqualTo(INVALID_SERVICE_MESSAGE);
143     }
144
145     @Test
146     void putServiceWithBlankVersion_shouldThrowException() {
147         ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(null);
148
149         InputService service = new InputService();
150         service.setVersion("");
151         service.setDescription(SERVICE_DESCRIPTION);
152         service.setDisplayName(SERVICE_DISPLAY_NAME);
153
154         Exception exception = assertThrows(InvalidServiceException.class, () -> {
155             delegateUnderTest.putIndividualService(SERVICE_NAME, service);
156         });
157
158         assertThat(exception.getMessage()).isEqualTo(INVALID_SERVICE_MESSAGE);
159     }
160
161     @Test
162     void putServiceWhenIoExceptionAddingHeader_shouldThrowExceptionAndNoServiceCreated() throws Exception {
163         ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
164
165         whenGetRequestUrlThenReturnUrl();
166         HttpServletResponse servletResponseMock = mock(HttpServletResponse.class);
167         when(webRequestMock.getNativeResponse(HttpServletResponse.class)).thenReturn(servletResponseMock);
168         when(servletResponseMock.getWriter()).thenThrow(new IOException("Error"));
169
170         InputService service = new InputService();
171         service.setVersion("1.0");
172         service.setDescription(SERVICE_DESCRIPTION);
173         service.setDisplayName(SERVICE_DISPLAY_NAME);
174
175         Exception exception = assertThrows(HeaderException.class, () -> {
176             delegateUnderTest.putIndividualService(SERVICE_NAME, service);
177         });
178
179         assertThat(exception.getMessage())
180             .isEqualTo("Unable to set header Location in put response for service " + SERVICE_NAME + ". Cause: Error");
181
182         ResponseEntity<List<Service>> response = delegateUnderTest.getServices();
183         assertThat(response.getBody()).isEmpty();
184     }
185
186     @Test
187     void getServices_shouldProvideArrayOfAddedServiceNames() throws Exception {
188         ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
189
190         InputService service1 = new InputService();
191         service1.setDescription("description 1");
192         service1.setVersion(SERVICE_VERSION);
193         service1.setDisplayName("Display Name 1");
194
195         InputService service2 = new InputService();
196         service2.setDescription("description 2");
197         service2.setVersion(SERVICE_VERSION);
198         service2.setDisplayName("Display Name 2");
199
200         whenPrintResponseShouldWork();
201
202         String serviceName1 = "Service Name 1";
203         delegateUnderTest.putIndividualService(serviceName1, service1);
204         String serviceName2 = "Service Name 2";
205         delegateUnderTest.putIndividualService(serviceName2, service2);
206
207         ResponseEntity<List<Service>> response = delegateUnderTest.getServices();
208
209         assertThat(response.getStatusCode()).isEqualTo(OK);
210         List<Service> services = response.getBody();
211         assertThat(services).hasSize(2);
212         List<String> expectedServiceNames = Arrays.asList(serviceName1, serviceName2);
213         assertThat(expectedServiceNames).contains(services.get(0).getName()) //
214             .contains(services.get(1).getName());
215     }
216
217     @Test
218     void deleteService_shouldBeOk() throws Exception {
219         ServicesApiDelegateImpl delegateUnderTest = new ServicesApiDelegateImpl(webRequestMock);
220
221         InputService service = new InputService();
222         service.setDescription(SERVICE_DESCRIPTION);
223         service.setVersion(SERVICE_VERSION);
224         service.setDisplayName(SERVICE_DISPLAY_NAME);
225
226         whenPrintResponseShouldWork();
227
228         delegateUnderTest.putIndividualService(SERVICE_NAME, service);
229
230         ResponseEntity<List<Service>> servicesResponse = delegateUnderTest.getServices();
231
232         assertThat(servicesResponse.getBody()).hasSize(1);
233
234         ResponseEntity<Void> deleteResponse = delegateUnderTest.deleteIndividualService(SERVICE_NAME);
235
236         assertThat(deleteResponse.getStatusCode()).isEqualTo(NO_CONTENT);
237
238         servicesResponse = delegateUnderTest.getServices();
239
240         assertThat(servicesResponse.getBody()).isEmpty();
241     }
242
243     private void whenGetRequestUrlThenReturnUrl() {
244         whenGetRequestUrlThenReturnUrl("URL");
245     }
246
247     private void whenGetRequestUrlThenReturnUrl(String url) {
248         HttpServletRequest servletRequestMock = mock(HttpServletRequest.class);
249         when(webRequestMock.getNativeRequest(HttpServletRequest.class)).thenReturn(servletRequestMock);
250         when(servletRequestMock.getRequestURL()).thenReturn(new StringBuffer(url));
251     }
252
253     private HttpServletResponse whenPrintResponseShouldWork() {
254         return whenPrintResponseShouldWork("URL");
255     }
256
257     private HttpServletResponse whenPrintResponseShouldWork(String url) {
258         whenGetRequestUrlThenReturnUrl(url);
259         HttpServletResponse servletResponseMock = mock(HttpServletResponse.class);
260         when(webRequestMock.getNativeResponse(HttpServletResponse.class)).thenReturn(servletResponseMock);
261         PrintWriter printWriterMock = mock(PrintWriter.class);
262         try {
263             when(servletResponseMock.getWriter()).thenReturn(printWriterMock);
264         } catch (IOException e) {
265             // Nothing
266         }
267         return servletResponseMock;
268     }
269
270     private String getTodaysDate() {
271         long millis = System.currentTimeMillis();
272         Date date = new Date(millis);
273         return date.toString();
274     }
275 }