2 * ========================LICENSE_START=================================
5 * Copyright (C) 2020 Nordix Foundation
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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===================================
20 package org.oransc.ric.portal.dashboard.policyagentapi;
22 import static org.junit.jupiter.api.Assertions.assertEquals;
23 import static org.junit.jupiter.api.Assertions.assertNull;
24 import static org.junit.jupiter.api.Assertions.assertTrue;
25 import static org.mockito.ArgumentMatchers.eq;
26 import static org.mockito.Mockito.doThrow;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
31 import com.google.gson.GsonBuilder;
32 import com.google.gson.JsonArray;
33 import com.google.gson.JsonElement;
34 import com.google.gson.JsonObject;
35 import com.google.gson.JsonParser;
36 import com.google.gson.reflect.TypeToken;
38 import java.lang.reflect.Type;
39 import java.util.ArrayList;
40 import java.util.Arrays;
41 import java.util.Collection;
42 import java.util.List;
45 import org.junit.jupiter.api.BeforeEach;
46 import org.junit.jupiter.api.Test;
47 import org.oransc.ric.portal.dashboard.model.ImmutablePolicyInfo;
48 import org.oransc.ric.portal.dashboard.model.PolicyInfo;
49 import org.oransc.ric.portal.dashboard.model.PolicyInstances;
50 import org.oransc.ric.portal.dashboard.model.PolicyType;
51 import org.oransc.ric.portal.dashboard.model.PolicyTypes;
52 import org.oransc.ric.portal.dashboard.policyagentapi.PolicyAgentApiImpl.RicInfo;
53 import org.springframework.http.HttpEntity;
54 import org.springframework.http.HttpHeaders;
55 import org.springframework.http.HttpStatus;
56 import org.springframework.http.MediaType;
57 import org.springframework.http.ResponseEntity;
58 import org.springframework.web.client.RestClientException;
59 import org.springframework.web.client.RestTemplate;
61 public class PolicyAgentApiImplTest {
62 private static final String URL_PREFIX = "UrlPrefix";
63 private static final String URL_POLICY_SCHEMAS = "/policy_schemas";
64 private static final String URL_POLICY_INSTANCES = "/policies?type={type}";
65 private static final String URL_POLICY_INSTANCE = "/policy?instance={id}";
66 private static final String URL_PUT_POLICY = "/policy?type={type}&instance={instance}&ric={ric}&service={service}";
67 private static final String URL_DELETE_POLICY = "/policy?instance={instance}";
68 private static final String URL_RIC_INFO = "/rics?policyType={typeName}";
69 private static final String POLICY_TYPE_1_ID = "type1";
70 private static final String POLICY_TYPE_1_VALID = "{\"title\":\"type1\"}";
71 private static final String POLICY_TYPE_1_INVALID = "\"title\":\"type1\"}";
72 private static final String POLICY_TYPE_2_VALID = "{\"title\":\"type2\"}";
73 private static final String POLICY_1_ID = "policy1";
74 private static final String POLICY_1_VALID = "{\"policyId\":\"policy1\"}";
75 private static final String POLICY_1_INVALID = "\"policyId\":\"policy1\"}";
76 private static final String RIC_1_ID = "ric1";
77 private static final String RIC_1_INFO_VALID = "{\"name\":\"ric1\",\"policyTypes\":[\"type1\"]}";
78 private static final String RIC_1_INFO_INVALID = "{\"name\":\"ric1\",\"policyTypes\":\"type1\"]}";
79 private static final String CLIENT_ERROR_MESSAGE = "Exception: Client returned failure";
81 private static com.google.gson.Gson gson = new GsonBuilder() //
85 PolicyAgentApiImpl apiUnderTest;
87 RestTemplate restTemplateMock;
91 restTemplateMock = mock(RestTemplate.class);
92 apiUnderTest = new PolicyAgentApiImpl(URL_PREFIX, restTemplateMock);
96 public void testGetAllPolicyTypesFailure() {
97 ResponseEntity<String> getAllPolicyTypesResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
98 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
99 .thenReturn(getAllPolicyTypesResp);
101 ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
103 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class);
104 assertNull(returnedResp.getBody());
105 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
109 public void testGetAllPolicyTypesSuccessValidJson() {
110 String policyTypes = Arrays.asList(POLICY_TYPE_1_VALID, POLICY_TYPE_2_VALID).toString();
111 String policyTypesJson = parsePolicyTypesJson(policyTypes);
112 ResponseEntity<String> getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK);
113 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
114 .thenReturn(getAllPolicyTypesResp);
116 ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
118 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class);
119 assertEquals(returnedResp.getBody(), policyTypesJson);
120 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
124 public void testGetAllPolicyTypesSuccessInvalidJson() {
125 String policyTypes = Arrays.asList(POLICY_TYPE_1_INVALID, POLICY_TYPE_2_VALID).toString();
126 ResponseEntity<String> getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK);
127 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
128 .thenReturn(getAllPolicyTypesResp);
130 ResponseEntity<String> returnedResp = apiUnderTest.getAllPolicyTypes();
132 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class);
133 assertTrue(returnedResp.getBody().contains("Exception"));
134 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
138 public void testGetPolicyInstancesForTypeFailure() {
139 ResponseEntity<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
140 Map<String, ?> uriVariables = Map.of("type", POLICY_TYPE_1_ID);
141 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables)))
142 .thenReturn(getPolicyInstancesForTypeResp);
144 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
146 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables);
147 assertNull(returnedResp.getBody());
148 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
152 public void testGetPolicyInstancesForTypeSuccessValidJson() {
153 String policyInstances = Arrays.asList(POLICY_1_VALID).toString();
154 String policyInstancesJson = parsePolicyInstancesJson(policyInstances);
155 ResponseEntity<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK);
156 Map<String, ?> uriVariables = Map.of("type", POLICY_TYPE_1_ID);
157 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables)))
158 .thenReturn(getPolicyInstancesForTypeResp);
160 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
162 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables);
163 assertEquals(returnedResp.getBody(), policyInstancesJson);
164 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
168 public void testGetPolicyInstancesForTypeSuccessInvalidJson() {
169 String policyInstances = Arrays.asList(POLICY_1_INVALID).toString();
170 ResponseEntity<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK);
171 Map<String, ?> uriVariables = Map.of("type", POLICY_TYPE_1_ID);
172 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables)))
173 .thenReturn(getPolicyInstancesForTypeResp);
175 ResponseEntity<String> returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID);
177 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables);
178 assertTrue(returnedResp.getBody().contains("Exception"));
179 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
183 public void testGetPolicyInstance() {
184 ResponseEntity<Object> getPolicyInstanceResp = new ResponseEntity<>(POLICY_1_VALID, HttpStatus.OK);
185 Map<String, ?> uriVariables = Map.of("id", POLICY_1_ID);
186 when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCE), eq(Object.class), eq(uriVariables)))
187 .thenReturn(getPolicyInstanceResp);
189 ResponseEntity<Object> returnedResp = apiUnderTest.getPolicyInstance(POLICY_1_ID);
191 verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCE, Object.class, uriVariables);
192 assertEquals(POLICY_1_VALID, returnedResp.getBody());
193 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
197 public void testPutPolicyFailure() {
198 HttpEntity<Object> jsonHttpEntity = createJsonHttpEntity(POLICY_1_VALID);
199 Map<String, ?> uriVariables = Map.of( //
200 "type", POLICY_TYPE_1_ID, //
201 "instance", POLICY_1_ID, //
203 "service", "dashboard");
204 doThrow(new RestClientException(CLIENT_ERROR_MESSAGE)).when(restTemplateMock)
205 .put(eq(URL_PREFIX + URL_PUT_POLICY), eq(jsonHttpEntity), eq(uriVariables));
207 ResponseEntity<String> returnedResp =
208 apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_1_VALID, RIC_1_ID);
210 verify(restTemplateMock).put(URL_PREFIX + URL_PUT_POLICY, jsonHttpEntity, uriVariables);
211 assertTrue(returnedResp.getBody().contains("Exception"));
212 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
216 public void testPutPolicySuccess() {
217 HttpEntity<Object> jsonHttpEntity = createJsonHttpEntity(POLICY_1_VALID);
218 Map<String, ?> uriVariables = Map.of( //
219 "type", POLICY_TYPE_1_ID, //
220 "instance", POLICY_1_ID, //
222 "service", "dashboard");
224 ResponseEntity<String> returnedResp =
225 apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_1_VALID, RIC_1_ID);
227 verify(restTemplateMock).put(URL_PREFIX + URL_PUT_POLICY, jsonHttpEntity, uriVariables);
228 assertNull(returnedResp.getBody());
229 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
233 public void testDeletePolicyFailure() {
234 Map<String, ?> uriVariables = Map.of("instance", POLICY_1_ID);
235 doThrow(new RestClientException(CLIENT_ERROR_MESSAGE)).when(restTemplateMock)
236 .delete(eq(URL_PREFIX + URL_DELETE_POLICY), eq(uriVariables));
238 ResponseEntity<String> returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID);
240 verify(restTemplateMock).delete(URL_PREFIX + URL_DELETE_POLICY, uriVariables);
241 assertTrue(returnedResp.getBody().contains("Exception"));
242 assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
246 public void testDeletePolicySuccess() {
247 Map<String, ?> uriVariables = Map.of("instance", POLICY_1_ID);
249 ResponseEntity<String> returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID);
251 verify(restTemplateMock).delete(URL_PREFIX + URL_DELETE_POLICY, uriVariables);
252 assertNull(returnedResp.getBody());
253 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
257 public void testGetRicsSupportingTypeValidJson() {
258 String rics = Arrays.asList(RIC_1_INFO_VALID).toString();
259 String ricsJson = parseRicsJson(rics);
260 Map<String, ?> uriVariables = Map.of("typeName", POLICY_TYPE_1_ID);
261 when(restTemplateMock.getForObject(eq(URL_PREFIX + URL_RIC_INFO), eq(String.class), eq(uriVariables)))
264 ResponseEntity<String> returnedResp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID);
266 verify(restTemplateMock).getForObject(URL_PREFIX + URL_RIC_INFO, String.class, uriVariables);
267 assertEquals(returnedResp.getBody(), ricsJson);
268 assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
272 public void testGetRicsSupportingTypeInvalidJson() {
273 String rics = Arrays.asList(RIC_1_INFO_INVALID).toString();
274 Map<String, ?> uriVariables = Map.of("typeName", POLICY_TYPE_1_ID);
275 when(restTemplateMock.getForObject(eq(URL_PREFIX + URL_RIC_INFO), eq(String.class), eq(uriVariables)))
278 ResponseEntity<String> returnedResp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID);
280 verify(restTemplateMock).getForObject(URL_PREFIX + URL_RIC_INFO, String.class, uriVariables);
281 assertTrue(returnedResp.getBody().contains("Exception"));
282 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
285 private String parsePolicyTypesJson(String inputString) {
286 PolicyTypes policyTypes = new PolicyTypes();
287 JsonArray schemas = new JsonParser().parse(inputString).getAsJsonArray();
288 for (JsonElement schema : schemas) {
289 JsonObject schemaObj = schema.getAsJsonObject();
290 policyTypes.add(new PolicyType(schemaObj.get("title").getAsString(), schemaObj.toString()));
292 return gson.toJson(policyTypes);
295 private String parsePolicyInstancesJson(String inputString) {
296 Type listType = new TypeToken<List<ImmutablePolicyInfo>>() {}.getType();
297 List<PolicyInfo> rspParsed = gson.fromJson(inputString, listType);
298 PolicyInstances policyInstances = new PolicyInstances();
299 for (PolicyInfo policy : rspParsed) {
300 policyInstances.add(policy);
302 return gson.toJson(policyInstances);
305 private String parseRicsJson(String inputString) {
306 Type listType = new TypeToken<List<ImmutableRicInfo>>() {}.getType();
307 List<RicInfo> rspParsed = gson.fromJson(inputString, listType);
308 Collection<String> rics = new ArrayList<>(rspParsed.size());
309 for (RicInfo ric : rspParsed) {
310 rics.add(ric.ricName());
312 return gson.toJson(rics);
315 private HttpEntity<Object> createJsonHttpEntity(Object content) {
316 HttpHeaders headers = new HttpHeaders();
317 headers.setContentType(MediaType.APPLICATION_JSON);
318 return new HttpEntity<>(content, headers);