From 099f89eda3b0c94d20612ebf1d62795ab7dc833a Mon Sep 17 00:00:00 2001 From: ToineSiebelink Date: Mon, 25 Jan 2021 18:46:20 +0000 Subject: Draft at proposal where the DataNodeBuilder 'replaces' yang Utils to buidl a DataNode Most complexity is related to immutable collections and the fact taht we are adding data while recursing over the orignal data in an uncontrolled order. I cleaned it up as best I could with no logic in DataNode. Espcially the handling of LitLeaves requires some specialed handling. Thsi is just a draft solution for that I still propose we get back to that in dedicated user stories for handling the various types of Yang elements Hope this helps... Issue-ID: CPS-137 Signed-off-by: ToineSiebelink Change-Id: Iab7cfcff67412c01bcdab95e707e1350bf60fab1 --- .../org/onap/cps/model/DataNodeBuilderSpec.groovy | 29 ++++++++++++++++++++++ .../groovy/org/onap/cps/utils/YangUtilsSpec.groovy | 21 ---------------- 2 files changed, 29 insertions(+), 21 deletions(-) create mode 100644 cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy (limited to 'cps-service/src/test') diff --git a/cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy new file mode 100644 index 000000000..0dbde889a --- /dev/null +++ b/cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy @@ -0,0 +1,29 @@ +package org.onap.cps.model + +import org.onap.cps.TestUtils +import org.onap.cps.spi.model.DataNodeBuilder +import org.onap.cps.utils.YangUtils +import org.onap.cps.yang.YangTextSchemaSourceSetBuilder +import spock.lang.Specification + +class DataNodeBuilderSpec extends Specification { + + def 'Converting Normalized Node (tree) to a DataNode (tree).'() { + given: 'a Yang module' + def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('bookstore.yang') + def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent)getSchemaContext() + and: 'a normalized node for that model' + def jsonData = TestUtils.getResourceFileContent('bookstore.json') + def normalizedNode = YangUtils.parseJsonData(jsonData, schemaContext) + when: 'the normalized node is converted to a DataNode (tree)' + def result = new DataNodeBuilder().withNormalizedNodeTree(normalizedNode).build() + then: 'the system creates a (root) fragment without a parent and 2 children (categories)' + result.childDataNodes.size() == 2 + and: 'each child (category) has the root fragment (result) as parent and in turn as 1 child (a list of books)' + result.childDataNodes.each { it.childDataNodes.size() == 1 } + and: 'the fragments have the correct xpaths' + assert result.xpath == '/bookstore' + assert result.childDataNodes.collect { it.xpath } + .containsAll(["/bookstore/categories[@code='01']", "/bookstore/categories[@code='02']"]) + } +} diff --git a/cps-service/src/test/groovy/org/onap/cps/utils/YangUtilsSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/utils/YangUtilsSpec.groovy index 9237fa29a..e6e5d6a36 100644 --- a/cps-service/src/test/groovy/org/onap/cps/utils/YangUtilsSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/utils/YangUtilsSpec.groovy @@ -54,25 +54,4 @@ class YangUtilsSpec extends Specification{ '{incomplete json' | 'incomplete json' '{"test:bookstore": {"address": "Parnell st." }}' | 'json with un-modelled data' } - - def 'Breaking a Json Data Object into fragments.'() { - given: 'a Yang module' - def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('bookstore.yang') - def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent)getSchemaContext() - def module = schemaContext.findModule('stores', Revision.of('2020-09-15')).get() - and: 'a normalized node for that model' - def jsonData = TestUtils.getResourceFileContent('bookstore.json') - def normalizedNode = YangUtils.parseJsonData(jsonData, schemaContext) - when: 'the json data is fragmented' - def result = YangUtils.fragmentNormalizedNode(normalizedNode, module) - then: 'the system creates a (root) fragment without a parent and 2 children (categories)' - result.parentFragment == null - result.childFragments.size() == 2 - and: 'each child (category) has the root fragment (result) as parent and in turn as 1 child (a list of books)' - result.childFragments.each { it.parentFragment == result && it.childFragments.size() == 1 } - and: 'the fragments have the correct xpaths' - assert result.xpath == '/bookstore' - assert result.childFragments.collect { it.xpath } - .containsAll(["/bookstore/categories[@code='01']", "/bookstore/categories[@code='02']"]) - } } -- cgit 1.2.3-korg