X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=vid-app-common%2Fsrc%2Ftest%2Fjava%2Forg%2Fonap%2Fvid%2Fmso%2FMsoBusinessLogicImplTest.java;h=8a821c27a9f137643a46afdc5b6886691b99138c;hb=refs%2Fchanges%2F59%2F75159%2F12;hp=54e924d950b012eee1271b7906b62f5423676034;hpb=af0e76fd35fa13538c7d12a7d3187eac632d3d40;p=vid.git diff --git a/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java b/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java index 54e924d95..8a821c27a 100644 --- a/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java +++ b/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java @@ -1,204 +1,304 @@ +/* + * ============LICENSE_START========================================== + * =================================================================== + * Modifications Copyright (C) 2018 Nokia. All rights reserved. + * =================================================================== + * 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.onap.vid.mso; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import org.mockito.*; +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatcher; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.onap.portalsdk.core.util.SystemProperties; -import org.onap.vid.changeManagement.RequestDetailsWrapper; -import org.onap.vid.controllers.MsoController; +import org.onap.vid.exceptions.GenericUncheckedException; import org.onap.vid.mso.rest.Request; import org.onap.vid.mso.rest.RequestDetails; +import org.onap.vid.mso.rest.RequestDetailsWrapper; import org.onap.vid.properties.Features; +import org.springframework.http.HttpStatus; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; -import org.springframework.test.context.web.WebAppConfiguration; -import org.testng.Assert; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.togglz.core.manager.FeatureManager; import java.io.IOException; -import java.nio.file.Files; +import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.*; -import static org.onap.vid.controllers.MsoController.SVC_INSTANCE_ID; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; import static org.onap.vid.mso.MsoBusinessLogicImpl.validateEndpointPath; @ContextConfiguration(classes = {SystemProperties.class}) -@WebAppConfiguration -public class MsoBusinessLogicImplTest extends AbstractTestNGSpringContextTests { - - private static final String SERVICE_INSTANCE_ID = "1"; - private static final String VNF_INSTANCE_ID = "1"; - private static final String EXPECTED_SCALE_OUT_PATH = "/serviceInstantiation/v7/serviceInstances/1/vnfs/1/vfModules/scaleOut"; - private static final Path PATH_TO_NOT_PROCESSED_SCALE_OUT_REQUEST = Paths.get("src", "test", "resources", "payload_jsons", "scaleOutVfModulePayload.json"); - private static final Path PATH_TO_FINAL_SCALE_OUT_REQUEST = Paths.get("src", "test", "resources", "payload_jsons", "scaleOutVfModulePayloadToMso.json"); - private static final Path PATH_TO_EXPECTED_MSO_MODEL_TYPE_REQ = Paths.get("src", "test", "resources", "payload_jsons", "mso_model_info_sample_response.json"); - private static final Path PATH_TO_EXPECTED_MSO_SCALEOUT_REQ = Paths.get("src", "test", "resources", "payload_jsons", "mso_action_scaleout_sample_response.json"); - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - - @InjectMocks - private MsoBusinessLogicImpl msoBusinessLogic; +@RunWith(SpringJUnit4ClassRunner.class) +public class MsoBusinessLogicImplTest { + + private static final ObjectMapper objectMapper = new ObjectMapper(); @Mock - private FeatureManager featureManagerMock; + private FeatureManager featureManager; @Mock - private MsoInterface msoInterfaceMock; + private MsoInterface msoInterface; + private MsoBusinessLogicImpl msoBusinessLogic; - @BeforeTest - public void initMocks() { + @Before + public void setUp() { MockitoAnnotations.initMocks(this); + msoBusinessLogic = new MsoBusinessLogicImpl(msoInterface, featureManager); + } + + @Test + public void createConfigurationInstance_shouldCallMsoInterface_withCorrectServiceInstanceId() throws Exception { + // given + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String endpointTemplate = String.format("/serviceInstances/v6/%s/configurations", serviceInstanceId); + RequestDetailsWrapper requestDetailsWrapper = createRequestDetails("mso_request_create_configuration.json"); + MsoResponseWrapper expectedResponse = createOkResponse(); + given(msoInterface.createConfigurationInstance(requestDetailsWrapper, endpointTemplate)) + .willReturn(expectedResponse); + + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .createConfigurationInstance(requestDetailsWrapper, serviceInstanceId); + + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse); + } + + private RequestDetailsWrapper createRequestDetails(String bodyFileName) throws Exception { + final URL resource = this.getClass().getResource("/payload_jsons/" + bodyFileName); + RequestDetails requestDetails = objectMapper.readValue(resource, RequestDetails.class); + return new RequestDetailsWrapper(requestDetails); } @Test public void validateEndpointPath_endPointIsNotEmptyAndVaild_returnProperty() { System.setProperty("TestEnv", "123"); String foundEndPoint = validateEndpointPath("TestEnv"); - Assert.assertEquals("123", foundEndPoint); + assertEquals("123", foundEndPoint); } - @Test(expectedExceptions = RuntimeException.class) + @Test public void validateEndpointPath_endPointIsNull_throwRuntimeException() { - validateEndpointPath("NotExists"); + assertThatExceptionOfType(RuntimeException.class) + .isThrownBy(() -> validateEndpointPath("NotExists")); } - @Test(expectedExceptions = RuntimeException.class) + @Test public void validateEndpointPath_endPointIsNotEmptyButDoesntExists_throwRuntimeException() { - System.setProperty("EmptyEndPoint", ""); - validateEndpointPath("EmptyEndPoint"); + String endPoint = "EmptyEndPoint"; + System.setProperty(endPoint, ""); + assertThatExceptionOfType(GenericUncheckedException.class) + .isThrownBy(() -> validateEndpointPath(endPoint)) + .withMessage(endPoint + " env variable is not defined"); } - - //@Test(dataProvider = "unAssignOrDeleteParams") - public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOffOrUnAssignFlagIsFalse(boolean isAssignFlag, String status) { - Mockito.reset(msoInterfaceMock); - String endpoint = validateEndpointPath(isAssignFlag ? MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE : MsoProperties.MSO_REST_API_SVC_INSTANCE); + @Test + public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOffOrUnAssignFlagIsFalse() { + // given + String endpointTemplate = "/serviceInstances/v5/%s"; + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String svcEndpoint = String.format(endpointTemplate, serviceInstanceId); RequestDetails requestDetails = new RequestDetails(); + MsoResponseWrapper expectedResponse = createOkResponse(); + given(msoInterface.deleteSvcInstance(requestDetails, svcEndpoint)).willReturn(expectedResponse); + given(featureManager.isActive(Features.FLAG_UNASSIGN_SERVICE)).willReturn(false); - when(featureManagerMock.isActive(Features.FLAG_UNASSIGN_SERVICE)).thenReturn(isAssignFlag); - - msoBusinessLogic.deleteSvcInstance(requestDetails, "tempId", status); - - verify(msoInterfaceMock).deleteSvcInstance(requestDetails, endpoint + "/tempId"); - } + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .deleteSvcInstance(requestDetails, serviceInstanceId, "unAssignOrDeleteParams"); - @DataProvider - public Object[][] unAssignOrDeleteParams() { - return new Object[][]{ - {Boolean.FALSE, "active"}, - {Boolean.FALSE, "created"}, - {Boolean.TRUE, "Active"}, - {Boolean.TRUE, "unexpected-status"}, - }; + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse); } - //@Test(dataProvider = "unAssignStatus") - public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOnAndUnAssignFlagIsTrue(String status) { - Mockito.reset(msoInterfaceMock); - // in the test Features.FLAG_UNASSIGN_SERVICE is active so the endpoint should be MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE - String endpoint = validateEndpointPath(MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE); + @Test + public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOnAndUnAssignFlagIsTrue() { + // given + String endpointTemplate = "/serviceInstantiation/v5/serviceInstances/%s/unassign"; + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String svcEndpoint = String.format(endpointTemplate, serviceInstanceId); RequestDetails requestDetails = new RequestDetails(); + MsoResponseWrapper expectedResponse = createOkResponse(); + given(msoInterface.unassignSvcInstance(requestDetails, svcEndpoint)).willReturn(expectedResponse); + given(featureManager.isActive(Features.FLAG_UNASSIGN_SERVICE)).willReturn(true); - when(featureManagerMock.isActive(Features.FLAG_UNASSIGN_SERVICE)).thenReturn(true); - - msoBusinessLogic.deleteSvcInstance(requestDetails, "tempId", status); - - verify(msoInterfaceMock).unassignSvcInstance(requestDetails, endpoint + "/tempId/unassign"); - } + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .deleteSvcInstance(requestDetails, serviceInstanceId, "assigned"); - @DataProvider - public Object[][] unAssignStatus() { - return new Object[][]{ - {"Created"}, - {"Pendingdelete"}, - {"pending-Delete"}, - {"Assigned"} - }; + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse); } @Test public void deleteVnf_verifyEndPointPathConstructing() { - String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE); + // when + String endpointTemplate = "/serviceInstances/v5/%s/vnfs/%s"; + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String vnfInstanceId = "testVnfInstanceTempId"; + String vnfEndpoint = String.format(endpointTemplate, serviceInstanceId, vnfInstanceId); RequestDetails requestDetails = new RequestDetails(); + MsoResponseWrapper expectedResponse = createOkResponse(); + given(msoInterface.deleteVnf(requestDetails, vnfEndpoint)).willReturn(expectedResponse); - String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, "serviceInstanceTempId"); + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .deleteVnf(requestDetails, serviceInstanceId, vnfInstanceId); - msoBusinessLogic.deleteVnf(requestDetails, "serviceInstanceTempId", "vnfInstanceTempId"); - verify(msoInterfaceMock).deleteVnf(requestDetails, vnf_endpoint + "/vnfInstanceTempId"); + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse); } @Test public void deleteVfModule_verifyEndPointPathConstructing() { - String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE); + // when + String endpointTemplate = "/serviceInstances/v7/%s/vnfs/%s/vfModules/%s"; + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String vnfInstanceId = "testVnfInstanceTempId"; + String vfModuleId = "testVfModuleId"; + String vnfEndpoint = String.format(endpointTemplate, serviceInstanceId, vnfInstanceId, vfModuleId); RequestDetails requestDetails = new RequestDetails(); - - String vf__modules_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, "serviceInstanceTempId").replaceFirst(MsoController.VNF_INSTANCE_ID, "vnfInstanceTempId"); - - msoBusinessLogic.deleteVfModule(requestDetails, "serviceInstanceTempId", "vnfInstanceTempId", "vfModuleTempId"); - verify(msoInterfaceMock).deleteVfModule(requestDetails, vf__modules_endpoint + "/vfModuleTempId"); + MsoResponseWrapper expectedResponse = createOkResponse(); + given(msoInterface.deleteVfModule(requestDetails, vnfEndpoint)).willReturn(expectedResponse); + + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .deleteVfModule(requestDetails, serviceInstanceId, vnfInstanceId, vfModuleId); + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse); } - @Test public void shouldSendProperScaleOutRequest() throws IOException { - ArgumentCaptor requestDetailsWrapperArgumentCaptor = ArgumentCaptor.forClass(RequestDetailsWrapper.class); - org.onap.vid.changeManagement.RequestDetails requestDetails = getScaleOutRequest(); - RequestDetailsWrapper expectedRequestWrapper = getExpectedRequestWrapper(); + // given + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String vnfInstanceId = "testVnfInstanceTempId"; + String endpointTemplate = "/serviceInstantiation/v7/serviceInstances/%s/vnfs/%s/vfModules/scaleOut"; + String vnfEndpoint = String.format(endpointTemplate, serviceInstanceId, vnfInstanceId); + org.onap.vid.changeManagement.RequestDetails requestDetails = readRequest( + "scaleOutVfModulePayload.json"); + org.onap.vid.changeManagement.RequestDetailsWrapper expectedRequest = readExpectedRequest( + "scaleOutVfModulePayloadToMso.json"); + MsoResponseWrapper expectedMsoResponseWrapper = createOkResponse(); + given( + msoInterface + .scaleOutVFModuleInstance(argThat(new MsoRequestWrapperMatcher(expectedRequest)), + eq(vnfEndpoint))) + .willReturn(expectedMsoResponseWrapper); + + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .scaleOutVfModuleInstance(requestDetails, serviceInstanceId, vnfInstanceId); + + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedMsoResponseWrapper); + } - msoBusinessLogic.scaleOutVfModuleInstance(requestDetails, SERVICE_INSTANCE_ID, VNF_INSTANCE_ID); + private org.onap.vid.changeManagement.RequestDetails readRequest(String requestJsonFilename) throws IOException { + Path path = Paths.get("payload_jsons", requestJsonFilename); + URL url = this.getClass().getClassLoader().getResource(path.toString()); + return objectMapper.readValue(url, org.onap.vid.changeManagement.RequestDetails.class); + } - verify(msoInterfaceMock).scaleOutVFModuleInstance(requestDetailsWrapperArgumentCaptor.capture(), eq(EXPECTED_SCALE_OUT_PATH)); - RequestDetailsWrapper actual = requestDetailsWrapperArgumentCaptor.getAllValues().get(0); + private org.onap.vid.changeManagement.RequestDetailsWrapper readExpectedRequest(String requestJsonFilename) + throws IOException { + Path path = Paths.get("payload_jsons", requestJsonFilename); + URL url = this.getClass().getClassLoader().getResource(path.toString()); + return objectMapper.readValue(url, + new TypeReference>() { + }); + } - assertThat(expectedRequestWrapper.requestDetails).isEqualTo(actual.requestDetails); + private MsoResponseWrapper createOkResponse() { + HttpStatus expectedStatus = HttpStatus.ACCEPTED; + String expectedBody = " \"body\": {\n" + + " \"requestReferences\": {\n" + + " \"instanceId\": \" 123456 \",\n" + + " \"requestId\": \"b6dc9806-b094-42f7-9386-a48de8218ce8\"\n" + + " }"; + MsoResponseWrapper responseWrapper = new MsoResponseWrapper(); + responseWrapper.setEntity(expectedBody); + responseWrapper.setStatus(expectedStatus.value()); + return responseWrapper; } @Test - public void shouldFilterOutOrchestrationRequestsNotAllowedInDashboard() throws IOException { - String vnfModelTypeOrchestrationRequests = getFileContentAsString(PATH_TO_EXPECTED_MSO_MODEL_TYPE_REQ); - String scaleOutActionOrchestrationRequests = getFileContentAsString(PATH_TO_EXPECTED_MSO_SCALEOUT_REQ); + public void shouldFilterOutOrchestrationRequestsNotAllowedInDashboard() throws Exception { + //given + String vnfModelTypeOrchestrationRequests = getFileContentAsString("mso_model_info_sample_response.json"); + String scaleOutActionOrchestrationRequests = getFileContentAsString("mso_action_scaleout_sample_response.json"); MsoResponseWrapper msoResponseWrapperMock = mock(MsoResponseWrapper.class); - when(msoInterfaceMock.getOrchestrationRequestsForDashboard(any(String.class), any(String.class), any(String.class), any(RestObject.class))) - .thenReturn(msoResponseWrapperMock); - when(msoResponseWrapperMock.getEntity()).thenReturn(vnfModelTypeOrchestrationRequests, scaleOutActionOrchestrationRequests); - + given(msoInterface + .getOrchestrationRequest(any(String.class), any(String.class), any(String.class), + any(RestObject.class), anyBoolean())) + .willReturn(msoResponseWrapperMock); + given(msoResponseWrapperMock.getEntity()) + .willReturn(vnfModelTypeOrchestrationRequests, scaleOutActionOrchestrationRequests); + + //when List filteredOrchestrationReqs = msoBusinessLogic.getOrchestrationRequestsForDashboard(); + //then assertThat(filteredOrchestrationReqs).hasSize(3); assertThat(MsoBusinessLogicImpl.DASHBOARD_ALLOWED_TYPES) - .containsAll(filteredOrchestrationReqs - .stream() - .map(el -> el.getRequestType().toUpperCase()) - .collect(Collectors.toList())); - assertThat(filteredOrchestrationReqs + .containsAll(filteredOrchestrationReqs .stream() - .map(org.onap.vid.domain.mso.Request::getRequestScope) - .collect(Collectors.toList())) - .containsOnly("vnf", "vfModule"); + .map(el -> el.getRequestType().toUpperCase()) + .collect(Collectors.toList())); + assertThat(filteredOrchestrationReqs) + .extracting(Request::getRequestScope) + .containsOnly("vnf", "vfModule"); } - - private String getFileContentAsString(Path pathToFile) throws IOException { - return new String(Files.readAllBytes(pathToFile)); + private String getFileContentAsString(String resourceName) throws Exception { + Path path = Paths.get("payload_jsons", resourceName); + URL url = this.getClass().getClassLoader().getResource(path.toString()); + return IOUtils.toString(url.toURI(), "UTF-8"); } - private org.onap.vid.changeManagement.RequestDetails getScaleOutRequest() throws IOException { - return OBJECT_MAPPER.readValue(PATH_TO_NOT_PROCESSED_SCALE_OUT_REQUEST.toFile(), org.onap.vid.changeManagement.RequestDetails.class); - } + private static class MsoRequestWrapperMatcher implements + ArgumentMatcher { + + private final org.onap.vid.changeManagement.RequestDetailsWrapper expectedRequest; + + public MsoRequestWrapperMatcher(org.onap.vid.changeManagement.RequestDetailsWrapper expectedRequest) { + this.expectedRequest = expectedRequest; + } - private RequestDetailsWrapper getExpectedRequestWrapper() throws IOException { - return OBJECT_MAPPER.readValue(PATH_TO_FINAL_SCALE_OUT_REQUEST.toFile(), new TypeReference>() { - }); + @Override + public boolean matches(org.onap.vid.changeManagement.RequestDetailsWrapper argument) { + return expectedRequest.requestDetails.equals(argument.requestDetails); + } } }