+ def mockCpsModuleService = Mock(CpsModuleService)
+ def mockCpsAdminService = Mock(CpsAdminService)
+ def spiedJsonObjectMapper = Spy(new JsonObjectMapper(new ObjectMapper()))
+ def mockDmiModelOperations = Mock(DmiModelOperations)
+ def mockDmiDataOperations = Mock(DmiDataOperations)
+ def nullNetworkCmProxyDataServicePropertyHandler = null
+ def mockYangModelCmHandleRetriever = Mock(YangModelCmHandleRetriever)
+ def NO_TOPIC = null
+ def NO_REQUEST_ID = null
+ @Shared
+ def OPTIONS_PARAM = '(a=1,b=2)'
+
+ def objectUnderTest = new NetworkCmProxyDataServiceImpl(mockCpsDataService, spiedJsonObjectMapper, mockDmiDataOperations, mockDmiModelOperations,
+ mockCpsModuleService, mockCpsAdminService, nullNetworkCmProxyDataServicePropertyHandler, mockYangModelCmHandleRetriever)
+
+ def cmHandleXPath = "/dmi-registry/cm-handles[@id='testCmHandle']"
+
+ def dataNode = new DataNode(leaves: ['dmi-service-name': 'testDmiService'])
+
+ def 'Write resource data for pass-through running from DMI using POST #scenario cm handle 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', CREATE,
+ '{some-json}', 'application/json')
+ then: 'DMI called with correct data'
+ 1 * mockDmiDataOperations.writeResourceDataPassThroughRunningFromDmi('testCmHandle', 'testResourceId',
+ CREATE, '{some-json}', 'application/json')
+ >> { new ResponseEntity<>(HttpStatus.CREATED) }
+ }
+
+ def 'Write resource data for pass-through running from DMI using POST "not found" response (from DMI).'() {
+ given: 'cpsDataService returns valid dataNode'
+ mockCpsDataService.getDataNode('NCMP-Admin', 'ncmp-dmi-registry',
+ cmHandleXPath, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS) >> dataNode
+ and: 'DMI returns a response with 404 status code'
+ mockDmiDataOperations.writeResourceDataPassThroughRunningFromDmi('testCmHandle',
+ 'testResourceId', CREATE,
+ '{some-json}', 'application/json')
+ >> { new ResponseEntity<>(HttpStatus.NOT_FOUND) }
+ when: 'write resource data is called'
+ objectUnderTest.writeResourceDataPassThroughRunningForCmHandle('testCmHandle',
+ 'testResourceId', CREATE,
+ '{some-json}', 'application/json')
+ then: 'exception is thrown'
+ def exceptionThrown = thrown(HttpClientRequestException.class)
+ and: 'http status (not found) error code: 404'
+ exceptionThrown.httpStatus == HttpStatus.NOT_FOUND.value()
+ }
+
+ def 'Get resource data for pass-through operational from DMI.'() {
+ given: 'get data node is called'
+ mockCpsDataService.getDataNode('NCMP-Admin', 'ncmp-dmi-registry',
+ cmHandleXPath, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS) >> dataNode
+ and: 'get resource data from DMI is called'
+ mockDmiDataOperations.getResourceDataFromDmi(
+ 'testCmHandle',
+ 'testResourceId',
+ OPTIONS_PARAM,
+ PASSTHROUGH_OPERATIONAL,
+ NO_REQUEST_ID,
+ NO_TOPIC) >> new ResponseEntity<>('dmi-response', HttpStatus.OK)
+ when: 'get resource data operational for cm-handle is called'
+ def response = objectUnderTest.getResourceDataOperationalForCmHandle('testCmHandle',
+ 'testResourceId',
+ OPTIONS_PARAM,
+ NO_TOPIC,
+ NO_REQUEST_ID)
+ then: 'DMI returns a json response'
+ response == 'dmi-response'
+ }
+
+ def 'Get resource data for pass-through operational from DMI with Json Processing Exception.'() {
+ given: 'cps data service returns valid data node'
+ mockCpsDataService.getDataNode('NCMP-Admin', 'ncmp-dmi-registry',
+ cmHandleXPath, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS) >> dataNode
+ and: 'objectMapper not able to parse object'
+ spiedJsonObjectMapper.asJsonString(_) >> { throw new JsonProcessingException('testException') }
+ and: 'DMI returns NOK response'
+ mockDmiDataOperations.getResourceDataFromDmi(*_)
+ >> new ResponseEntity<>('NOK-json', HttpStatus.NOT_FOUND)
+ when: 'get resource data is called'
+ objectUnderTest.getResourceDataOperationalForCmHandle('testCmHandle',
+ 'testResourceId',
+ OPTIONS_PARAM,
+ NO_TOPIC,
+ NO_REQUEST_ID)
+ then: 'exception is thrown with the expected response code and details'
+ def exceptionThrown = thrown(HttpClientRequestException.class)
+ exceptionThrown.details.contains('NOK-json')
+ exceptionThrown.httpStatus == HttpStatus.NOT_FOUND.value()
+ }
+
+ def 'Get resource data for pass-through operational from DMI return NOK response.'() {
+ given: 'cps data service returns valid data node'
+ mockCpsDataService.getDataNode('NCMP-Admin', 'ncmp-dmi-registry',
+ cmHandleXPath, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS) >> dataNode
+ and: 'DMI returns NOK response'
+ mockDmiDataOperations.getResourceDataFromDmi('testCmHandle',
+ 'testResourceId',
+ OPTIONS_PARAM,
+ PASSTHROUGH_OPERATIONAL,
+ NO_REQUEST_ID,
+ NO_TOPIC)
+ >> new ResponseEntity<>('NOK-json', HttpStatus.NOT_FOUND)
+ when: 'get resource data is called'
+ objectUnderTest.getResourceDataOperationalForCmHandle('testCmHandle',
+ 'testResourceId',
+ OPTIONS_PARAM,
+ NO_TOPIC,
+ NO_REQUEST_ID)
+ then: 'exception is thrown'
+ def exceptionThrown = thrown(HttpClientRequestException.class)
+ and: 'details contain the original response'
+ exceptionThrown.httpStatus == HttpStatus.NOT_FOUND.value()
+ exceptionThrown.details.contains('NOK-json')