2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2023 Nordix Foundation.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
20 package org.onap.so.cnfm.lcm.rest;
22 import static org.junit.Assert.assertEquals;
23 import static org.junit.Assert.assertNotNull;
24 import static org.junit.Assert.assertTrue;
25 import static org.mockito.ArgumentMatchers.eq;
26 import static org.mockito.Mockito.doNothing;
27 import static org.mockito.Mockito.when;
28 import java.util.List;
29 import java.util.UUID;
30 import org.junit.Before;
31 import org.junit.Test;
32 import org.junit.runner.RunWith;
33 import org.onap.so.cnfm.lcm.Constants;
34 import org.onap.so.cnfm.lcm.TestApplication;
35 import org.onap.so.cnfm.lcm.bpmn.flows.GsonProvider;
36 import org.onap.so.cnfm.lcm.bpmn.flows.exceptions.AsRequestProcessingException;
37 import org.onap.so.cnfm.lcm.bpmn.flows.service.JobExecutorService;
38 import org.onap.so.cnfm.lcm.model.AsInfoModificationRequestDeploymentItems;
39 import org.onap.so.cnfm.lcm.model.AsInstance;
40 import org.onap.so.cnfm.lcm.model.CreateAsRequest;
41 import org.onap.so.cnfm.lcm.model.ErrorDetails;
42 import org.onap.so.cnfm.lcm.model.InstantiateAsRequest;
43 import org.onap.so.cnfm.lcm.model.TerminateAsRequest;
44 import org.onap.so.cnfm.lcm.model.TerminateAsRequest.TerminationTypeEnum;
45 import org.springframework.beans.factory.annotation.Autowired;
46 import org.springframework.boot.test.context.SpringBootTest;
47 import org.springframework.boot.test.mock.mockito.MockBean;
48 import org.springframework.boot.test.web.client.TestRestTemplate;
49 import org.springframework.boot.web.client.RestTemplateBuilder;
50 import org.springframework.boot.web.server.LocalServerPort;
51 import org.springframework.http.HttpEntity;
52 import org.springframework.http.HttpHeaders;
53 import org.springframework.http.HttpMethod;
54 import org.springframework.http.HttpStatus;
55 import org.springframework.http.ResponseEntity;
56 import org.springframework.http.converter.json.GsonHttpMessageConverter;
57 import org.springframework.test.context.ActiveProfiles;
58 import org.springframework.test.context.junit4.SpringRunner;
59 import com.google.gson.Gson;
63 * @author Waqas Ikram (waqas.ikram@est.tech)
66 @RunWith(SpringRunner.class)
67 @SpringBootTest(classes = TestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
68 @ActiveProfiles("test")
69 public class AsLifecycleManagementControllerTest {
71 private static final String BASE_URL = "http://so-cnfm-lcm.onap:9888/so/so-cnfm/v1/api/aslcm/v1";
73 private static final String AS_LCM_OPOCC_ID = UUID.randomUUID().toString();
74 private static final String AS_INSTANCE_ID = UUID.randomUUID().toString();
75 private static final String ASD_ID = UUID.randomUUID().toString();
76 private static final String DEPLOYMENT_ITEM_ID = UUID.randomUUID().toString();
78 private static final String EXPECTED_AS_LCM_OPOCC_REQUEST_LOCATION_URL =
79 BASE_URL + "/as_lcm_op_occs/" + AS_LCM_OPOCC_ID;
81 private static final String EXPECTED_CREATE_REQUEST_LOCATION_URL = BASE_URL + "/as_instances/" + AS_INSTANCE_ID;
86 private TestRestTemplate testRestTemplate;
89 private GsonProvider gsonProvider;
92 private JobExecutorService mockedJobExecutorService;
96 final Gson gson = gsonProvider.getGson();
97 testRestTemplate = new TestRestTemplate(
98 new RestTemplateBuilder().additionalMessageConverters(new GsonHttpMessageConverter(gson)));
102 public void testCreateAs_ValidCreateAsRequest_Success() {
104 final CreateAsRequest createAsRequest = getCreateAsRequest();
106 when(mockedJobExecutorService.runCreateAsJob(eq(createAsRequest)))
107 .thenReturn(new AsInstance().asInstanceid(AS_INSTANCE_ID));
109 final String baseUrl = getAsLcmBaseUrl() + "/as_instances";
110 final ResponseEntity<AsInstance> responseEntity = testRestTemplate.exchange(baseUrl, HttpMethod.POST,
111 new HttpEntity<>(createAsRequest), AsInstance.class);
113 assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
114 assertTrue(responseEntity.hasBody());
115 assertNotNull(responseEntity.getBody());
117 final HttpHeaders httpHeaders = responseEntity.getHeaders();
118 assertTrue(httpHeaders.containsKey(HttpHeaders.LOCATION));
119 final List<String> actual = httpHeaders.get(HttpHeaders.LOCATION);
120 assertEquals(1, actual.size());
121 assertEquals(EXPECTED_CREATE_REQUEST_LOCATION_URL, actual.get(0));
125 public void testCreateAs_createAsRequest_asRequestProcessingExceptionThrown_returnErrorDetails() {
127 final CreateAsRequest createAsRequest = getCreateAsRequest();
129 final String message = "Unable to process request";
130 when(mockedJobExecutorService.runCreateAsJob(eq(createAsRequest)))
131 .thenThrow(new AsRequestProcessingException(message, new ErrorDetails().detail(message)));
133 final String baseUrl = getAsLcmBaseUrl() + "/as_instances";
134 final ResponseEntity<ErrorDetails> responseEntity = testRestTemplate.exchange(baseUrl, HttpMethod.POST,
135 new HttpEntity<>(createAsRequest), ErrorDetails.class);
137 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
138 assertTrue(responseEntity.hasBody());
139 assertNotNull(responseEntity.getBody());
141 final ErrorDetails body = responseEntity.getBody();
142 assertEquals(message, body.getDetail());
147 public void testCreateAs_createAsRequest_runTimeExceptionThrown_returnErrorDetails() {
149 final CreateAsRequest createAsRequest = getCreateAsRequest();
151 final String message = "Unable to process request";
152 when(mockedJobExecutorService.runCreateAsJob(eq(createAsRequest))).thenThrow(new RuntimeException(message));
154 final String baseUrl = getAsLcmBaseUrl() + "/as_instances";
155 final ResponseEntity<ErrorDetails> responseEntity = testRestTemplate.exchange(baseUrl, HttpMethod.POST,
156 new HttpEntity<>(createAsRequest), ErrorDetails.class);
158 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
159 assertTrue(responseEntity.hasBody());
160 assertNotNull(responseEntity.getBody());
162 final ErrorDetails body = responseEntity.getBody();
163 assertEquals(message, body.getDetail());
167 public void testinstantiateAs_validInstantiateAsRequest_Success() {
169 final InstantiateAsRequest instantiateAsRequest = getInstantiateAsRequest();
171 when(mockedJobExecutorService.runInstantiateAsJob(eq(AS_INSTANCE_ID), eq(instantiateAsRequest)))
172 .thenReturn(AS_LCM_OPOCC_ID);
174 final String baseUrl = getAsLcmBaseUrl() + "/as_instances/" + AS_INSTANCE_ID + "/instantiate";
175 final ResponseEntity<Void> responseEntity =
176 testRestTemplate.exchange(baseUrl, HttpMethod.POST, new HttpEntity<>(instantiateAsRequest), Void.class);
177 assertEquals(HttpStatus.ACCEPTED, responseEntity.getStatusCode());
179 final HttpHeaders httpHeaders = responseEntity.getHeaders();
180 assertTrue(httpHeaders.containsKey(HttpHeaders.LOCATION));
181 final List<String> actual = httpHeaders.get(HttpHeaders.LOCATION);
182 assertEquals(1, actual.size());
183 assertEquals(EXPECTED_AS_LCM_OPOCC_REQUEST_LOCATION_URL, actual.get(0));
187 public void testinstantiateAs_validInstantiateAsRequest_asRequestProcessingExceptionThrown_returnErrorDetails() {
189 final InstantiateAsRequest instantiateAsRequest = getInstantiateAsRequest();
191 when(mockedJobExecutorService.runInstantiateAsJob(eq(AS_INSTANCE_ID), eq(instantiateAsRequest)))
192 .thenThrow(new AsRequestProcessingException("failed"));
194 final String baseUrl = getAsLcmBaseUrl() + "/as_instances/" + AS_INSTANCE_ID + "/instantiate";
195 final ResponseEntity<ErrorDetails> responseEntity = testRestTemplate.exchange(baseUrl, HttpMethod.POST,
196 new HttpEntity<>(instantiateAsRequest), ErrorDetails.class);
197 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
198 assertTrue(responseEntity.hasBody());
199 assertNotNull(responseEntity.getBody());
203 public void testTerminateAs_ValidTerminateAsRequest_Success() {
205 final TerminateAsRequest terminateAsRequest =
206 new TerminateAsRequest().terminationType(TerminationTypeEnum.GRACEFUL);
208 when(mockedJobExecutorService.runTerminateAsJob(eq(AS_INSTANCE_ID), eq(terminateAsRequest)))
209 .thenReturn(AS_LCM_OPOCC_ID);
211 final String baseUrl = getAsLcmBaseUrl() + "/as_instances/" + AS_INSTANCE_ID + "/terminate";
212 final ResponseEntity<Void> responseEntity =
213 testRestTemplate.exchange(baseUrl, HttpMethod.POST, new HttpEntity<>(terminateAsRequest), Void.class);
214 assertEquals(HttpStatus.ACCEPTED, responseEntity.getStatusCode());
216 final HttpHeaders httpHeaders = responseEntity.getHeaders();
217 assertTrue(httpHeaders.containsKey(HttpHeaders.LOCATION));
218 final List<String> actual = httpHeaders.get(HttpHeaders.LOCATION);
219 assertEquals(1, actual.size());
220 assertEquals(EXPECTED_AS_LCM_OPOCC_REQUEST_LOCATION_URL, actual.get(0));
225 public void testDeleteAs_ValidRequest_Success() {
227 doNothing().when(mockedJobExecutorService).runDeleteAsJob(eq(AS_INSTANCE_ID));
228 final String baseUrl = getAsLcmBaseUrl() + "/as_instances/" + AS_INSTANCE_ID;
229 final ResponseEntity<Void> responseEntity =
230 testRestTemplate.exchange(baseUrl, HttpMethod.DELETE, null, Void.class);
231 assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode());
234 private InstantiateAsRequest getInstantiateAsRequest() {
235 return new InstantiateAsRequest().addDeploymentItemsItem(
236 new AsInfoModificationRequestDeploymentItems().deploymentItemsId(DEPLOYMENT_ITEM_ID));
239 private CreateAsRequest getCreateAsRequest() {
240 return new CreateAsRequest().asdId(ASD_ID);
243 private String getAsLcmBaseUrl() {
244 return "http://localhost:" + port + Constants.AS_LIFE_CYCLE_MANAGEMENT_BASE_URL;