Merge "while ng1 view/edit - get aai service if they are not exist yet"
[vid.git] / vid-app-common / src / test / java / org / onap / vid / services / SchedulerServiceImplTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * VID
4  * ================================================================================
5  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.vid.services;
22
23 import com.fasterxml.jackson.core.JsonParseException;
24 import org.apache.xmlbeans.SystemProperties;
25 import org.hamcrest.Matcher;
26 import org.mockito.InjectMocks;
27 import org.mockito.Mock;
28 import org.mockito.Mockito;
29 import org.mockito.MockitoAnnotations;
30 import org.onap.vid.aai.ExceptionWithRequestInfo;
31 import org.onap.vid.exceptions.GenericUncheckedException;
32 import org.onap.vid.exceptions.NotFoundException;
33 import org.onap.vid.model.probes.ErrorMetadata;
34 import org.onap.vid.model.probes.ExternalComponentStatus;
35 import org.onap.vid.model.probes.HttpRequestMetadata;
36 import org.onap.vid.mso.RestObject;
37 import org.onap.vid.mso.RestObjectWithRequestInfo;
38 import org.onap.vid.scheduler.SchedulerServiceImpl;
39 import org.springframework.http.HttpMethod;
40 import org.springframework.test.context.ContextConfiguration;
41 import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
42 import org.springframework.test.context.web.WebAppConfiguration;
43 import org.testng.annotations.AfterMethod;
44 import org.testng.annotations.BeforeTest;
45 import org.testng.annotations.Test;
46
47 import static org.hamcrest.MatcherAssert.assertThat;
48 import static org.hamcrest.Matchers.*;
49 import static org.mockito.Mockito.mock;
50 import static org.mockito.Mockito.when;
51 import static org.onap.vid.model.probes.ExternalComponentStatus.Component.SCHEDULER;
52
53 @ContextConfiguration(classes = {SystemProperties.class})
54 @WebAppConfiguration
55 public class SchedulerServiceImplTest extends AbstractTestNGSpringContextTests {
56
57     @InjectMocks
58     private SchedulerServiceImpl schedulerService;
59
60     @Mock
61     private ChangeManagementService changeManagementService;
62
63
64     @BeforeTest
65     public void initMocks() {
66         MockitoAnnotations.initMocks(this);
67     }
68
69     @AfterMethod
70     public void reset() {
71         Mockito.reset(changeManagementService);
72     }
73
74     @Test
75     public void probeGetSchedulerChangeManegements_verifyGoodRequest(){
76         String responseString = "[" +
77                 "  {" +
78                 "    \"vnfName\": \"dbox0001v\"," +
79                 "    \"status\": \"Triggered\"," +
80                 "    \"aotsChangeId\": \"CHG000000000001\"," +
81                 "    \"aotsApprovalStatus\": \"Approved\"," +
82                 "    \"groupId\": \"groupId\"," +
83                 "    \"dispatchTime\": \"2018-05-09T14:05:43Z\"," +
84                 "    \"msoRequestId\": \"2fb4edd1-01c4-4fee-bd4a-4ae6282aa213\"," +
85                 "    \"scheduleRequest\": {" +
86                 "      \"id\": 1," +
87                 "      \"createDateTime\": \"2018-05-09T14:05:34Z\"," +
88                 "      \"optimizerAttemptsToSchedule\": 0," +
89                 "      \"optimizerTransactionId\": \"70f05563-6705-4be0-802a-8b6b78a69d63\"," +
90                 "      \"scheduleId\": \"70f05563-6705-4be0-802a-8b6b78a69d63\"," +
91                 "      \"scheduleName\": \"70f05563-6705-4be0-802a-8b6b78a69d63\"," +
92                 "      \"status\": \"Notifications Initiated\"," +
93                 "      \"userId\": \"wl849v\"," +
94                 "      \"domain\": \"ChangeManagement\"," +
95                 "      \"domainData\": [" +
96                 "        {" +
97                 "          \"id\": 1," +
98                 "          \"name\": \"WorkflowName\"," +
99                 "          \"value\": \"VNF In Place Software Update\"" +
100                 "        }," +
101                 "        {" +
102                 "          \"id\": 2," +
103                 "          \"name\": \"CallbackUrl\"," +
104                 "          \"value\": \"https://vid-web-ete-new.ecomp.cci.att.com:8000/vid/change-management/workflow/\"" +
105                 "        }," +
106                 "        {" +
107                 "          \"id\": 3," +
108                 "          \"name\": \"CallbackData\"," +
109                 "          \"value\": \"{\\\"requestType\\\":\\\"VNF In Place Software Update\\\",\\\"requestDetails\\\":[{\\\"vnfName\\\":\\\"dbox0001v\\\",\\\"vnfInstanceId\\\":\\\"815d38c0-b686-491c-9a74-0b49add524ca\\\",\\\"modelInfo\\\":{\\\"modelType\\\":\\\"vnf\\\",\\\"modelInvariantId\\\":\\\"59f4e0b2-e1b0-4e3b-bae3-e7b8c5d32985\\\",\\\"modelVersionId\\\":\\\"345643c1-3a51-423f-aac1-502e027d8dab\\\",\\\"modelName\\\":\\\"dbox0001v\\\",\\\"modelCustomizationId\\\":\\\"01ce23cb-d276-4d71-a5f1-f9d42d0df543\\\"},\\\"cloudConfiguration\\\":{\\\"lcpCloudRegionId\\\":\\\"dpa2b\\\",\\\"tenantId\\\":\\\"b60da4f71c1d4b35b8113d4eca6deaa1\\\"},\\\"requestInfo\\\":{\\\"source\\\":\\\"VID\\\",\\\"suppressRollback\\\":false,\\\"requestorId\\\":\\\"wl849v\\\"},\\\"relatedInstanceList\\\":[{\\\"relatedInstance\\\":{\\\"instanceId\\\":\\\"eb774932-e9fa-4c7f-bbc1-229b6b2b11e2\\\",\\\"modelInfo\\\":{\\\"modelType\\\":\\\"service\\\",\\\"modelInvariantId\\\":\\\"57dd617b-d64e-4441-a287-4d158b24ba65\\\",\\\"modelVersionId\\\":\\\"345643c1-3a51-423f-aac1-502e027d8dab\\\",\\\"modelName\\\":\\\"control_loop_dbe_svc\\\",\\\"modelVersion\\\":\\\"2.0\\\"}}}],\\\"requestParameters\\\":{\\\"payload\\\":\\\"{\\\\\\\"existing_software_version\\\\\\\":\\\\\\\"2\\\\\\\",\\\\\\\"new_software_version\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"operations_timeout\\\\\\\":\\\\\\\"3\\\\\\\"}\\\",\\\"testApi\\\":\\\"GR_API\\\"}}]}\"" +
110                 "        }" +
111                 "      ]," +
112                 "      \"scheduleApprovals\": []" +
113                 "    }," +
114                 "    \"schedulesId\": 0" +
115                 "  }" +
116                 "]";;
117
118         final RestObject mockedRestObject = mock(RestObject.class);
119
120         final RestObjectWithRequestInfo restObjectWithRequestInfo = new RestObjectWithRequestInfo(HttpMethod.GET, "my pretty url", mockedRestObject, 200, responseString);
121
122         when(changeManagementService.getSchedulerChangeManagementsWithRequestInfo()).thenReturn(
123                 restObjectWithRequestInfo
124         );
125
126         final ExternalComponentStatus schedulerStatus = schedulerService.probeComponent();
127
128         assertSchedulerStatus(schedulerStatus, true);
129         assertMetadata(schedulerStatus, 200, startsWith(responseString.substring(0, 400)), "my pretty url", equalTo("OK"));
130     }
131
132     @Test
133     public void probeGetSchedulerChangeManegements_response200OkButEmptyPayload_shouldDescribeCorrectly() {
134         String responseString = "" +
135                 "[]";
136
137         final RestObject mockedRestObject = mock(RestObject.class);
138
139         final RestObjectWithRequestInfo restObjectWithRequestInfo = new RestObjectWithRequestInfo(HttpMethod.GET, "my pretty url", mockedRestObject, 200, responseString);
140
141         when(changeManagementService.getSchedulerChangeManagementsWithRequestInfo()).thenReturn(
142                 restObjectWithRequestInfo
143         );
144
145         final ExternalComponentStatus schedulerStatus = schedulerService.probeComponent();
146
147         assertSchedulerStatus(schedulerStatus, true);
148
149        assertMetadata(schedulerStatus, 200, equalTo(responseString), "my pretty url", containsString("OK"));
150    }
151
152     @Test
153     public void probeGetSchedulerChangeManegements_response200OkButInvalidPayload_shouldDescribeCorrectly() {
154         String responseString = "this payload is an invalid json";
155
156         final RestObject mockedRestObject = mock(RestObject.class);
157
158         final RestObjectWithRequestInfo restObjectWithRequestInfo = new RestObjectWithRequestInfo(HttpMethod.GET, "my pretty url", mockedRestObject, 200, responseString);
159
160         when(changeManagementService.getSchedulerChangeManagementsWithRequestInfo()).thenThrow(new ExceptionWithRequestInfo(HttpMethod.GET,
161                 "my pretty url", responseString, 200, new JsonParseException(null, "Unrecognized token")));
162
163         final ExternalComponentStatus schedulerStatus = schedulerService.probeComponent();
164
165         assertSchedulerStatus(schedulerStatus, false);
166
167         assertMetadata(schedulerStatus, 200, equalTo(responseString), "my pretty url", containsString("JsonParseException: Unrecognized token"));
168     }
169
170     @Test
171     public void probeGetSchedulerChangeManegements_throwNotFoundException_resultIsWithErrorMetadata() {
172         when(changeManagementService.getSchedulerChangeManagementsWithRequestInfo()).thenThrow(
173                 new GenericUncheckedException(new NotFoundException("Get with status = 400")));
174
175         final ExternalComponentStatus schedulerStatus = schedulerService.probeComponent();
176
177         assertThat(schedulerStatus.isAvailable(), is(false));
178         assertThat(schedulerStatus.getComponent(), is(SCHEDULER));
179         assertThat(schedulerStatus.getMetadata(), instanceOf(ErrorMetadata.class));
180
181         final ErrorMetadata metadata = ((ErrorMetadata) schedulerStatus.getMetadata());
182         org.junit.Assert.assertThat(metadata.getDescription(), containsString("NotFoundException: Get with status = 400"));
183     }
184
185     private void assertSchedulerStatus(ExternalComponentStatus schedulerStatus, boolean isAvailable) {
186         assertThat(schedulerStatus.isAvailable(), is(isAvailable));
187         assertThat(schedulerStatus.getComponent(), is(SCHEDULER));
188         assertThat(schedulerStatus.getMetadata(), instanceOf(HttpRequestMetadata.class));
189     }
190
191     private void assertMetadata(ExternalComponentStatus schedulerStatus, int httpCode, Matcher<String> rawData, String url, Matcher<String> descriptionMatcher) {
192         final HttpRequestMetadata metadata = ((HttpRequestMetadata) schedulerStatus.getMetadata());
193         org.junit.Assert.assertThat(metadata.getHttpMethod(), equalTo(HttpMethod.GET));
194         org.junit.Assert.assertThat(metadata.getHttpCode(), equalTo(httpCode));
195         org.junit.Assert.assertThat(metadata.getUrl(), equalTo(url));
196         org.junit.Assert.assertThat(metadata.getRawData(), rawData);
197         org.junit.Assert.assertThat(metadata.getDescription(), descriptionMatcher);
198     }
199 }