/*- * ========================LICENSE_START================================= * O-RAN-SC * %% * Copyright (C) 2020 Nordix Foundation * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================LICENSE_END=================================== */ package org.oransc.ric.portal.dashboard.policyagentapi; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.oransc.ric.portal.dashboard.model.ImmutablePolicyInfo; import org.oransc.ric.portal.dashboard.model.PolicyInfo; import org.oransc.ric.portal.dashboard.model.PolicyInstances; import org.oransc.ric.portal.dashboard.model.PolicyType; import org.oransc.ric.portal.dashboard.model.PolicyTypes; import org.oransc.ric.portal.dashboard.policyagentapi.PolicyAgentApiImpl.RicInfo; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; public class PolicyAgentApiImplTest { private static final String URL_PREFIX = "UrlPrefix"; private static final String URL_POLICY_SCHEMAS = "/policy_schemas"; private static final String URL_POLICY_INSTANCES = "/policies?type={type}"; private static final String URL_POLICY_INSTANCE = "/policy?instance={id}"; private static final String URL_PUT_POLICY = "/policy?type={type}&instance={instance}&ric={ric}&service={service}"; private static final String URL_DELETE_POLICY = "/policy?instance={instance}"; private static final String URL_RIC_INFO = "/rics?policyType={typeName}"; private static final String POLICY_TYPE_1_ID = "type1"; private static final String POLICY_TYPE_1_VALID = "{\"title\":\"type1\"}"; private static final String POLICY_TYPE_1_INVALID = "\"title\":\"type1\"}"; private static final String POLICY_TYPE_2_VALID = "{\"title\":\"type2\"}"; private static final String POLICY_1_ID = "policy1"; private static final String POLICY_1_VALID = "{\"policyId\":\"policy1\"}"; private static final String POLICY_1_INVALID = "\"policyId\":\"policy1\"}"; private static final String RIC_1_ID = "ric1"; private static final String RIC_1_INFO_VALID = "{\"name\":\"ric1\",\"policyTypes\":[\"type1\"]}"; private static final String RIC_1_INFO_INVALID = "{\"name\":\"ric1\",\"policyTypes\":\"type1\"]}"; private static final String CLIENT_ERROR_MESSAGE = "Exception: Client returned failure"; private static com.google.gson.Gson gson = new GsonBuilder() // .serializeNulls() // .create(); // PolicyAgentApiImpl apiUnderTest; RestTemplate restTemplateMock; @BeforeEach public void init() { restTemplateMock = mock(RestTemplate.class); apiUnderTest = new PolicyAgentApiImpl(URL_PREFIX, restTemplateMock); } @Test public void testGetAllPolicyTypesFailure() { ResponseEntity getAllPolicyTypesResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND); when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class))) .thenReturn(getAllPolicyTypesResp); ResponseEntity returnedResp = apiUnderTest.getAllPolicyTypes(); verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class); assertNull(returnedResp.getBody()); assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode()); } @Test public void testGetAllPolicyTypesSuccessValidJson() { String policyTypes = Arrays.asList(POLICY_TYPE_1_VALID, POLICY_TYPE_2_VALID).toString(); String policyTypesJson = parsePolicyTypesJson(policyTypes); ResponseEntity getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK); when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class))) .thenReturn(getAllPolicyTypesResp); ResponseEntity returnedResp = apiUnderTest.getAllPolicyTypes(); verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class); assertEquals(returnedResp.getBody(), policyTypesJson); assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); } @Test public void testGetAllPolicyTypesSuccessInvalidJson() { String policyTypes = Arrays.asList(POLICY_TYPE_1_INVALID, POLICY_TYPE_2_VALID).toString(); ResponseEntity getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK); when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class))) .thenReturn(getAllPolicyTypesResp); ResponseEntity returnedResp = apiUnderTest.getAllPolicyTypes(); verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_SCHEMAS, String.class); assertTrue(returnedResp.getBody().contains("Exception")); assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode()); } @Test public void testGetPolicyInstancesForTypeFailure() { ResponseEntity getPolicyInstancesForTypeResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND); Map uriVariables = Map.of("type", POLICY_TYPE_1_ID); when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables))) .thenReturn(getPolicyInstancesForTypeResp); ResponseEntity returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID); verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables); assertNull(returnedResp.getBody()); assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode()); } @Test public void testGetPolicyInstancesForTypeSuccessValidJson() { String policyInstances = Arrays.asList(POLICY_1_VALID).toString(); String policyInstancesJson = parsePolicyInstancesJson(policyInstances); ResponseEntity getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK); Map uriVariables = Map.of("type", POLICY_TYPE_1_ID); when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables))) .thenReturn(getPolicyInstancesForTypeResp); ResponseEntity returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID); verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables); assertEquals(returnedResp.getBody(), policyInstancesJson); assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); } @Test public void testGetPolicyInstancesForTypeSuccessInvalidJson() { String policyInstances = Arrays.asList(POLICY_1_INVALID).toString(); ResponseEntity getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK); Map uriVariables = Map.of("type", POLICY_TYPE_1_ID); when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCES), eq(String.class), eq(uriVariables))) .thenReturn(getPolicyInstancesForTypeResp); ResponseEntity returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID); verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCES, String.class, uriVariables); assertTrue(returnedResp.getBody().contains("Exception")); assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode()); } @Test public void testGetPolicyInstance() { ResponseEntity getPolicyInstanceResp = new ResponseEntity<>(POLICY_1_VALID, HttpStatus.OK); Map uriVariables = Map.of("id", POLICY_1_ID); when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCE), eq(Object.class), eq(uriVariables))) .thenReturn(getPolicyInstanceResp); ResponseEntity returnedResp = apiUnderTest.getPolicyInstance(POLICY_1_ID); verify(restTemplateMock).getForEntity(URL_PREFIX + URL_POLICY_INSTANCE, Object.class, uriVariables); assertEquals(POLICY_1_VALID, returnedResp.getBody()); assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); } @Test public void testPutPolicyFailure() { HttpEntity jsonHttpEntity = createJsonHttpEntity(POLICY_1_VALID); Map uriVariables = Map.of( // "type", POLICY_TYPE_1_ID, // "instance", POLICY_1_ID, // "ric", RIC_1_ID, // "service", "dashboard"); doThrow(new RestClientException(CLIENT_ERROR_MESSAGE)).when(restTemplateMock) .put(eq(URL_PREFIX + URL_PUT_POLICY), eq(jsonHttpEntity), eq(uriVariables)); ResponseEntity returnedResp = apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_1_VALID, RIC_1_ID); verify(restTemplateMock).put(URL_PREFIX + URL_PUT_POLICY, jsonHttpEntity, uriVariables); assertTrue(returnedResp.getBody().contains("Exception")); assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode()); } @Test public void testPutPolicySuccess() { HttpEntity jsonHttpEntity = createJsonHttpEntity(POLICY_1_VALID); Map uriVariables = Map.of( // "type", POLICY_TYPE_1_ID, // "instance", POLICY_1_ID, // "ric", RIC_1_ID, // "service", "dashboard"); ResponseEntity returnedResp = apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_1_VALID, RIC_1_ID); verify(restTemplateMock).put(URL_PREFIX + URL_PUT_POLICY, jsonHttpEntity, uriVariables); assertNull(returnedResp.getBody()); assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); } @Test public void testDeletePolicyFailure() { Map uriVariables = Map.of("instance", POLICY_1_ID); doThrow(new RestClientException(CLIENT_ERROR_MESSAGE)).when(restTemplateMock) .delete(eq(URL_PREFIX + URL_DELETE_POLICY), eq(uriVariables)); ResponseEntity returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID); verify(restTemplateMock).delete(URL_PREFIX + URL_DELETE_POLICY, uriVariables); assertTrue(returnedResp.getBody().contains("Exception")); assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode()); } @Test public void testDeletePolicySuccess() { Map uriVariables = Map.of("instance", POLICY_1_ID); ResponseEntity returnedResp = apiUnderTest.deletePolicy(POLICY_1_ID); verify(restTemplateMock).delete(URL_PREFIX + URL_DELETE_POLICY, uriVariables); assertNull(returnedResp.getBody()); assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); } @Test public void testGetRicsSupportingTypeValidJson() { String rics = Arrays.asList(RIC_1_INFO_VALID).toString(); String ricsJson = parseRicsJson(rics); Map uriVariables = Map.of("typeName", POLICY_TYPE_1_ID); when(restTemplateMock.getForObject(eq(URL_PREFIX + URL_RIC_INFO), eq(String.class), eq(uriVariables))) .thenReturn(rics); ResponseEntity returnedResp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID); verify(restTemplateMock).getForObject(URL_PREFIX + URL_RIC_INFO, String.class, uriVariables); assertEquals(returnedResp.getBody(), ricsJson); assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); } @Test public void testGetRicsSupportingTypeInvalidJson() { String rics = Arrays.asList(RIC_1_INFO_INVALID).toString(); Map uriVariables = Map.of("typeName", POLICY_TYPE_1_ID); when(restTemplateMock.getForObject(eq(URL_PREFIX + URL_RIC_INFO), eq(String.class), eq(uriVariables))) .thenReturn(rics); ResponseEntity returnedResp = apiUnderTest.getRicsSupportingType(POLICY_TYPE_1_ID); verify(restTemplateMock).getForObject(URL_PREFIX + URL_RIC_INFO, String.class, uriVariables); assertTrue(returnedResp.getBody().contains("Exception")); assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode()); } private String parsePolicyTypesJson(String inputString) { PolicyTypes policyTypes = new PolicyTypes(); JsonArray schemas = new JsonParser().parse(inputString).getAsJsonArray(); for (JsonElement schema : schemas) { JsonObject schemaObj = schema.getAsJsonObject(); policyTypes.add(new PolicyType(schemaObj.get("title").getAsString(), schemaObj.toString())); } return gson.toJson(policyTypes); } private String parsePolicyInstancesJson(String inputString) { Type listType = new TypeToken>() {}.getType(); List rspParsed = gson.fromJson(inputString, listType); PolicyInstances policyInstances = new PolicyInstances(); for (PolicyInfo policy : rspParsed) { policyInstances.add(policy); } return gson.toJson(policyInstances); } private String parseRicsJson(String inputString) { Type listType = new TypeToken>() {}.getType(); List rspParsed = gson.fromJson(inputString, listType); Collection rics = new ArrayList<>(rspParsed.size()); for (RicInfo ric : rspParsed) { rics.add(ric.ricName()); } return gson.toJson(rics); } private HttpEntity createJsonHttpEntity(Object content) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return new HttpEntity<>(content, headers); } }