Refactored Delete SchemaSet functionality
[cps.git] / cps-service / src / test / groovy / org / onap / cps / api / impl / E2ENetworkSliceSpec.groovy
index ac4ef27..d18bcf5 100755 (executable)
@@ -1,7 +1,8 @@
-/*-\r
+/*\r
  * ============LICENSE_START=======================================================\r
- *  Copyright (C) 2021 Nordix Foundation. All rights reserved.\r
- *  Modifications Copyright (C) 2021 Bell Canada.\r
+ * Copyright (C) 2021 Nordix Foundation.\r
+ * Modifications Copyright (C) 2021-2022 Bell Canada.\r
+ * Modifications Copyright (C) 2021 Pantheon.tech\r
  * ================================================================================\r
  * Licensed under the Apache License, Version 2.0 (the "License");\r
  * you may not use this file except in compliance with the License.\r
@@ -23,10 +24,11 @@ package org.onap.cps.api.impl
 \r
 import org.onap.cps.TestUtils\r
 import org.onap.cps.api.CpsAdminService\r
+import org.onap.cps.notification.NotificationService\r
 import org.onap.cps.spi.CpsDataPersistenceService\r
 import org.onap.cps.spi.CpsModulePersistenceService\r
 import org.onap.cps.spi.model.Anchor\r
-import org.onap.cps.spi.model.DataNode\r
+import org.onap.cps.utils.YangUtils\r
 import org.onap.cps.yang.YangTextSchemaSourceSetBuilder\r
 import spock.lang.Specification\r
 \r
@@ -34,25 +36,31 @@ class E2ENetworkSliceSpec extends Specification {
     def mockModuleStoreService = Mock(CpsModulePersistenceService)\r
     def mockDataStoreService = Mock(CpsDataPersistenceService)\r
     def mockCpsAdminService = Mock(CpsAdminService)\r
-    def cpsModuleServiceImpl = new CpsModuleServiceImpl()\r
-    def cpsDataServiceImple = new CpsDataServiceImpl()\r
+    def mockNotificationService = Mock(NotificationService)\r
+    def cpsDataServiceImpl = new CpsDataServiceImpl()\r
     def mockYangTextSchemaSourceSetCache = Mock(YangTextSchemaSourceSetCache)\r
+    def cpsModuleServiceImpl = new CpsModuleServiceImpl(mockModuleStoreService,\r
+            mockYangTextSchemaSourceSetCache,mockCpsAdminService )\r
 \r
     def dataspaceName = 'someDataspace'\r
     def anchorName = 'someAnchor'\r
     def schemaSetName = 'someSchemaSet'\r
+    def noTimestamp = null\r
 \r
     def setup() {\r
-        cpsDataServiceImple.cpsDataPersistenceService = mockDataStoreService\r
-        cpsDataServiceImple.cpsAdminService = mockCpsAdminService\r
-        cpsDataServiceImple.yangTextSchemaSourceSetCache = mockYangTextSchemaSourceSetCache\r
-        cpsModuleServiceImpl.yangTextSchemaSourceSetCache = mockYangTextSchemaSourceSetCache\r
-        cpsModuleServiceImpl.cpsModulePersistenceService = mockModuleStoreService\r
+        cpsDataServiceImpl.cpsDataPersistenceService = mockDataStoreService\r
+        cpsDataServiceImpl.cpsAdminService = mockCpsAdminService\r
+        cpsDataServiceImpl.yangTextSchemaSourceSetCache = mockYangTextSchemaSourceSetCache\r
+        cpsDataServiceImpl.notificationService = mockNotificationService\r
     }\r
 \r
     def 'E2E model can be parsed by CPS.'() {\r
         given: 'Valid yang resource as name-to-content map'\r
-            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap('e2e/basic/ietf-inet-types.yang','e2e/basic/ietf-yang-types.yang','e2e/basic/ran-network2020-08-06.yang')\r
+            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
+                    'ietf/ietf-inet-types@2013-07-15.yang',\r
+                    'ietf/ietf-yang-types@2013-07-15.yang',\r
+                    'e2e/basic/ran-network2020-08-06.yang'\r
+            )\r
         when: 'Create schema set method is invoked'\r
             cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
         then: 'Parameters are validated and processing is delegated to persistence service'\r
@@ -84,7 +92,7 @@ class E2ENetworkSliceSpec extends Specification {
                     YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)\r
             mockModuleStoreService.getYangSchemaResources(dataspaceName, schemaSetName) >> schemaContext\r
         when: 'saveData method is invoked'\r
-            cpsDataServiceImple.saveData(dataspaceName, anchorName, jsonData)\r
+            cpsDataServiceImpl.saveData(dataspaceName, anchorName, jsonData, noTimestamp)\r
         then: 'Parameters are validated and processing is delegated to persistence service'\r
             1 * mockDataStoreService.storeDataNode('someDataspace', 'someAnchor', _) >>\r
                     { args -> dataNodeStored = args[2]}\r
@@ -106,7 +114,7 @@ class E2ENetworkSliceSpec extends Specification {
         def dataNodeStored\r
         given: 'valid yang resource as name-to-content map'\r
             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
-                    'e2e/basic/cps-ran-inventory.yang')\r
+                    'e2e/basic/cps-ran-inventory@2021-01-28.yang')\r
             def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext()\r
         and : 'a valid json is provided for the model'\r
             def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-inventory-data.json')\r
@@ -116,30 +124,43 @@ class E2ENetworkSliceSpec extends Specification {
             mockYangTextSchemaSourceSetCache.get('someDataspace', 'someSchemaSet') >> YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)\r
             mockModuleStoreService.getYangSchemaResources('someDataspace', 'someSchemaSet') >> schemaContext\r
         when: 'saveData method is invoked'\r
-            cpsDataServiceImple.saveData('someDataspace', 'someAnchor', jsonData)\r
+            cpsDataServiceImpl.saveData('someDataspace', 'someAnchor', jsonData, noTimestamp)\r
         then: 'parameters are validated and processing is delegated to persistence service'\r
             1 * mockDataStoreService.storeDataNode('someDataspace', 'someAnchor', _) >>\r
                     { args -> dataNodeStored = args[2]}\r
         and: 'the size of the tree is correct'\r
-            def cpsRanInventory = treeToFlatMapByXpath(new HashMap<>(), dataNodeStored)\r
-            assert  cpsRanInventory.size() == 3\r
+            def cpsRanInventory = TestUtils.getFlattenMapByXpath(dataNodeStored)\r
+            assert  cpsRanInventory.size() == 4\r
         and: 'ran-inventory contains the correct child node'\r
             def ranInventory = cpsRanInventory.get('/ran-inventory')\r
-            def sliceProfilesList = cpsRanInventory.get('/ran-inventory/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']')\r
-            def pLMNIdList = cpsRanInventory.get('/ran-inventory/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']')\r
+            def ranSlices = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']')\r
+            def sliceProfilesList = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']')\r
+            def pLMNIdList = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']')\r
             ranInventory.getChildDataNodes().size() == 1\r
-            ranInventory.getChildDataNodes().find( {it.xpath == sliceProfilesList.xpath})\r
+            ranInventory.getChildDataNodes().find( {it.xpath == ranSlices.xpath})\r
+        and: 'ranSlices contains the correct child node'\r
+            ranSlices.getChildDataNodes().size() == 1\r
+            ranSlices.getChildDataNodes().find( {it.xpath == sliceProfilesList.xpath})\r
         and: 'sliceProfilesList contains the correct child node'\r
             sliceProfilesList.getChildDataNodes().size() == 1\r
             sliceProfilesList.getChildDataNodes().find( {it.xpath == pLMNIdList.xpath})\r
-        and: 'pLMNIdList contains the no child nodes'\r
+        and: 'pLMNIdList contains no children'\r
             pLMNIdList.getChildDataNodes().size() == 0\r
+\r
     }\r
 \r
-    def static treeToFlatMapByXpath(Map<String, DataNode> flatMap, DataNode dataNodeTree) {\r
-        flatMap.put(dataNodeTree.getXpath(), dataNodeTree)\r
-        dataNodeTree.getChildDataNodes()\r
-                .forEach(childDataNode -> treeToFlatMapByXpath(flatMap, childDataNode))\r
-        return flatMap\r
+    def 'E2E RAN Schema Model.'(){\r
+        given: 'yang resources'\r
+            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
+                    'ietf/ietf-inet-types@2013-07-15.yang',\r
+                    'ietf/ietf-yang-types@2013-07-15.yang',\r
+                    'e2e/basic/cps-ran-schema-model@2021-05-19.yang'\r
+            )\r
+        and : 'json data'\r
+            def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-schema-model-data-v4.json')\r
+        expect: 'schema context is built with no exception indicating the schema set being valid '\r
+            def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext()\r
+        and: 'data is parsed with no exception indicating the model match'\r
+            YangUtils.parseJsonData(jsonData, schemaContext) != null\r
     }\r
 }\r