Query CmHandles using CPS path
[cps.git] / cps-ncmp-rest / src / test / groovy / org / onap / cps / ncmp / rest / controller / NetworkCmProxyControllerSpec.groovy
index 036928f..06a7759 100644 (file)
@@ -26,10 +26,13 @@ package org.onap.cps.ncmp.rest.controller
 import org.mapstruct.factory.Mappers
 import org.onap.cps.ncmp.api.inventory.CmHandleState
 import org.onap.cps.ncmp.api.inventory.CompositeState
+import org.onap.cps.ncmp.api.inventory.LockReasonCategory
+import org.onap.cps.ncmp.api.inventory.DataStoreSyncState
 import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle
-import org.onap.cps.ncmp.rest.mapper.RestOutputCmHandleStateMapper
+import org.onap.cps.ncmp.rest.mapper.CmHandleStateMapper
 import org.onap.cps.ncmp.rest.executor.CpsNcmpTaskExecutor
 import org.onap.cps.ncmp.rest.util.DeprecationHelper
+import org.onap.cps.spi.model.ModuleDefinition
 import spock.lang.Shared
 
 import java.time.OffsetDateTime
@@ -39,7 +42,6 @@ import java.time.format.DateTimeFormatter
 import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.PATCH
 import static org.onap.cps.ncmp.api.inventory.CompositeState.DataStores
 import static org.onap.cps.ncmp.api.inventory.CompositeState.Operational
-import static org.onap.cps.ncmp.api.inventory.CompositeState.Running
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch
@@ -82,7 +84,7 @@ class NetworkCmProxyControllerSpec extends Specification {
     NcmpRestInputMapper ncmpRestInputMapper = Mappers.getMapper(NcmpRestInputMapper)
 
     @SpringBean
-    RestOutputCmHandleStateMapper restOutputCmHandleStateMapper = Mappers.getMapper(RestOutputCmHandleStateMapper)
+    CmHandleStateMapper cmHandleStateMapper = Mappers.getMapper(CmHandleStateMapper)
 
     @SpringBean
     CpsNcmpTaskExecutor spiedCpsTaskExecutor = Spy()
@@ -261,24 +263,27 @@ class NetworkCmProxyControllerSpec extends Specification {
             response.contentAsString == '[{"cmHandle":"some-cmhandle-id1","publicCmHandleProperties":[{"color":"yellow"}],"state":null},{"cmHandle":"some-cmhandle-id2","publicCmHandleProperties":[{"color":"green"}],"state":null}]'
     }
 
-    def 'Get Cm Handle details by Cm Handle id.'() {
+    def 'Get complete Cm Handle details by Cm Handle id.'() {
         given: 'an endpoint and a cm handle'
             def cmHandleDetailsEndpoint = "$ncmpBasePathV1/ch/some-cm-handle"
         and: 'an existing ncmp service cm handle'
-            def compositeState = new CompositeState(cmHandleState: CmHandleState.ADVISED,
-                lastUpdateTime: formattedDateAndTime.toString(),
-                dataStores: dataStores())
-            def ncmpServiceCmHandle = new NcmpServiceCmHandle(cmHandleId: 'some-cm-handle', compositeState: compositeState)
+            def cmHandleId = 'some-cm-handle'
+            def dmiProperties = [ prop:'some DMI property' ]
+            def publicProperties = [ "public prop":'some public property' ]
+            def compositeState = compositeStateTestObject()
+            def ncmpServiceCmHandle = new NcmpServiceCmHandle(cmHandleId: cmHandleId, dmiProperties: dmiProperties, publicProperties: publicProperties, compositeState: compositeState)
         and: 'the service method is invoked with the cm handle id'
             1 * mockNetworkCmProxyDataService.getNcmpServiceCmHandle('some-cm-handle') >> ncmpServiceCmHandle
         when: 'the cm handle details api is invoked'
             def response = mvc.perform(get(cmHandleDetailsEndpoint)).andReturn().response
         then: 'the correct response is returned'
             response.status == HttpStatus.OK.value()
-        and: 'the response returns the correct state and timestamp'
-            response.contentAsString.contains('some-cm-handle')
-            response.contentAsString.contains('ADVISED')
-            response.contentAsString.contains('2022-12-31T20:30:40.000+0000')
+        and: 'the response contains the public properties'
+            assertContainsPublicProperties(response)
+        and: 'the response contains the cm handle state'
+            assertContainsState(response)
+        and: 'the content does not contain dmi properties'
+            !response.contentAsString.contains("some DMI property")
     }
 
     def 'Get Cm Handle public properties by Cm Handle id.' () {
@@ -292,8 +297,23 @@ class NetworkCmProxyControllerSpec extends Specification {
             def response = mvc.perform(get(cmHandlePropertiesEndpoint)).andReturn().response
         then: 'the correct response is returned'
             response.status == HttpStatus.OK.value()
-        and: 'the response returns public properties and the correct properties'
-            response.contentAsString.equals('{"publicCmHandleProperties":[{"public prop":"some public property"}]}')
+        and: 'the response contains the public properties'
+            assertContainsPublicProperties(response)
+    }
+
+    def 'Get Cm Handle composite state by Cm Handle id.' () {
+        given: 'a cm handle state endpoint'
+            def cmHandlePropertiesEndpoint = "$ncmpBasePathV1/ch/some-cm-handle/state"
+        and: 'some cm handle composite state'
+            def compositeState = compositeStateTestObject()
+        and: 'the service method is invoked with the cm handle id returning the cm handle composite state'
+            1 * mockNetworkCmProxyDataService.getCmHandleCompositeState('some-cm-handle') >> compositeState
+        when: 'the cm handle state api is invoked'
+            def response = mvc.perform(get(cmHandlePropertiesEndpoint)).andReturn().response
+        then: 'the correct response is returned'
+            response.status == HttpStatus.OK.value()
+        and: 'the response contains the cm handle state'
+            assertContainsState(response)
     }
 
     def 'Call execute cm handle searches with unrecognized condition name.'() {
@@ -389,12 +409,65 @@ class NetworkCmProxyControllerSpec extends Specification {
             ':passthrough-running'     | 'passthrough-running'
     }
 
+    def 'Get module definitions based on cmHandleId.' () {
+        when: 'get module definition request is performed'
+            def response = mvc.perform(get("$ncmpBasePathV1/ch/some-cmhandle/modules/definitions"))
+                    .andReturn().response
+        then: 'ncmp service method to get module definitions is called'
+            mockNetworkCmProxyDataService.getModuleDefinitionsByCmHandleId('some-cmhandle')
+                    >> [new ModuleDefinition('sampleModuleName', '2021-10-03',
+                    'module sampleModuleName{ sample module content }')]
+        and: 'response contains an array with the module name, revision and content'
+            response.getContentAsString() == '[{"moduleName":"sampleModuleName","revision":"2021-10-03","content":"module sampleModuleName{ sample module content }"}]'
+        and: 'response returns an OK http code'
+            response.status == HttpStatus.OK.value()
+    }
+
     def dataStores() {
         DataStores.builder()
             .operationalDataStore(Operational.builder()
-                .syncState('NONE_REQUESTED')
+                .dataStoreSyncState(DataStoreSyncState.NONE_REQUESTED)
                 .lastSyncTime(formattedDateAndTime.toString()).build()).build()
     }
 
+    def compositeStateTestObject() {
+        new CompositeState(cmHandleState: CmHandleState.ADVISED,
+            lockReason: CompositeState.LockReason.builder().lockReasonCategory(LockReasonCategory.LOCKED_MODULE_SYNC_FAILED).details("lock details").build(),
+            lastUpdateTime: formattedDateAndTime.toString(),
+            dataSyncEnabled: false,
+            dataStores: dataStores())
+    }
+
+    def assertContainsAll(response, assertContent) {
+        assertContent.forEach( string -> { assert(response.contentAsString.contains(string)) })
+        return void
+    }
+
+    def assertContainsState(response) {
+        def expectedContent = [
+            '"state":',
+            '"cmHandleState":"ADVISED"',
+            '"reason":"LOCKED_MISBEHAVING"',
+            '"details":"lock details"',
+            '"lastUpdateTime":"2022-12-31T20:30:40.000+0000"',
+            '"dataSyncEnabled":false',
+            '"dataSyncState":',
+            '"operational":',
+            '"syncState":"NONE_REQUESTED"',
+            '"lastSyncTime":"2022-12-31T20:30:40.000+0000"',
+            '"running":null'
+        ]
+        return assertContainsAll(response, expectedContent)
+    }
+
+    def assertContainsPublicProperties(response) {
+        def expectedContent = [
+            '"publicCmHandleProperties":' ,
+            '"public prop"' ,
+            '"some public property"'
+        ]
+        return assertContainsAll(response, expectedContent)
+    }
+
 }