Add unit tests for PolicyAgentApi in dashboard 95/2695/1
authorRehanRaza <muhammad.rehan.raza@est.tech>
Fri, 6 Mar 2020 10:05:36 +0000 (11:05 +0100)
committerRehanRaza <muhammad.rehan.raza@est.tech>
Fri, 6 Mar 2020 10:05:52 +0000 (11:05 +0100)
Change-Id: I248dc88b0d00563a10c1bb3040b3bc795885cbf7
Issue-ID: NONRTRIC-153
Signed-off-by: RehanRaza <muhammad.rehan.raza@est.tech>
dashboard/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/policyagentapi/PolicyAgentApiImpl.java
dashboard/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/policyagentapi/PolicyAgentApiImplTest.java [new file with mode: 0644]

index f01137e..b41c30e 100644 (file)
@@ -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 (file)
index 0000000..9d02ed9
--- /dev/null
@@ -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<String> getAllPolicyTypesResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
+        when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
+            .thenReturn(getAllPolicyTypesResp);
+
+        ResponseEntity<String> 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<String> getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK);
+        when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
+            .thenReturn(getAllPolicyTypesResp);
+
+        ResponseEntity<String> 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<String> getAllPolicyTypesResp = new ResponseEntity<>(policyTypes, HttpStatus.OK);
+        when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_SCHEMAS), eq(String.class)))
+            .thenReturn(getAllPolicyTypesResp);
+
+        ResponseEntity<String> 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<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
+        Map<String, ?> 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<String> 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<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK);
+        Map<String, ?> 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<String> 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<String> getPolicyInstancesForTypeResp = new ResponseEntity<>(policyInstances, HttpStatus.OK);
+        Map<String, ?> 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<String> 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<Object> getPolicyInstanceResp = new ResponseEntity<>(POLICY_1_VALID, HttpStatus.OK);
+        Map<String, ?> uriVariables = Map.of("id", POLICY_1_ID);
+        when(restTemplateMock.getForEntity(eq(URL_PREFIX + URL_POLICY_INSTANCE), eq(Object.class), eq(uriVariables)))
+            .thenReturn(getPolicyInstanceResp);
+
+        ResponseEntity<Object> 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<Object> jsonHttpEntity = createJsonHttpEntity(POLICY_1_VALID);
+        Map<String, ?> 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<String> 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<Object> jsonHttpEntity = createJsonHttpEntity(POLICY_1_VALID);
+        Map<String, ?> uriVariables = Map.of( //
+            "type", POLICY_TYPE_1_ID, //
+            "instance", POLICY_1_ID, //
+            "ric", RIC_1_ID, //
+            "service", "dashboard");
+
+        ResponseEntity<String> 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<String, ?> 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<String> 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<String, ?> uriVariables = Map.of("instance", POLICY_1_ID);
+
+        ResponseEntity<String> 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<String, ?> 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<String> 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<String, ?> 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<String> 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<List<ImmutablePolicyInfo>>() {}.getType();
+        List<PolicyInfo> 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<List<ImmutableRicInfo>>() {}.getType();
+        List<RicInfo> rspParsed = gson.fromJson(inputString, listType);
+        Collection<String> rics = new ArrayList<>(rspParsed.size());
+        for (RicInfo ric : rspParsed) {
+            rics.add(ric.ricName());
+        }
+        return gson.toJson(rics);
+    }
+
+    private HttpEntity<Object> createJsonHttpEntity(Object content) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        return new HttpEntity<>(content, headers);
+    }
+}