From 885980d8ebf6bc8be9efad7ce9094deeb602a076 Mon Sep 17 00:00:00 2001 From: Arpit Singh Date: Tue, 21 Nov 2023 21:01:43 +0530 Subject: CPS Delta API: Update action for delta service - Added code for Update action in Delta service - added method to get updated Leaf data: getUpdatedLeavesBetweenSourceAndTargetDataNode - added method to compare Leaf data common in source and target data node - added method to process leaves unique to target data node - added method to compare leaves: compareLeaves - added method to store updated data to a DeltaReport: addUpdatedLeavesToDeltaReport - Added corresponding testware Issue-ID: CPS-1824 Signed-off-by: Arpit Singh Change-Id: I3de07ea3227988784a0892f6a92c238ecf00a7fa --- .../cps/api/impl/CpsDeltaServiceImplSpec.groovy | 100 +++++++++++++++------ 1 file changed, 71 insertions(+), 29 deletions(-) (limited to 'cps-service/src/test') diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDeltaServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDeltaServiceImplSpec.groovy index a4f4339737..e21c6f0e2f 100644 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDeltaServiceImplSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDeltaServiceImplSpec.groovy @@ -21,7 +21,6 @@ package org.onap.cps.api.impl import org.onap.cps.spi.model.DataNode -import org.onap.cps.spi.model.DataNodeBuilder import spock.lang.Shared import spock.lang.Specification @@ -29,38 +28,81 @@ class CpsDeltaServiceImplSpec extends Specification{ def objectUnderTest = new CpsDeltaServiceImpl() - @Shared - def dataNodeWithLeafAndChildDataNode = [new DataNodeBuilder().withXpath('/parent').withLeaves(['parent-leaf': 'parent-payload']) - .withChildDataNodes([new DataNodeBuilder().withXpath("/parent/child").withLeaves('child-leaf': 'child-payload').build()]).build()] - @Shared - def dataNodeWithChildDataNode = [new DataNodeBuilder().withXpath('/parent').withLeaves(['parent-leaf': 'parent-payload']) - .withChildDataNodes([new DataNodeBuilder().withXpath("/parent/child").build()]).build()] - @Shared - def emptyDataNode = [new DataNodeBuilder().withXpath('/parent').build()] - def 'Get delta between data nodes for removed data where source data node has #scenario'() { + static def sourceDataNodeWithLeafData = [new DataNode(xpath: '/parent', leaves: ['parent-leaf': 'parent-payload-in-source'])] + static def sourceDataNodeWithoutLeafData = [new DataNode(xpath: '/parent')] + static def targetDataNodeWithLeafData = [new DataNode(xpath: '/parent', leaves: ['parent-leaf': 'parent-payload-in-target'])] + static def targetDataNodeWithoutLeafData = [new DataNode(xpath: '/parent')] + static def sourceDataNodeWithMultipleLeaves = [new DataNode(xpath: '/parent', leaves: ['leaf-1': 'leaf-1-in-source', 'leaf-2': 'leaf-2-in-source'])] + static def targetDataNodeWithMultipleLeaves = [new DataNode(xpath: '/parent', leaves: ['leaf-1': 'leaf-1-in-target', 'leaf-2': 'leaf-2-in-target'])] + + def 'Get delta between data nodes for REMOVED data where source data node has #scenario'() { + when: 'attempt to get delta between 2 data nodes' + def result = objectUnderTest.getDeltaReports(sourceDataNodeWithLeafData, []) + then: 'the delta report contains expected "remove" action' + assert result[0].action.equals('remove') + and : 'the delta report contains the expected xpath' + assert result[0].xpath == '/parent' + and: 'the delta report contains expected source data' + assert result[0].sourceData == ['parent-leaf': 'parent-payload-in-source'] + and: 'the delta report contains no target data' + assert result[0].targetData == null + } + + def 'Get delta between data nodes with ADDED data where target data node has #scenario'() { + when: 'attempt to get delta between 2 data nodes' + def result = objectUnderTest.getDeltaReports([], targetDataNodeWithLeafData) + then: 'the delta report contains expected "add" action' + assert result[0].action.equals('add') + and: 'the delta report contains expected xpath' + assert result[0].xpath == '/parent' + and: 'the delta report contains no source data' + assert result[0].sourceData == null + and: 'the delta report contains expected target data' + assert result[0].targetData == ['parent-leaf': 'parent-payload-in-target'] + } + + def 'Delta Report between leaves for parent and child nodes, #scenario'() { + given: 'Two data nodes' + def sourceDataNode = [new DataNode(xpath: '/parent', leaves: ['parent-leaf': 'parent-payload'], childDataNodes: [new DataNode(xpath: '/parent/child', leaves: ['child-leaf': 'child-payload'])])] + def targetDataNode = [new DataNode(xpath: '/parent', leaves: ['parent-leaf': 'parent-payload-updated'], childDataNodes: [new DataNode(xpath: '/parent/child', leaves: ['child-leaf': 'child-payload-updated'])])] + when: 'attempt to get delta between 2 data nodes' + def result = objectUnderTest.getDeltaReports(sourceDataNode, targetDataNode) + then: 'the delta report contains expected "update" action' + assert result[index].action.equals('update') + and: 'the delta report contains expected xpath' + assert result[index].xpath == expectedXpath + and: 'the delta report contains expected source and target data' + assert result[index].sourceData == expectedSourceData + assert result[index].targetData == expectedTargetData + where: 'the following data was used' + scenario | index || expectedXpath | expectedSourceData | expectedTargetData + 'parent data node' | 0 || '/parent' | ['parent-leaf': 'parent-payload'] | ['parent-leaf': 'parent-payload-updated'] + 'child data node' | 1 || '/parent/child' | ['child-leaf': 'child-payload'] | ['child-leaf': 'child-payload-updated'] + } + + def 'Delta report between leaves, #scenario'() { when: 'attempt to get delta between 2 data nodes' - def result = objectUnderTest.getDeltaReports(sourceDataNode as Collection, emptyDataNode) - then: 'the delta report contains "remove" action with right data' - assert result.first().action.equals("remove") - assert result.first().xpath == "/parent/child" - assert result.first().sourceData == expectedSourceData - where: 'following data was used' - scenario | sourceDataNode || expectedSourceData - 'leaf data' | dataNodeWithLeafAndChildDataNode || ['child-leaf': 'child-payload'] - 'no leaf data' | dataNodeWithChildDataNode || null + def result = objectUnderTest.getDeltaReports(sourceDataNode, targetDataNode) + then: 'the delta report contains expected "update" action' + assert result[0].action.equals('update') + and: 'the delta report contains expected xpath' + assert result[0].xpath == '/parent' + and: 'the delta report contains expected source and target data' + assert result[0].sourceData == expectedSourceData + assert result[0].targetData == expectedTargetData + where: 'the following data was used' + scenario | sourceDataNode | targetDataNode || expectedSourceData | expectedTargetData + 'source and target data nodes have leaves' | sourceDataNodeWithLeafData | targetDataNodeWithLeafData || ['parent-leaf': 'parent-payload-in-source'] | ['parent-leaf': 'parent-payload-in-target'] + 'only source data node has leaves' | sourceDataNodeWithLeafData | targetDataNodeWithoutLeafData || ['parent-leaf': 'parent-payload-in-source'] | null + 'only target data node has leaves' | sourceDataNodeWithoutLeafData | targetDataNodeWithLeafData || null | ['parent-leaf': 'parent-payload-in-target'] + 'source and target dsta node with multiple leaves' | sourceDataNodeWithMultipleLeaves | targetDataNodeWithMultipleLeaves || ['leaf-1': 'leaf-1-in-source', 'leaf-2': 'leaf-2-in-source'] | ['leaf-1': 'leaf-1-in-target', 'leaf-2': 'leaf-2-in-target'] } - def 'Get delta between data nodes with new data where target data node has #scenario'() { + def 'Get delta between data nodes for updated data, where source and target data nodes have no leaves '() { when: 'attempt to get delta between 2 data nodes' - def result = objectUnderTest.getDeltaReports(emptyDataNode, targetDataNode) - then: 'the delta report contains "add" action with right data' - assert result.first().action.equals("add") - assert result.first().xpath == "/parent/child" - assert result.first().targetData == expectedTargetData - where: 'following data was used' - scenario | targetDataNode || expectedTargetData - 'leaf data' | dataNodeWithLeafAndChildDataNode || ['child-leaf': 'child-payload'] - 'no leaf data' | dataNodeWithChildDataNode || null + def result = objectUnderTest.getDeltaReports(sourceDataNodeWithoutLeafData, targetDataNodeWithoutLeafData) + then: 'the delta report contains "update" action with right data' + assert result.isEmpty() } } -- cgit 1.2.3-korg