+ def exceptionThrown = thrown(ServerNcmpException.class)
+ and: 'details contains the original response'
+ exceptionThrown.details.contains('NOK-json')
+ }
+
+ def 'Get resource data for operational from DMI with empty topic sync request.'() {
+ given: 'cps data service returns valid data node'
+ mockCpsDataService.getDataNode('NCMP-Admin', 'ncmp-dmi-registry',
+ cmHandleXPath, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS) >> dataNode
+ and: 'dmi data operation returns valid response and data'
+ mockDmiDataOperations.getResourceDataFromDmi(_, _, _, _, _, NO_REQUEST_ID, NO_TOPIC)
+ >> new ResponseEntity<>('{dmi-response}', HttpStatus.OK)
+ when: 'get resource data is called data operational with blank topic'
+ def responseData = objectUnderTest.getResourceDataOperationalForCmHandle('', '',
+ '', '', emptyTopic)
+ then: '(synchronous) the dmi response is expected'
+ assert responseData == '{dmi-response}'
+ where: 'the following parameters are used'
+ scenario | emptyTopic
+ 'No topic in url' | ''
+ 'Null topic in url' | null
+ 'Empty topic in url' | '\"\"'
+ 'Blank topic in url' | ' '
+ }
+
+ def 'Get resource data for data operational from DMI with valid topic i.e. async request.'() {
+ given: 'cps data service returns valid data node'
+ mockCpsDataService.getDataNode(*_) >> dataNode
+ and: 'dmi data operation returns valid response and data'
+ mockDmiDataOperations.getResourceDataFromDmi(_, _, _, _, _, _, 'my-topic-name')
+ >> new ResponseEntity<>('{dmi-response}', HttpStatus.OK)
+ when: 'get resource data is called for data operational with valid topic'
+ def responseData = objectUnderTest.getResourceDataOperationalForCmHandle('', '', '', '', 'my-topic-name')
+ then: 'non empty request id is generated'
+ assert responseData.body.requestId.length() > 0
+ }
+
+ def 'Get resource data for pass through running from DMI with valid topic async request.'() {
+ given: 'cps data service returns valid data node'
+ mockCpsDataService.getDataNode('NCMP-Admin', 'ncmp-dmi-registry',
+ cmHandleXPath, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS) >> dataNode
+ and: 'dmi data operation returns valid response and data'
+ mockDmiDataOperations.getResourceDataFromDmi(_, _, _, _, _, _, 'my-topic-name')
+ >> new ResponseEntity<>('{dmi-response}', HttpStatus.OK)
+ when: 'get resource data is called for data operational with valid topic'
+ def responseData = objectUnderTest.getResourceDataPassThroughRunningForCmHandle('',
+ '', '', OPTIONS_PARAM, 'my-topic-name')
+ then: 'non empty request id is generated'
+ assert responseData.body.requestId.length() > 0
+ }
+
+ def 'Get resource data for pass through running from DMI sync request where #scenario.'() {
+ given: 'cps data service returns valid data node'
+ mockCpsDataService.getDataNode('NCMP-Admin', 'ncmp-dmi-registry',
+ cmHandleXPath, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS) >> dataNode
+ and: 'dmi data operation returns valid response and data'
+ mockDmiDataOperations.getResourceDataFromDmi(_, _, _, _, _, NO_REQUEST_ID, NO_TOPIC)
+ >> new ResponseEntity<>('{dmi-response}', HttpStatus.OK)
+ when: 'get resource data is called for data operational with valid topic'
+ def responseData = objectUnderTest.getResourceDataPassThroughRunningForCmHandle('',
+ '', '', '', emptyTopic)
+ then: '(synchronous) the dmi response is expected'
+ assert responseData == '{dmi-response}'
+ where: 'the following parameters are used'
+ scenario | emptyTopic
+ 'No topic in url' | ''
+ 'Null topic in url' | null
+ 'Empty topic in url' | '\"\"'
+ 'Blank topic in url' | ' '
+ }
+
+ def 'Getting Yang Resources.'() {
+ when: 'yang resources is called'
+ objectUnderTest.getYangResourcesModuleReferences('some cm handle')
+ then: 'CPS module services is invoked for the correct dataspace and cm handle'
+ 1 * mockCpsModuleService.getYangResourcesModuleReferences('NFP-Operational','some cm handle')
+ }
+
+ def 'Get cm handle identifiers for the given module names.'() {
+ when: 'execute a cm handle search for the given module names'
+ objectUnderTest.executeCmHandleHasAllModulesSearch(['some-module-name'])
+ then: 'get anchor identifiers is invoked with the expected parameters'
+ 1 * mockCpsAdminService.queryAnchorNames('NFP-Operational', ['some-module-name'])
+ }
+
+ def 'Get a cm handle.'() {
+ given: 'the system returns a yang modelled cm handle'
+ def dmiServiceName = 'some service name'
+ def dmiProperties = [new YangModelCmHandle.Property('Book', 'Romance Novel')]
+ def publicProperties = [new YangModelCmHandle.Property('Public Book', 'Public Romance Novel')]
+ def yangModelCmHandle = new YangModelCmHandle(id:'Some-Cm-Handle', dmiServiceName: dmiServiceName, dmiProperties: dmiProperties, publicProperties: publicProperties)
+ 1 * mockYangModelCmHandleRetriever.getDmiServiceNamesAndProperties('Some-Cm-Handle') >> yangModelCmHandle
+ when: 'getting cm handle details for a given cm handle id from ncmp service'
+ def result = objectUnderTest.getNcmpServiceCmHandle('Some-Cm-Handle')
+ then: 'the result returns the correct data'
+ result.cmHandleID == 'Some-Cm-Handle'
+ result.dmiProperties ==[ Book:'Romance Novel' ]
+ result.publicProperties == [ "Public Book":'Public Romance Novel' ]
+
+ }
+
+ 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',
+ cmHandleXPath, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS) >> dataNode
+ when: 'get resource data is called'
+ objectUnderTest.writeResourceDataPassThroughRunningForCmHandle('testCmHandle',
+ 'testResourceId', UPDATE,
+ '{some-json}', 'application/json')
+ then: 'DMI called with correct data'
+ 1 * mockDmiDataOperations.writeResourceDataPassThroughRunningFromDmi('testCmHandle', 'testResourceId',
+ UPDATE, '{some-json}', 'application/json')
+ >> { new ResponseEntity<>(HttpStatus.OK) }
+ }
+
+ def 'Verify error message from handleResponse is correct for #scenario operation.'() {
+ given: 'writeResourceDataPassThroughRunningFromDmi fails to return OK HttpStatus'
+ mockDmiDataOperations.writeResourceDataPassThroughRunningFromDmi(*_)
+ >> new ResponseEntity<>(HttpStatus.NOT_FOUND)
+ when: 'get resource data is called'
+ objectUnderTest.writeResourceDataPassThroughRunningForCmHandle(
+ 'testCmHandle',
+ 'testResourceId',
+ givenOperation,
+ '{some-json}',
+ 'application/json')
+ then: 'an exception is thrown with the expected error message details with correct operation'
+ def exceptionThrown = thrown(ServerNcmpException.class)
+ exceptionThrown.getMessage().contains(expectedResponseMessage)
+ where:
+ scenario | givenOperation || expectedResponseMessage
+ 'CREATE' | CREATE || 'Not able to create resource data.'
+ 'READ' | READ || 'Not able to read resource data.'
+ 'UPDATE' | UPDATE || 'Not able to update resource data.'