X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=cps-ncmp-service%2Fsrc%2Ftest%2Fgroovy%2Forg%2Fonap%2Fcps%2Fncmp%2Fapi%2Fimpl%2FNetworkCmProxyDataServicePropertyHandlerSpec.groovy;h=f94c34c58980fa54621c8ecfb954dcee409f966c;hb=974437413c9053cbb28c2bdeaf7ec48e92818f02;hp=610400f75bdede7131fe91dd06ac08b38b736558;hpb=7bacf478fc69fb97d2abf29c4678552f58575b74;p=cps.git diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy index 610400f75..f94c34c58 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2022-2023 Nordix Foundation + * Copyright (C) 2022-2024 Nordix Foundation * Modifications Copyright (C) 2022 Bell Canada * Modifications Copyright (C) 2023 TechMahindra Ltd. * ================================================================================ @@ -22,15 +22,21 @@ package org.onap.cps.ncmp.api.impl + +import com.fasterxml.jackson.databind.ObjectMapper +import org.onap.cps.ncmp.api.impl.utils.CmHandleIdMapper + import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DATASPACE_NAME import static org.onap.cps.ncmp.api.impl.ncmppersistence.NcmpPersistence.NCMP_DMI_REGISTRY_ANCHOR +import static org.onap.cps.ncmp.api.NcmpResponseStatus.CM_HANDLES_NOT_FOUND +import static org.onap.cps.ncmp.api.NcmpResponseStatus.CM_HANDLE_INVALID_ID +import static org.onap.cps.ncmp.api.NcmpResponseStatus.UNKNOWN_ERROR +import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.Status +import org.onap.cps.api.CpsDataService +import org.onap.cps.utils.JsonObjectMapper import org.onap.cps.ncmp.api.impl.inventory.InventoryPersistence import org.onap.cps.spi.exceptions.DataValidationException -import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_DOES_NOT_EXIST -import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_INVALID_ID -import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.UNKNOWN_ERROR -import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.Status import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle import org.onap.cps.spi.exceptions.DataNodeNotFoundException import org.onap.cps.spi.model.DataNode @@ -40,8 +46,11 @@ import spock.lang.Specification class NetworkCmProxyDataServicePropertyHandlerSpec extends Specification { def mockInventoryPersistence = Mock(InventoryPersistence) + def mockCpsDataService = Mock(CpsDataService) + def jsonObjectMapper = new JsonObjectMapper(new ObjectMapper()) + def mockCmHandleIdMapper = Mock(CmHandleIdMapper) - def objectUnderTest = new NetworkCmProxyDataServicePropertyHandler(mockInventoryPersistence) + def objectUnderTest = new NetworkCmProxyDataServicePropertyHandler(mockInventoryPersistence, mockCpsDataService, jsonObjectMapper, mockCmHandleIdMapper) def static cmHandleId = 'myHandle1' def static cmHandleXpath = "/dmi-registry/cm-handles[@id='${cmHandleId}']" @@ -131,14 +140,14 @@ class NetworkCmProxyDataServicePropertyHandlerSpec extends Specification { with(response.get(0)) { assert it.status == Status.FAILURE assert it.cmHandle == cmHandleId - assert it.registrationError == expectedError + assert it.ncmpResponseStatus == expectedError assert it.errorText == expectedErrorText } where: - scenario | cmHandleId | exception || expectedError | expectedErrorText - 'Cm Handle does not exist' | 'cmHandleId' | new DataNodeNotFoundException(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR) || CM_HANDLE_DOES_NOT_EXIST | 'cm-handle does not exist' - 'Unknown' | 'cmHandleId' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed' - 'Invalid cm handle id' | 'cmHandleId with spaces' | new DataValidationException('Name Validation Error.', cmHandleId + 'contains an invalid character') || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id' + scenario | cmHandleId | exception || expectedError | expectedErrorText + 'Cm Handle does not exist' | 'cmHandleId' | new DataNodeNotFoundException(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR) || CM_HANDLES_NOT_FOUND | 'cm handle id(s) not found' + 'Unknown' | 'cmHandleId' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed' + 'Invalid cm handle id' | 'cmHandleId with spaces' | new DataValidationException('Name Validation Error.', cmHandleId + 'contains an invalid character') || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id' } def 'Multiple update operations in a single request'() { @@ -166,13 +175,50 @@ class NetworkCmProxyDataServicePropertyHandlerSpec extends Specification { with(cmHandleResponseList.get(1)) { assert it.status == Status.FAILURE assert it.cmHandle == cmHandleId - assert it.registrationError == CM_HANDLE_DOES_NOT_EXIST - assert it.errorText == "cm-handle does not exist" + assert it.ncmpResponseStatus == CM_HANDLES_NOT_FOUND + assert it.errorText == 'cm handle id(s) not found' } then: 'the replace list method is called twice' 2 * mockInventoryPersistence.replaceListContent(cmHandleXpath,_) } + def 'Update CM Handle Alternate ID with #scenario'() { + given: 'an existing cm handle' + DataNode existingCmHandleDataNode = new DataNode(xpath: cmHandleXpath) + and: 'an update request with an alternate id' + def ncmpServiceCmHandle = new NcmpServiceCmHandle(cmHandleId: cmHandleId, alternateId: 'alt-1' ) + when: 'update alternate id method is called with the update request' + objectUnderTest.updateAlternateId(existingCmHandleDataNode, ncmpServiceCmHandle) + then: 'the update node leaves method is invoked as many times as expected' + callsToDataService * mockCpsDataService.updateNodeLeaves('NCMP-Admin', 'ncmp-dmi-registry', '/dmi-registry', _, _) >> + { args -> + assert args[3].contains('alt-1') + } + mockCmHandleIdMapper.addMapping(cmHandleId, 'alt-1') >> isNewMapping + where: 'following updates are attempted' + scenario | isNewMapping || callsToDataService + 'new alternate id ' | true || 1 + 'existing alternate id' | false || 0 + } + + def 'Alternate ID removed from cache when persisting fails.'() { + given: 'an existing data node and an update request with an alternate id' + def ncmpServiceCmHandle = new NcmpServiceCmHandle(cmHandleId: cmHandleId, alternateId: 'alt-1') + DataNode existingCmHandleDataNode = new DataNode(xpath: cmHandleXpath, leaves: ['alternate-id': null]) + and: 'a new mapping is added' + mockCmHandleIdMapper.addMapping(cmHandleId, 'alt-1') >> true + and: 'but an exception occurs while saving' + def originalException = new NullPointerException('some exception') + mockCpsDataService.updateNodeLeaves(*_) >> { throw originalException } + when: 'updating of alternate id called' + objectUnderTest.updateAlternateId(existingCmHandleDataNode, ncmpServiceCmHandle) + then: 'the original exception is thrown up' + def thrownException = thrown(NullPointerException) + assert thrownException == originalException + and: 'the mapping is removed from the cache' + 1 * mockCmHandleIdMapper.removeMapping(cmHandleId) + } + def convertToProperties(expectedPropertiesAfterUpdateAsMap) { def properties = [].withDefault { [:] } expectedPropertiesAfterUpdateAsMap.forEach(property -> @@ -181,5 +227,4 @@ class NetworkCmProxyDataServicePropertyHandlerSpec extends Specification { })) return properties } - }