Merge "Improvement of controlpanel dashboard Fix some bugs in the backend to support...
[portal/nonrtric-controlpanel.git] / webapp-backend / src / test / java / org / oransc / portal / nonrtric / controlpanel / policyagentapi / PolicyAgentApiImplTest.java
1 /*-
2  * ========================LICENSE_START=================================
3  * O-RAN-SC
4  * %%
5  * Copyright (C) 2020 Nordix Foundation
6  * Modifications Copyright (C) 2020 Nordix Foundation
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
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
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===================================
20  */
21 package org.oransc.portal.nonrtric.controlpanel.policyagentapi;
22
23 import static org.junit.jupiter.api.Assertions.assertEquals;
24 import static org.junit.jupiter.api.Assertions.assertNull;
25 import static org.junit.jupiter.api.Assertions.assertTrue;
26 import static org.mockito.ArgumentMatchers.contains;
27 import static org.mockito.ArgumentMatchers.eq;
28 import static org.mockito.Mockito.mock;
29 import static org.mockito.Mockito.when;
30
31 import com.google.gson.GsonBuilder;
32 import com.google.gson.JsonArray;
33 import com.google.gson.JsonElement;
34 import com.google.gson.JsonParser;
35
36 import java.nio.charset.StandardCharsets;
37 import java.util.Arrays;
38
39 import org.junit.jupiter.api.BeforeEach;
40 import org.junit.jupiter.api.Test;
41 import org.oransc.portal.nonrtric.controlpanel.model.PolicyInfo;
42 import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstance;
43 import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstances;
44 import org.oransc.portal.nonrtric.controlpanel.util.AsyncRestClient;
45 import org.springframework.http.HttpStatus;
46 import org.springframework.http.ResponseEntity;
47 import org.springframework.web.client.HttpServerErrorException;
48 import reactor.core.publisher.Mono;
49
50 class PolicyAgentApiImplTest {
51     private static final String URL_POLICY_SCHEMAS = "/v2/policy-types";
52     private static final String POLICY_TYPE_1_ID = "type1";
53     private static final String POLICY_TYPE_1_VALID = "{\"title\":\"type1\"}";
54     private static final String POLICY_TYPE_1_INVALID = "\"title\":\"type1\"}";
55     private static final String POLICY_TYPE_2_VALID = "{\"title\":\"type2\"}";
56     private static final String POLICY_1_ID = "policy1";
57     private static final String POLICY_DATA =
58         "{\"qosObjectives\":{\"priorityLevel\":22.0},\"scope\":{\"qosId\":\"22\",\"ueId\":\"22\"}}";
59     private static final String POLICY_1_VALID =
60         "{\"policy_id\":\"policy1\",\"policytype_id\":\"type1\",\"ric_id\":\"ric1\",\"policy_data\":" + POLICY_DATA
61             + ",\"service_id\":\"controlpanel\"}";
62     private static final String POLICY_1_INVALID = "\"policy_id\":\"policy1\"}";
63     private static final String RIC_1_ID = "ric1";
64     private static final String RIC_1_INFO_VALID = "{\"ric_id\":\"ric1\",\"policytype_ids\":[\"type1\"]}";
65     private static final String RIC_1_INFO_INVALID = "{\"ric_id\":\"ric1\",\"policytype_ids\":\"type1\"]}";
66     private static final String CLIENT_ERROR_MESSAGE = "XXXXXXX";
67     private static final String SERVICE_ID = "controlpanel";
68
69     private static com.google.gson.Gson gson = new GsonBuilder() //
70         .serializeNulls() //
71         .create(); //
72
73     PolicyAgentApiImpl apiUnderTest;
74
75     AsyncRestClient restClient;
76
77     @BeforeEach
78     void init() {
79         restClient = mock(AsyncRestClient.class);
80         apiUnderTest = new PolicyAgentApiImpl(restClient);
81     }
82
83     private void whenGetReturnOK(String url, HttpStatus status, String body) {
84         ResponseEntity<String> ret = new ResponseEntity<>(body, status);
85         when(restClient.getForEntity(eq(url))).thenReturn(Mono.just(ret));
86     }
87
88     private void whenGetReturnFailure(String url, HttpStatus status, String body) {
89         HttpServerErrorException e = new HttpServerErrorException(status, body);
90         when(restClient.getForEntity(eq(url))).thenReturn(Mono.error(e));
91     }
92
93     @Test
94     void testGetAllPolicyTypesFailure() {
95         whenGetReturnFailure(URL_POLICY_SCHEMAS, HttpStatus.NOT_FOUND, "");
96         ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
97         assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
98     }
99
100     @Test
101     void testGetAllPolicyTypesSuccessValidJson() {
102         String returnValue = "{\"policytype_ids\": [\"type1\",\"type2\"]}";
103         whenGetReturnOK(URL_POLICY_SCHEMAS, HttpStatus.OK, returnValue);
104         whenGetReturnOK(URL_POLICY_SCHEMAS + "/type1", HttpStatus.OK, "{\"policy_schema\":{}}");
105         whenGetReturnOK(URL_POLICY_SCHEMAS + "/type2", HttpStatus.OK, "{\"policy_schema\":{}}");
106
107         ResponseEntity<String> resp = apiUnderTest.getAllPolicyTypes();
108         assertTrue(resp.getBody().contains("\"name\":\"type1\""));
109         assertEquals(HttpStatus.OK, resp.getStatusCode());
110     }
111
112     @Test
113     void testGetAllPolicyTypesSuccessInvalidJson() {
114         String policyTypes = Arrays.asList(POLICY_TYPE_1_INVALID, POLICY_TYPE_2_VALID).toString();
115         whenGetReturnOK(URL_POLICY_SCHEMAS, HttpStatus.OK, policyTypes);
116
117         ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
118
119         assertTrue(returnedResp.getBody().contains("Exception"));
120         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
121     }
122
123     private String urlPolicyInstances(String type) {
124         return "/v2/policies?policytype_id=" + type;
125     }
126
127     @Test
128     void testGetPolicyInstancesForTypeFailure() {
129         whenGetReturnFailure(urlPolicyInstances(POLICY_TYPE_1_ID), HttpStatus.NOT_FOUND, "");
130
131         ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
132
133         assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
134     }
135
136     @Test
137     void testGetPolicyInstancesForTypeSuccessValidJson() {
138         String policyInstances = "{\"policy_ids\":[\"policy1\"]}";
139         String policyInstancesJson = parsePolicyInstancesJson("[\"policy1\"]");
140
141         whenGetReturnOK(urlPolicyInstances(POLICY_TYPE_1_ID), HttpStatus.OK, policyInstances);
142         whenGetReturnOK(urlPolicyInstance(POLICY_1_ID), HttpStatus.OK, POLICY_1_VALID);
143
144         ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
145         assertEquals(returnedResp.getBody(), policyInstancesJson);
146         assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
147     }
148
149     @Test
150     void testGetPolicyInstancesForTypeSuccessInvalidJson() {
151         String policyInstances = Arrays.asList(POLICY_1_INVALID).toString();
152
153         whenGetReturnOK(urlPolicyInstances(POLICY_TYPE_1_ID), HttpStatus.OK, policyInstances);
154
155         ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
156
157         assertTrue(returnedResp.getBody().contains("Exception"));
158         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
159     }
160
161     private String urlPolicyInstance(String id) {
162         return "/v2/policies/" + id;
163     }
164
165     @Test
166     void testGetPolicyInstance() {
167         whenGetReturnOK(urlPolicyInstance(POLICY_1_ID), HttpStatus.OK, POLICY_1_VALID);
168
169         ResponseEntity<Object> returnedResp = apiUnderTest.getPolicyInstance(POLICY_1_ID);
170
171         assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
172         assertEquals(POLICY_DATA, gson.toJson(returnedResp.getBody()));
173     }
174
175     private String urlPutPolicy() {
176         return "/v2/policies/";
177     }
178
179     private void whenPutReturnOK(String url, String putBody, HttpStatus status, String body) {
180         ResponseEntity<String> ret = new ResponseEntity<>(body, status);
181         when(restClient.putForEntity(eq(url), contains(SERVICE_ID))).thenReturn(Mono.just(ret));
182     }
183
184     private void whenPutReturnFailure(String url, String putBody, HttpStatus status, String body) {
185         HttpServerErrorException e =
186             new HttpServerErrorException(status, body, body.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
187         when(restClient.putForEntity(eq(url), contains(SERVICE_ID))).thenReturn(Mono.error(e));
188     }
189
190     @Test
191     void testPutPolicyFailure() {
192         String url = urlPutPolicy();
193
194         PolicyInstance i = PolicyInstance.builder() //
195             .policyId(POLICY_1_ID) //
196             .policyTypeId(POLICY_TYPE_1_ID) //
197             .ricId(RIC_1_ID) //
198             .policyData(POLICY_DATA) //
199             .serviceId(SERVICE_ID) //
200             .build(); //
201
202         String jsonStr = gson.toJson(i, PolicyInstance.class);
203         whenPutReturnFailure(url, jsonStr, HttpStatus.NOT_FOUND, CLIENT_ERROR_MESSAGE);
204
205         ResponseEntity<String> returnedResp =
206             apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_DATA, RIC_1_ID);
207
208         assertTrue(returnedResp.getBody().contains(CLIENT_ERROR_MESSAGE));
209         assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
210     }
211
212     @Test
213     void testPutPolicySuccess() {
214         String url = urlPutPolicy();
215         PolicyInstance i = PolicyInstance.builder() //
216             .policyId(POLICY_1_ID) //
217             .policyTypeId(POLICY_TYPE_1_ID) //
218             .ricId(RIC_1_ID) //
219             .policyData(POLICY_DATA) //
220             .serviceId(SERVICE_ID) //
221             .build(); //
222         String jsonStr = gson.toJson(i, PolicyInstance.class);
223
224         whenPutReturnOK(url, jsonStr, HttpStatus.OK, POLICY_1_VALID);
225
226         ResponseEntity<String> returnedResp =
227             apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_DATA, RIC_1_ID);
228         assertNull(returnedResp.getBody());
229         assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
230     }
231
232     private void whenDeleteReturnOK(String url, HttpStatus status) {
233         ResponseEntity<String> ret = new ResponseEntity<>(status);
234         when(restClient.deleteForEntity(eq(url))).thenReturn(Mono.just(ret));
235     }
236
237     private void whenDeleteReturnFailure(String url, HttpStatus status, String body) {
238         HttpServerErrorException e =
239             new HttpServerErrorException(status, body, body.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
240         when(restClient.deleteForEntity(eq(url))).thenReturn(Mono.error(e));
241     }
242
243     private String deletePolicyUrl(String id) {
244         return "/v2/policies/" + id;
245     }
246
247     @Test
248     void testDeletePolicyFailure() {
249         whenDeleteReturnFailure(deletePolicyUrl(POLICY_1_ID), HttpStatus.NOT_FOUND, CLIENT_ERROR_MESSAGE);
250
251         ResponseEntity<String> returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID);
252
253         assertTrue(returnedResp.getBody().contains(CLIENT_ERROR_MESSAGE));
254         assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
255     }
256
257     @Test
258     void testDeletePolicySuccess() {
259         whenDeleteReturnOK(deletePolicyUrl(POLICY_1_ID), HttpStatus.OK);
260         ResponseEntity<String> returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID);
261
262         assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
263     }
264
265     private String urlRicInfo(String typeName) {
266         return "/v2/rics?policytype_id=" + typeName;
267     }
268
269     @Test
270     void testGetRicsSupportingTypeValidJson() {
271         String rics = Arrays.asList(RIC_1_INFO_VALID).toString();
272         String returnVal = "{\"rics\":" + rics + "}";
273         this.whenGetReturnOK(urlRicInfo(POLICY_TYPE_1_ID), HttpStatus.OK, returnVal);
274
275         ResponseEntity<String> resp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID);
276
277         assertEquals(HttpStatus.OK, resp.getStatusCode());
278         assertEquals("[\"ric1\"]", resp.getBody());
279     }
280
281     @Test
282     void testGetRicsSupportingTypeInvalidJson() {
283         String rics = Arrays.asList(RIC_1_INFO_INVALID).toString();
284
285         this.whenGetReturnOK(urlRicInfo(POLICY_TYPE_1_ID), HttpStatus.OK, rics);
286
287         ResponseEntity<String> returnedResp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID);
288
289         assertTrue(returnedResp.getBody().contains("Exception"));
290         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
291     }
292
293     private String parsePolicyInstancesJson(String inputString) {
294         JsonArray arr = JsonParser.parseString(inputString).getAsJsonArray();
295         PolicyInstances res = new PolicyInstances();
296         JsonElement data = JsonParser.parseString(POLICY_DATA).getAsJsonObject();
297         for (JsonElement id : arr) {
298             PolicyInfo i = PolicyInfo.builder() //
299                 .policyId(id.getAsString()) //
300                 .policyTypeId(POLICY_TYPE_1_ID) //
301                 .ricId(RIC_1_ID) //
302                 .policyData(data) //
303                 .serviceId(SERVICE_ID) //
304                 .build(); //
305             res.add(i);
306         }
307         return gson.toJson(res);
308     }
309 }