From 5427ef054effb1aadfaaab300282545c99c37a61 Mon Sep 17 00:00:00 2001
From: Renu Kumari <renu.kumari@bell.ca>
Date: Thu, 20 Jan 2022 12:07:38 -0500
Subject: Refactored Delete SchemaSet functionality

- Added get anchors by schemaset in cpsAdminService
- Changed DeleteSchemaSet functionality
    - Use CPSAdminService to getAnchors associated with schemaset
    - Use CPSAdminService to delete Anchors
    - Moved Cascade allowed validation into Service from Persistence

Issue-ID: CPS-791
Signed-off-by: Renu Kumari <renu.kumari@bell.ca>
Change-Id: Ife7644551183cb8c3eb686a654b0a43a427ac1e5
---
 .../spi/impl/CpsAdminPersistenceServiceSpec.groovy | 43 +++++++++++++++----
 ...sModulePersistenceServiceIntegrationSpec.groovy | 49 ++++++++--------------
 2 files changed, 52 insertions(+), 40 deletions(-)

(limited to 'cps-ri/src/test/groovy/org')

diff --git a/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsAdminPersistenceServiceSpec.groovy b/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsAdminPersistenceServiceSpec.groovy
index 4b5b116f48..2218014ec1 100644
--- a/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsAdminPersistenceServiceSpec.groovy
+++ b/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsAdminPersistenceServiceSpec.groovy
@@ -2,6 +2,7 @@
  *  ============LICENSE_START=======================================================
  *  Copyright (C) 2021 Nordix Foundation
  *  Modifications Copyright (C) 2021 Pantheon.tech
+ *  Modifications Copyright (C) 2022 Bell Canada
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -39,7 +40,7 @@ class CpsAdminPersistenceServiceSpec extends CpsPersistenceSpecBase {
 
     static final String SET_DATA = '/data/anchor.sql'
     static final String SAMPLE_DATA_FOR_ANCHORS_WITH_MODULES = '/data/anchors-schemaset-modules.sql'
-    static final String DATASPACE_WITH_NO_DATA = 'DATASPACE-002'
+    static final String DATASPACE_WITH_NO_DATA = 'DATASPACE-002-NO-DATA'
     static final Integer DELETED_ANCHOR_ID = 3001
     static final Long DELETED_FRAGMENT_ID = 4001
 
@@ -108,12 +109,36 @@ class CpsAdminPersistenceServiceSpec extends CpsPersistenceSpecBase {
             result.size() == expectedAnchors.size()
             result.containsAll(expectedAnchors)
         where: 'the following data is used'
-            dataspaceName        || expectedAnchors
-            DATASPACE_NAME       || [Anchor.builder().name(ANCHOR_NAME1).schemaSetName(SCHEMA_SET_NAME1).dataspaceName(DATASPACE_NAME).build(),
-                                     Anchor.builder().name(ANCHOR_NAME2).schemaSetName(SCHEMA_SET_NAME2).dataspaceName(DATASPACE_NAME).build()]
+            dataspaceName          || expectedAnchors
+            DATASPACE_NAME         || [Anchor.builder().name(ANCHOR_NAME1).schemaSetName(SCHEMA_SET_NAME1).dataspaceName(DATASPACE_NAME).build(),
+                                       Anchor.builder().name(ANCHOR_NAME2).schemaSetName(SCHEMA_SET_NAME2).dataspaceName(DATASPACE_NAME).build()]
             DATASPACE_WITH_NO_DATA || []
     }
 
+    @Sql([CLEAR_DATA, SET_DATA])
+    def 'Get all anchors associated with schemaset in a dataspace.'() {
+        when: 'anchors are retrieved by dataspace and schema-set'
+            def anchors = objectUnderTest.getAnchors(dataspace, schemasetName)
+        then: ' the response contains expected anchors'
+            anchors == expectedAnchors
+        where:
+            scenario     | dataspace       | schemasetName               || expectedAnchors
+            'no-anchors' | 'DATASPACE-003' | 'SCHEMA-SET-002-NO-ANCHORS' || Collections.emptySet()
+            'one-anchor' | 'DATASPACE-001' | 'SCHEMA-SET-001'            || Set.of(new Anchor('ANCHOR-001', 'DATASPACE-001', 'SCHEMA-SET-001'))
+    }
+
+    @Sql([CLEAR_DATA, SET_DATA])
+    def 'Error Handling: Get all anchors associated with schemaset in a dataspace.'() {
+        when: 'anchors are retrieved by dataspace and schema-set'
+            def anchors = objectUnderTest.getAnchors(dataspace, schemasetName)
+        then: ' an expected expception is thrown'
+            thrown(expectedException)
+        where:
+            scenario            | dataspace       | schemasetName               || expectedException
+            'unknown-dataspace' | 'unknown'       | 'SCHEMA-SET-002-NO-ANCHORS' || DataspaceNotFoundException
+            'unknown-schemaset' | 'DATASPACE-001' | 'unknown-schema-set'        || SchemaSetNotFoundException
+    }
+
     @Sql(CLEAR_DATA)
     def 'Get all anchors in unknown dataspace.'() {
         when: 'attempt to get all anchors in an unknown dataspace'
@@ -132,7 +157,7 @@ class CpsAdminPersistenceServiceSpec extends CpsPersistenceSpecBase {
     }
 
     @Sql([CLEAR_DATA, SET_DATA])
-    def 'delete anchor error scenario: #scenario'(){
+    def 'delete anchor error scenario: #scenario'() {
         when: 'delete anchor attempt is performed'
             objectUnderTest.deleteAnchor(dataspaceName, anchorName)
         then: 'an #expectedException is thrown'
@@ -190,10 +215,10 @@ class CpsAdminPersistenceServiceSpec extends CpsPersistenceSpecBase {
             def thrownException = thrown(expectedException)
             thrownException.details.contains(expectedMessageDetails)
         where: 'the following data is used'
-            scenario                          | dataspaceName       || expectedException            | expectedMessageDetails
-            'dataspace name does not exist'   | 'unknown'           || DataspaceNotFoundException   | 'unknown does not exist'
-            'dataspace contains an anchor'    | 'DATASPACE-001'     || DataspaceInUseException      | 'contains 2 anchor(s)'
-            'dataspace contains schemasets'   | 'DATASPACE-003'     || DataspaceInUseException      | 'contains 1 schemaset(s)'
+            scenario                        | dataspaceName   || expectedException          | expectedMessageDetails
+            'dataspace name does not exist' | 'unknown'       || DataspaceNotFoundException | 'unknown does not exist'
+            'dataspace contains an anchor'  | 'DATASPACE-001' || DataspaceInUseException    | 'contains 2 anchor(s)'
+            'dataspace contains schemasets' | 'DATASPACE-003' || DataspaceInUseException    | 'contains 1 schemaset(s)'
     }
 
 }
diff --git a/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsModulePersistenceServiceIntegrationSpec.groovy b/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsModulePersistenceServiceIntegrationSpec.groovy
index a223e7135f..75d6330265 100644
--- a/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsModulePersistenceServiceIntegrationSpec.groovy
+++ b/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsModulePersistenceServiceIntegrationSpec.groovy
@@ -1,7 +1,7 @@
 /*
  *  ============LICENSE_START=======================================================
  *  Copyright (C) 2021 Nordix Foundation
- *  Modifications Copyright (C) 2021 Bell Canada.
+ *  Modifications Copyright (C) 2021-2022 Bell Canada.
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the 'License');
  *  you may not use this file except in compliance with the License.
@@ -176,50 +176,37 @@ class CpsModulePersistenceServiceIntegrationSpec extends CpsPersistenceSpecBase
     }
 
     @Sql([CLEAR_DATA, SET_DATA])
-    def 'Delete schema set with cascade delete prohibited but no anchors using it'() {
+    def 'Delete schema set'() {
         when: 'a schema set is deleted with cascade-prohibited option'
-            objectUnderTest.deleteSchemaSet(DATASPACE_NAME, SCHEMA_SET_NAME_NO_ANCHORS,
-                    CASCADE_DELETE_PROHIBITED)
+            objectUnderTest.deleteSchemaSet(DATASPACE_NAME, SCHEMA_SET_NAME_NO_ANCHORS)
         then: 'the schema set has been deleted'
             schemaSetRepository.findByDataspaceAndName(dataspaceEntity, SCHEMA_SET_NAME_NO_ANCHORS).isPresent() == false
-        and: 'any orphaned (not used by any schema set anymore) yang resources are deleted'
-            def orphanedResourceId = 3100L
-            yangResourceRepository.findById(orphanedResourceId).isPresent() == false
-        and: 'any shared (still in use by other schema set) yang resources still persists'
-            def sharedResourceId = 3003L
-            yangResourceRepository.findById(sharedResourceId).isPresent()
-    }
-
-    @Sql([CLEAR_DATA, SET_DATA])
-    def 'Delete schema set with cascade allowed.'() {
-        when: 'a schema set is deleted with cascade-allowed option'
-            objectUnderTest.deleteSchemaSet(DATASPACE_NAME, SCHEMA_SET_NAME_WITH_ANCHORS_AND_DATA,
-                    CASCADE_DELETE_ALLOWED)
-        then: 'the schema set has been deleted'
-            schemaSetRepository
-                    .findByDataspaceAndName(dataspaceEntity, SCHEMA_SET_NAME_WITH_ANCHORS_AND_DATA).isPresent() == false
-        and: 'the associated anchors are removed'
-            def associatedAnchorsIds = [ 6001, 6002 ]
-            associatedAnchorsIds.each {anchorRepository.findById(it).isPresent() == false }
-        and: 'the fragment(s) under those anchors are removed'
-            def fragmentUnderAnchor1Id = 7001L
-            fragmentRepository.findById(fragmentUnderAnchor1Id).isPresent() == false
-        and: 'the shared resources still persist'
-            def sharedResourceIds = [ 3003L, 3004L ]
-            sharedResourceIds.each {yangResourceRepository.findById(it).isPresent() }
     }
 
     @Sql([CLEAR_DATA, SET_DATA])
     def 'Delete schema set error scenario: #scenario.'() {
         when: 'attempt to delete a schema set where #scenario'
-            objectUnderTest.deleteSchemaSet(dataspaceName, schemaSetName, CASCADE_DELETE_PROHIBITED)
+            objectUnderTest.deleteSchemaSet(dataspaceName, schemaSetName)
         then: 'an #expectedException is thrown'
             thrown(expectedException)
         where: 'the following data is used'
             scenario                                   | dataspaceName  | schemaSetName                         || expectedException
             'dataspace does not exist'                 | 'unknown'      | 'not-relevant'                        || DataspaceNotFoundException
             'schema set does not exists'               | DATASPACE_NAME | 'unknown'                             || SchemaSetNotFoundException
-            'cascade prohibited but schema set in use' | DATASPACE_NAME | SCHEMA_SET_NAME_WITH_ANCHORS_AND_DATA || SchemaSetInUseException
+    }
+
+    @Sql([CLEAR_DATA, SET_DATA])
+    def 'Delete only orphan Yang Resources'() {
+        given: 'a schema set is deleted and and yang resource is not used anymore'
+            objectUnderTest.deleteSchemaSet(DATASPACE_NAME, SCHEMA_SET_NAME_NO_ANCHORS)
+        when: 'orphan yang resources are deleted'
+            objectUnderTest.deleteUnusedYangResourceModules()
+        then: 'any orphaned (not used by any schema set anymore) yang resources are deleted'
+            def orphanedResourceId = 3100L
+            yangResourceRepository.findById(orphanedResourceId).isPresent() == false
+        and: 'any shared (still in use by other schema set) yang resources still persists'
+            def sharedResourceId = 3003L
+            yangResourceRepository.findById(sharedResourceId).isPresent()
     }
 
     def assertSchemaSetPersisted(expectedDataspaceName,
-- 
cgit