Merge "Added API to get all schema sets for a given dataspace."
[cps.git] / cps-ncmp-service / src / test / groovy / org / onap / cps / ncmp / api / impl / NetworkCmProxyDataServiceImplSpec.groovy
index a114b61..578f7f3 100644 (file)
 
 package org.onap.cps.ncmp.api.impl
 
+import com.hazelcast.map.IMap
 import org.onap.cps.ncmp.api.NetworkCmProxyCmHandlerQueryService
 import org.onap.cps.ncmp.api.impl.event.lcm.LcmEventsCmHandleStateHandler
 import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle
+import org.onap.cps.ncmp.api.inventory.CmHandleQueries
 import org.onap.cps.ncmp.api.inventory.CmHandleState
 import org.onap.cps.ncmp.api.inventory.CompositeState
 import org.onap.cps.ncmp.api.inventory.InventoryPersistence
 import org.onap.cps.ncmp.api.inventory.LockReasonCategory
 import org.onap.cps.ncmp.api.inventory.DataStoreSyncState
 import org.onap.cps.ncmp.api.models.CmHandleQueryApiParameters
+import org.onap.cps.ncmp.api.models.CmHandleQueryServiceParameters
 import org.onap.cps.ncmp.api.models.ConditionApiProperties
 import org.onap.cps.ncmp.api.models.DmiPluginRegistration
 import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle
 import org.onap.cps.spi.exceptions.CpsException
-import org.onap.cps.spi.exceptions.DataValidationException
-import org.onap.cps.spi.model.CmHandleQueryServiceParameters
+import org.onap.cps.spi.model.ConditionProperties
 import spock.lang.Shared
-
 import java.util.stream.Collectors
-
-import static org.onap.cps.ncmp.api.impl.operations.DmiOperations.DataStoreEnum.PASSTHROUGH_OPERATIONAL
-import static org.onap.cps.ncmp.api.impl.operations.DmiOperations.DataStoreEnum.PASSTHROUGH_RUNNING
-import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.CREATE
-import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.UPDATE
-
 import org.onap.cps.utils.JsonObjectMapper
 import com.fasterxml.jackson.databind.ObjectMapper
 import org.onap.cps.api.CpsDataService
@@ -56,6 +51,11 @@ import org.springframework.http.HttpStatus
 import org.springframework.http.ResponseEntity
 import spock.lang.Specification
 
+import static org.onap.cps.ncmp.api.impl.operations.DmiOperations.DataStoreEnum.PASSTHROUGH_OPERATIONAL
+import static org.onap.cps.ncmp.api.impl.operations.DmiOperations.DataStoreEnum.PASSTHROUGH_RUNNING
+import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.CREATE
+import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.UPDATE
+
 class NetworkCmProxyDataServiceImplSpec extends Specification {
 
     def mockCpsDataService = Mock(CpsDataService)
@@ -63,9 +63,11 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
     def mockDmiDataOperations = Mock(DmiDataOperations)
     def nullNetworkCmProxyDataServicePropertyHandler = null
     def mockInventoryPersistence = Mock(InventoryPersistence)
+    def mockCmHandleQueries = Mock(CmHandleQueries)
     def mockDmiPluginRegistration = Mock(DmiPluginRegistration)
     def mockCpsCmHandlerQueryService = Mock(NetworkCmProxyCmHandlerQueryService)
     def mockLcmEventsCmHandleStateHandler = Mock(LcmEventsCmHandleStateHandler)
+    def stubModuleSyncStartedOnCmHandles = Stub(IMap<String, Object>)
 
     def NO_TOPIC = null
     def NO_REQUEST_ID = null
@@ -79,9 +81,11 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
             mockDmiDataOperations,
             nullNetworkCmProxyDataServicePropertyHandler,
             mockInventoryPersistence,
+            mockCmHandleQueries,
             mockCpsCmHandlerQueryService,
             mockLcmEventsCmHandleStateHandler,
-            mockCpsDataService)
+            mockCpsDataService,
+            stubModuleSyncStartedOnCmHandles)
 
     def cmHandleXPath = "/dmi-registry/cm-handles[@id='testCmHandle']"
 
@@ -101,17 +105,6 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
                 >> { new ResponseEntity<>(HttpStatus.CREATED) }
     }
 
-    def 'Write resource data for pass-through running from DMI using an invalid id.'() {
-        when: 'write resource data is called'
-            objectUnderTest.writeResourceDataPassThroughRunningForCmHandle('invalid cm handle name',
-                'testResourceId', CREATE,
-                '{some-json}', 'application/json')
-        then: 'exception is thrown'
-            thrown(DataValidationException.class)
-        and: 'DMI is not invoked'
-            0 * mockDmiDataOperations.writeResourceDataPassThroughRunningFromDmi(_, _, _, _, _)
-    }
-
     def 'Get resource data for pass-through operational from DMI.'() {
         given: 'get data node is called'
             mockCpsDataService.getDataNode('NCMP-Admin', 'ncmp-dmi-registry',
@@ -162,15 +155,6 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
             1 * mockInventoryPersistence.getYangResourcesModuleReferences('some-cm-handle')
     }
 
-    def 'Getting Yang Resources with an invalid #scenario.'() {
-        when: 'yang resources is called'
-            objectUnderTest.getYangResourcesModuleReferences('invalid cm handle with spaces')
-        then: 'a data validation exception is thrown'
-            thrown(DataValidationException)
-        and: 'CPS module services is not invoked'
-            0 * mockInventoryPersistence.getYangResourcesModuleReferences(*_)
-    }
-
     def 'Get a cm handle.'() {
         given: 'the system returns a yang modelled cm handle'
             def dmiServiceName = 'some service name'
@@ -199,15 +183,6 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
 
     }
 
-    def 'Get a cm handle with an invalid id.'() {
-        when: 'getting cm handle details for a given cm handle id with an invalid name'
-            objectUnderTest.getNcmpServiceCmHandle('invalid cm handle with spaces')
-        then: 'an exception is thrown'
-            thrown(DataValidationException)
-        and: 'the yang model cm handle retriever is not invoked'
-            0 * mockInventoryPersistence.getYangModelCmHandle(*_)
-    }
-
     def 'Get cm handle public properties'() {
         given: 'a yang modelled cm handle'
             def dmiProperties = [new YangModelCmHandle.Property('prop', 'some DMI property')]
@@ -221,13 +196,21 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
             result == [ 'public prop' : 'some public prop' ]
     }
 
-    def 'Get cm handle public properties with an invalid id.'() {
-        when: 'getting cm handle public properties for a given cm handle id with an invalid name'
-            objectUnderTest.getCmHandlePublicProperties('invalid cm handle with spaces')
-        then: 'an exception is thrown'
-            thrown(DataValidationException)
-        and: 'the yang model cm handle retriever is not invoked'
-            0 * mockInventoryPersistence.getYangModelCmHandle(*_)
+    def 'Execute cm handle id search for inventory'() {
+        given: 'a ConditionApiProperties object'
+            def conditionProperties = new ConditionProperties()
+            conditionProperties.conditionName = 'hasAllProperties'
+            conditionProperties.conditionParameters = [ [ 'some-key' : 'some-value' ] ]
+            def conditionServiceProps = new CmHandleQueryServiceParameters()
+            conditionServiceProps.cmHandleQueryParameters = [conditionProperties] as List<ConditionProperties>
+        and: 'the system returns an set of cmHandle ids'
+            mockCpsCmHandlerQueryService.queryCmHandleIdsForInventory(*_) >> [ 'cmHandle1', 'cmHandle2' ]
+        when: 'getting cm handle id set for a given dmi property'
+            def result = objectUnderTest.executeCmHandleIdSearchForInventory(conditionServiceProps)
+        then: 'the result returns the correct 2 elements'
+            assert result.size() == 2
+            assert result.contains('cmHandle1')
+            assert result.contains('cmHandle2')
     }
 
     def 'Get cm handle composite state'() {
@@ -248,15 +231,6 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
             result == compositeState
     }
 
-    def 'Get cm handle composite state with an invalid id.'() {
-        when: 'getting cm handle composite state for a given cm handle id with an invalid name'
-            objectUnderTest.getCmHandleCompositeState('invalid cm handle with spaces')
-        then: 'an exception is thrown'
-            thrown(DataValidationException)
-        and: 'the yang model cm handle retriever is not invoked'
-            0 * mockInventoryPersistence.getYangModelCmHandle(_)
-    }
-
     def 'Update resource data for pass-through running from dmi using POST #scenario DMI properties.'() {
         given: 'cpsDataService returns valid datanode'
             mockCpsDataService.getDataNode('NCMP-Admin', 'ncmp-dmi-registry',
@@ -274,17 +248,20 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
     def 'Verify modules and create anchor params'() {
         given: 'dmi plugin registration return created cm handles'
             def dmiPluginRegistration = new DmiPluginRegistration(dmiPlugin: 'service1', dmiModelPlugin: 'service1',
-                dmiDataPlugin: 'service2')
+                    dmiDataPlugin: 'service2')
             dmiPluginRegistration.createdCmHandles = [ncmpServiceCmHandle]
             mockDmiPluginRegistration.getCreatedCmHandles() >> [ncmpServiceCmHandle]
         when: 'parse and create cm handle in dmi registration then sync module'
             objectUnderTest.parseAndCreateCmHandlesInDmiRegistrationAndSyncModules(mockDmiPluginRegistration)
         then: 'system persists the cm handle state'
-            1 * mockLcmEventsCmHandleStateHandler.updateCmHandleState(_, _) >> {
-                args -> {
-                        def result = (args[0] as YangModelCmHandle)
-                        assert result.id == 'test-cm-handle-id'
-                        assert CmHandleState.ADVISED == (args[1] as CmHandleState)
+            1 * mockLcmEventsCmHandleStateHandler.updateCmHandleStateBatch(_) >> {
+                args ->
+                    {
+                        def cmHandleStatePerCmHandle = (args[0] as Map)
+                        cmHandleStatePerCmHandle.each {
+                            assert (it.key.id == 'test-cm-handle-id'
+                                    && it.value == CmHandleState.ADVISED)
+                        }
                     }
             }
     }
@@ -370,6 +347,19 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
             0 * mockInventoryPersistence.saveCmHandleState(_, _)
     }
 
+    def 'Get all cm handle IDs by DMI plugin identifier.' () {
+        given: 'cm handle queries service returns cm handles'
+            1 * mockCmHandleQueries.getCmHandlesByDmiPluginIdentifier('some-dmi-plugin-identifier')
+                    >> [new NcmpServiceCmHandle(cmHandleId: 'cm-handle-1'),
+                        new NcmpServiceCmHandle(cmHandleId: 'cm-handle-2')]
+        when: 'cm handle Ids are requested with dmi plugin identifier'
+            def result = objectUnderTest.getAllCmHandleIdsByDmiPluginIdentifier('some-dmi-plugin-identifier')
+        then: 'the result size is correct'
+            assert result.size() == 2
+        and: 'the result returns the correct details'
+            assert result.containsAll('cm-handle-1','cm-handle-2')
+    }
+
     def dataStores() {
         CompositeState.DataStores.builder()
             .operationalDataStore(CompositeState.Operational.builder()