2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 Nokia Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.vid.mso;
24 import static org.assertj.core.api.Java6Assertions.assertThat;
25 import static org.mockito.ArgumentMatchers.any;
26 import static org.mockito.ArgumentMatchers.eq;
27 import static org.mockito.Mockito.when;
28 import static org.mockito.MockitoAnnotations.initMocks;
30 import io.joshworks.restclient.request.HttpRequest;
31 import java.io.IOException;
32 import java.security.GeneralSecurityException;
33 import java.util.Optional;
34 import javax.ws.rs.client.Client;
35 import javax.ws.rs.client.Entity;
36 import javax.ws.rs.client.WebTarget;
37 import javax.ws.rs.core.MultivaluedHashMap;
38 import javax.ws.rs.core.MultivaluedMap;
39 import javax.ws.rs.core.Response;
40 import org.glassfish.jersey.client.JerseyInvocation;
41 import org.mockito.InjectMocks;
42 import org.mockito.Mock;
43 import org.onap.vid.aai.util.HttpClientMode;
44 import org.onap.vid.aai.util.HttpsAuthClient;
45 import org.onap.vid.changeManagement.RequestDetailsWrapper;
46 import org.onap.vid.exceptions.GenericUncheckedException;
47 import org.onap.vid.mso.rest.RequestDetails;
48 import org.onap.vid.utils.Logging;
49 import org.onap.vid.utils.SystemPropertiesWrapper;
50 import org.springframework.http.HttpMethod;
51 import org.springframework.http.HttpStatus;
52 import org.testng.annotations.BeforeClass;
53 import org.testng.annotations.Test;
55 public class RestMsoImplementationTest {
58 private HttpRequest httpRequest;
61 private Client mockClient;
64 private HttpsAuthClient mockHttpsAuthClient;
67 private WebTarget webTarget;
70 private javax.ws.rs.client.Invocation.Builder builder;
73 private Response response;
76 private JerseyInvocation jerseyInvocation;
79 private SystemPropertiesWrapper systemProperties;
82 private Logging loggingService;
85 private RestMsoImplementation restMsoImplementation;
87 private String path = "/test_path/";
88 private String rawData = "test-row-data";
91 public void setUp() throws GeneralSecurityException, IOException {
93 when(mockHttpsAuthClient.getClient(any(HttpClientMode.class))).thenReturn(mockClient);
94 when(systemProperties.getProperty(MsoProperties.MSO_PASSWORD)).thenReturn("OBF:1ghz1kfx1j1w1m7w1i271e8q1eas1hzj1m4i1iyy1kch1gdz");
98 public void shouldProperlyInitMsoClient() {
100 MultivaluedHashMap<String, Object> result = restMsoImplementation.initMsoClient();
103 assertThat(result).containsKeys("Authorization","X-ONAP-PartnerName");
104 assertThat(result).doesNotContainKey("notExistingKey");
108 public void shouldProperlyGetRestObjectWithRequestInfo() {
110 RestObject<HttpRequest> restObject = new RestObject<>();
112 prepareMocks(rawData, HttpStatus.ACCEPTED.value(),"");
115 RestObjectWithRequestInfo<HttpRequest> response = restMsoImplementation.Get(httpRequest, path, restObject,false);
118 assertThat(response.getRequestedUrl()).contains(path);
119 assertThat(response.getRawData()).isEqualTo(rawData);
120 assertThat(response.getHttpCode()).isEqualTo(HttpStatus.ACCEPTED.value());
121 assertThat(response.getHttpMethod()).isEqualTo(HttpMethod.GET);
124 @Test( expectedExceptions = GenericUncheckedException.class)
125 public void shouldThrowExceptionWhenGetRestObjectWithRequestInfoGetsWrongStatus() {
127 RestObject<HttpRequest> restObject = new RestObject<>();
129 prepareMocks("",HttpStatus.BAD_REQUEST.value(),"");
132 restMsoImplementation.Get(httpRequest, "", restObject,false);
135 @Test( expectedExceptions = MsoTestException.class)
136 public void shouldThrowExceptionWhenGetRestObjectWithRequestInfoGetsWrongParameters() {
138 RestObject<HttpRequest> restObject = new RestObject<>();
140 prepareMocks("",HttpStatus.ACCEPTED.value(),"");
141 when(systemProperties.getProperty(MsoProperties.MSO_SERVER_URL)).thenReturn("SAMPLE_URL");
142 when(mockClient.target("SAMPLE_URL")).thenThrow(new MsoTestException("test-target-exception"));
145 restMsoImplementation.Get(httpRequest, "", restObject,false);
149 public void shouldProperlyGetRestObjectForObjectWithRequestInfoAndAcceptCode() {
151 prepareMocks(rawData,HttpStatus.ACCEPTED.value(),"");
154 RestObject response = restMsoImplementation.GetForObject(path, HttpRequest.class);
157 assertThat(response.getStatusCode()).isEqualTo(HttpStatus.ACCEPTED.value());
158 assertThat(response.getRaw()).isEqualTo(rawData);
162 public void shouldProperlyGetRestObjectForObjectWithRequestInfoAndBadRequestCode() {
164 prepareMocks(rawData,HttpStatus.BAD_REQUEST.value(),"");
167 RestObject response = restMsoImplementation.GetForObject(path, HttpRequest.class);
170 assertThat(response.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST.value());
171 assertThat(response.getRaw()).isEqualTo(rawData);
175 public void shouldProperlyDeleteRestObjectWithStatusHttpAccepted() {
177 RestObject<HttpRequest> restObject = new RestObject<>();
179 prepareMocks(rawData,HttpStatus.ACCEPTED.value(),"DELETE");
182 restMsoImplementation.Delete(httpRequest, "testObject", path, restObject);
185 assertThat(restObject.getStatusCode()).isEqualTo(HttpStatus.ACCEPTED.value());
189 public void shouldProperlyDeleteRestObjectWithStatusOK() {
191 RestObject<HttpRequest> restObject = new RestObject<>();
193 prepareMocks(rawData,HttpStatus.OK.value(),"DELETE");
196 restMsoImplementation.Delete(httpRequest, "testObject", path, restObject);
199 assertThat(restObject.getStatusCode()).isEqualTo(HttpStatus.OK.value());
203 public void shouldProperlyReturnFromDeleteWithStatusBadRequest() {
205 RestObject<HttpRequest> restObject = new RestObject<>();
207 prepareMocks(rawData,HttpStatus.BAD_REQUEST.value(),"DELETE");
210 restMsoImplementation.Delete(httpRequest, "testObject", path, restObject);
213 assertThat(restObject.getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST.value());
217 public void shouldProperlyReturnFromDeleteWithStatusOtherThenAbove() {
219 RestObject<HttpRequest> restObject = new RestObject<>();
220 prepareMocks(rawData,HttpStatus.NOT_EXTENDED.value(),"DELETE");
223 restMsoImplementation.Delete(httpRequest, "testObject", path, restObject);
226 assertThat(restObject.getStatusCode()).isEqualTo(HttpStatus.NOT_EXTENDED.value());
229 @Test( expectedExceptions = MsoTestException.class)
230 public void shouldThrowExceptionWhenCallsDeleteWithWrongParameters() {
232 when(mockClient.target(any(String.class))).thenThrow(new MsoTestException("testDeleteException"));
235 restMsoImplementation.Delete(httpRequest, "testObject", "", null);
238 @Test( expectedExceptions = NullPointerException.class)
239 public void shouldThrowExceptionWhenCallsDeleteWithWrongObjectType() {
241 RestObject<HttpRequest> restObject = new RestObject<>();
242 prepareMocks(rawData,HttpStatus.ACCEPTED.value(),"DELETE");
245 restMsoImplementation.Delete(null, "testObject", path, restObject);
249 public void shouldProperlyPostForObject() {
251 RequestDetails requestDetails = new RequestDetails();
253 RestObject<HttpRequest> expectedResponse = new RestObject<>();
254 expectedResponse.setStatusCode(HttpStatus.ACCEPTED.value());
255 expectedResponse.setRaw(rawData);
257 prepareMocks(rawData,HttpStatus.ACCEPTED.value(),"POST");
260 RestObject<HttpRequest> response = restMsoImplementation.PostForObject(requestDetails, path, HttpRequest.class);
263 assertThat(response).isEqualToComparingFieldByField(expectedResponse);
267 public void shouldProperlyDeleteForObject() {
269 RequestDetails requestDetails = new RequestDetails();
271 RestObject<HttpRequest> expectedResponse = new RestObject<>();
272 expectedResponse.setStatusCode(HttpStatus.ACCEPTED.value());
273 expectedResponse.setRaw(rawData);
275 prepareMocks(rawData,HttpStatus.ACCEPTED.value(),"DELETE");
278 RestObject<HttpRequest> response = restMsoImplementation.DeleteForObject(requestDetails, path, HttpRequest.class);
281 assertThat(response).isEqualToComparingFieldByField(expectedResponse);
285 public void shouldProperlyPost() {
287 RequestDetails requestDetails = new RequestDetails();
288 RestObject<String> response = new RestObject<>();
290 RestObject<String> expectedResponse = new RestObject<>();
291 expectedResponse.setStatusCode(HttpStatus.ACCEPTED.value());
292 expectedResponse.setRaw(rawData);
294 prepareMocks(rawData,HttpStatus.ACCEPTED.value(),"POST");
297 restMsoImplementation.Post(rawData,requestDetails, path, response);
300 assertThat(response).isEqualToComparingFieldByField(expectedResponse);
304 public void shouldProperlyPrepareClient() {
306 String method = "POST";
307 prepareMocks(rawData,HttpStatus.ACCEPTED.value(),method);
310 javax.ws.rs.client.Invocation.Builder response = restMsoImplementation.prepareClient(path, method);
313 assertThat(response).isEqualTo(builder);
317 public void shouldCreatRestObjectOnlyWithHttpMethod() {
319 String method = "GET";
320 prepareMocks(rawData,HttpStatus.ACCEPTED.value(),method);
322 RestObject<String> expectedResponse = new RestObject<>();
323 expectedResponse.setStatusCode(HttpStatus.ACCEPTED.value());
324 expectedResponse.setRaw(rawData);
327 RestObject<String> response = restMsoImplementation.restCall(HttpMethod.GET, String.class, null, path, Optional.empty());
330 assertThat(response).isEqualToComparingFieldByField(expectedResponse);
333 @Test( expectedExceptions = MsoTestException.class)
334 public void shouldThrowExceptionWhenCreateRestObjectIsCalledWithoutDefinedClient() {
336 when(mockClient.target(any(String.class))).thenThrow(new MsoTestException("testNoClientException"));
339 restMsoImplementation.restCall(HttpMethod.GET, String.class, null, "", Optional.empty());
343 public void shouldProperlyPutRestObjectWithProperParametersAndStatusAccepted() {
345 String method = "PUT";
346 prepareMocks(rawData,HttpStatus.ACCEPTED.value(),method);
348 org.onap.vid.changeManagement.RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
349 RestObject<String> response = new RestObject<>();
351 RestObject<String> expectedResponse = new RestObject<>();
352 expectedResponse.setStatusCode(HttpStatus.ACCEPTED.value());
353 expectedResponse.set(rawData);
356 restMsoImplementation.Put("testPutBody", requestDetailsWrapper , path, response);
359 assertThat(response).isEqualToComparingFieldByField(expectedResponse);
363 public void shouldProperlyPutRestObjectWithProperParametersAndStatusMultipleChoices() {
365 String method = "PUT";
366 prepareMocks(rawData,HttpStatus.MULTIPLE_CHOICES.value(),method);
368 org.onap.vid.changeManagement.RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
369 RestObject<String> response = new RestObject<>();
371 RestObject<String> expectedResponse = new RestObject<>();
372 expectedResponse.setStatusCode(HttpStatus.MULTIPLE_CHOICES.value());
373 expectedResponse.set(rawData);
376 restMsoImplementation.Put("testPutBody", requestDetailsWrapper , path, response);
379 assertThat(response).isEqualToComparingFieldByField(expectedResponse);
382 @Test( expectedExceptions = MsoTestException.class)
383 public void shouldThrowExceptionWhenCallsPutWithWrongParameters() {
385 when(mockClient.target(any(String.class))).thenThrow(new MsoTestException("testDeleteException"));
386 org.onap.vid.changeManagement.RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
389 restMsoImplementation.Put(null, requestDetailsWrapper, "", null);
392 @Test( expectedExceptions = NullPointerException.class)
393 public void shouldThrowExceptionWhenCallsPutWithWrongObjectType() {
395 RestObject<HttpRequest> restObject = new RestObject<>();
396 org.onap.vid.changeManagement.RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
398 prepareMocks(rawData,HttpStatus.ACCEPTED.value(),"DELETE");
401 restMsoImplementation.Put(null, requestDetailsWrapper, path, restObject);
406 private void prepareMocks(String rawData,int status,String httpMethod) {
408 when(mockClient.target(any(String.class))).thenReturn(webTarget);
409 when(webTarget.request()).thenReturn(builder);
412 when(builder.accept(any(String.class))).thenReturn(builder);
413 when(builder.headers(any(MultivaluedMap.class))).thenReturn(builder);
414 when(builder.get()).thenReturn(response);
416 when(builder.build( eq(httpMethod), any(Entity.class))).thenReturn(jerseyInvocation);
417 when(builder.build( eq(httpMethod))).thenReturn(jerseyInvocation);
419 when(builder.put( any(Entity.class))).thenReturn(response);
420 when(jerseyInvocation.invoke()).thenReturn(response);
423 when(response.getStatus()).thenReturn(status);
424 when(response.readEntity(String.class)).thenReturn(rawData);
427 private class MsoTestException extends RuntimeException{
428 MsoTestException(String testException) {
429 super(testException);