From f2c4406acbb8c7ff00535acb1d4bccf067295976 Mon Sep 17 00:00:00 2001 From: RehanRaza Date: Fri, 6 Mar 2020 11:05:36 +0100 Subject: [PATCH] Add unit tests for PolicyAgentApi in dashboard Change-Id: I248dc88b0d00563a10c1bb3040b3bc795885cbf7 Issue-ID: NONRTRIC-153 Signed-off-by: RehanRaza --- .../policyagentapi/PolicyAgentApiImpl.java | 7 +- .../policyagentapi/PolicyAgentApiImplTest.java | 320 +++++++++++++++++++++ 2 files changed, 326 insertions(+), 1 deletion(-) create mode 100644 dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/policyagentapi/PolicyAgentApiImplTest.java diff --git a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/policyagentapi/PolicyAgentApiImpl.java b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/policyagentapi/PolicyAgentApiImpl.java index f01137e8..b41c30e3 100644 --- a/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/policyagentapi/PolicyAgentApiImpl.java +++ b/dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/policyagentapi/PolicyAgentApiImpl.java @@ -55,7 +55,7 @@ import org.springframework.web.client.RestTemplate; public class PolicyAgentApiImpl implements PolicyAgentApi { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - RestTemplate restTemplate = new RestTemplate(); + RestTemplate restTemplate; private static com.google.gson.Gson gson = new GsonBuilder() // .serializeNulls() // @@ -66,8 +66,13 @@ public class PolicyAgentApiImpl implements PolicyAgentApi { @Autowired public PolicyAgentApiImpl( @org.springframework.beans.factory.annotation.Value("${policycontroller.url.prefix}") final String urlPrefix) { + this(urlPrefix, new RestTemplate()); logger.debug("ctor prefix '{}'", urlPrefix); + } + + public PolicyAgentApiImpl(String urlPrefix, RestTemplate restTemplate) { this.urlPrefix = urlPrefix; + this.restTemplate = restTemplate; } private String baseUrl() { diff --git a/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/policyagentapi/PolicyAgentApiImplTest.java b/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/policyagentapi/PolicyAgentApiImplTest.java new file mode 100644 index 00000000..9d02ed9d --- /dev/null +++ b/dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/policyagentapi/PolicyAgentApiImplTest.java @@ -0,0 +1,320 @@ +/*- + * ========================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); + } +} -- 2.16.6