From c62dbd7d3538392c6b72e73631f026fef198715c Mon Sep 17 00:00:00 2001 From: danielhanrahan Date: Wed, 5 Apr 2023 17:33:05 +0100 Subject: Migrate query tests to integration-test module #4 Issue-ID: CPS-1597 Signed-off-by: danielhanrahan Change-Id: Id3b4a3829b6f9aec1a649ed0001d7c11db91ccfe --- .../CpsQueryServiceIntegrationSpec.groovy | 52 +++++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) (limited to 'integration-test/src') diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsQueryServiceIntegrationSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsQueryServiceIntegrationSpec.groovy index 496b36db9..a33d9fa5e 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsQueryServiceIntegrationSpec.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsQueryServiceIntegrationSpec.groovy @@ -20,18 +20,28 @@ package org.onap.cps.integration.functional +import org.onap.cps.api.CpsQueryService import org.onap.cps.integration.base.FunctionalSpecBase import org.onap.cps.spi.FetchDescendantsOption +import org.onap.cps.spi.exceptions.CpsPathException +import org.springframework.test.context.jdbc.Sql + +import java.util.stream.Collectors + +import static org.onap.cps.spi.FetchDescendantsOption.DIRECT_CHILDREN_ONLY +import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS +import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS +import static org.onap.cps.spi.FetchDescendantsOption.getFetchDescendantsOption class CpsQueryServiceIntegrationSpec extends FunctionalSpecBase { - def objectUnderTest + CpsQueryService objectUnderTest def setup() { objectUnderTest = cpsQueryService } def 'Query bookstore using CPS path where #scenario.'() { when: 'query data nodes for bookstore container' - def result = objectUnderTest.queryDataNodes(FUNCTIONAL_TEST_DATASPACE, BOOKSTORE_ANCHOR, cpsPath, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS) + def result = objectUnderTest.queryDataNodes(FUNCTIONAL_TEST_DATASPACE, BOOKSTORE_ANCHOR, cpsPath, INCLUDE_ALL_DESCENDANTS) then: 'the result contains expected number of nodes' assert result.size() == expectedResultSize and: 'the result contains the expected leaf values' @@ -45,4 +55,42 @@ class CpsQueryServiceIntegrationSpec extends FunctionalSpecBase { 'the and condition is used' | '//books[@lang="English" and @price=15]' || 2 | [lang:"English", price:15] 'the and is used where result does not exist' | '//books[@lang="English" and @price=1000]' || 0 | [] } + + def 'Query for attribute by cps path of type ancestor with #scenario.'() { + when: 'the given cps path is parsed' + def result = objectUnderTest.queryDataNodes(FUNCTIONAL_TEST_DATASPACE, BOOKSTORE_ANCHOR, cpsPath, OMIT_DESCENDANTS) + then: 'the xpaths of the retrieved data nodes are as expected' + assert result.xpath.sort() == expectedXPaths.sort() + where: 'the following data is used' + scenario | cpsPath || expectedXPaths + 'multiple list-ancestors' | '//books/ancestor::categories' || ["/bookstore/categories[@code='1']", "/bookstore/categories[@code='2']", "/bookstore/categories[@code='3']"] + 'one ancestor with list value' | '//books/ancestor::categories[@code="1"]' || ["/bookstore/categories[@code='1']"] + 'top ancestor' | '//books/ancestor::bookstore' || ["/bookstore"] + 'list with index value in the xpath prefix' | '//categories[@code="1"]/books/ancestor::bookstore' || ["/bookstore"] + 'ancestor with parent list' | '//books/ancestor::bookstore/categories' || ["/bookstore/categories[@code='1']", "/bookstore/categories[@code='2']", "/bookstore/categories[@code='3']"] + 'ancestor with parent' | '//books/ancestor::bookstore/categories[@code="2"]' || ["/bookstore/categories[@code='2']"] + 'ancestor combined with text condition' | '//books/title[text()="Matilda"]/ancestor::bookstore' || ["/bookstore"] + 'ancestor with parent that does not exist' | '//books/ancestor::parentDoesNoExist/categories' || [] + 'ancestor does not exist' | '//books/ancestor::ancestorDoesNotExist' || [] + } + + def 'Query for attribute by cps path of type ancestor with #scenario descendants.'() { + when: 'the given cps path is parsed' + def result = objectUnderTest.queryDataNodes(FUNCTIONAL_TEST_DATASPACE, BOOKSTORE_ANCHOR, '//books/ancestor::bookstore', fetchDescendantsOption) + then: 'the xpaths of the retrieved data nodes are as expected' + assert countDataNodesInTree(result) == expectedNumberOfNodes + where: 'the following data is used' + scenario | fetchDescendantsOption || expectedNumberOfNodes + 'no' | OMIT_DESCENDANTS || 1 + 'direct' | DIRECT_CHILDREN_ONLY || 4 + 'all' | INCLUDE_ALL_DESCENDANTS || 8 + } + + def 'Cps Path query with syntax error throws a CPS Path Exception.'() { + when: 'trying to execute a query with a syntax (parsing) error' + objectUnderTest.queryDataNodes(FUNCTIONAL_TEST_DATASPACE, BOOKSTORE_ANCHOR, 'cpsPath that cannot be parsed' , OMIT_DESCENDANTS) + then: 'a cps path exception is thrown' + thrown(CpsPathException) + } + } -- cgit 1.2.3-korg