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