Migrate query tests to integration-test module #5 67/134067/7
authordanielhanrahan <daniel.hanrahan@est.tech>
Tue, 11 Apr 2023 13:36:31 +0000 (14:36 +0100)
committerdanielhanrahan <daniel.hanrahan@est.tech>
Wed, 12 Apr 2023 15:46:24 +0000 (16:46 +0100)
- Migrate query tests for composite keys to integration-test
- Add addresses with composite key to bookstore model

Issue-ID: CPS-1597
Signed-off-by: danielhanrahan <daniel.hanrahan@est.tech>
Change-Id: I6f8dfc2c44ae6ba3bac1cce804841671ef5a009d

cps-ri/pom.xml
cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsDataPersistenceQueryDataNodeSpec.groovy
integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsDataServiceIntegrationSpec.groovy
integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsQueryServiceIntegrationSpec.groovy
integration-test/src/test/resources/data/bookstore/bookstore.yang
integration-test/src/test/resources/data/bookstore/bookstoreData.json

index 3cb4130..6ee2d21 100644 (file)
@@ -33,7 +33,7 @@
     <artifactId>cps-ri</artifactId>\r
 \r
     <properties>\r
-        <minimum-coverage>0.96</minimum-coverage>\r
+        <minimum-coverage>0.94</minimum-coverage>\r
     </properties>\r
 \r
     <dependencies>\r
index d5a6be4..f025206 100644 (file)
@@ -37,23 +37,6 @@ class CpsDataPersistenceQueryDataNodeSpec extends CpsPersistenceSpecBase {
 
     static final String SET_DATA = '/data/cps-path-query.sql'
 
-    @Sql([CLEAR_DATA, SET_DATA])
-    def 'Cps Path query using descendant anywhere with #scenario condition(s) for a list element.'() {
-        when: 'a query is executed to get a data node by the given cps path'
-            def result = objectUnderTest.queryDataNodes(DATASPACE_NAME, ANCHOR_FOR_SHOP_EXAMPLE, cpsPath, OMIT_DESCENDANTS)
-        then: 'the correct number of data nodes are retrieved'
-            result.size() == expectedXPaths.size()
-        and: 'xpaths of the retrieved data nodes are as expected'
-            for (int i = 0; i < result.size(); i++) {
-                assert result[i].getXpath() == expectedXPaths[i]
-            }
-        where: 'the following data is used'
-            scenario                              | cpsPath                                        || expectedXPaths
-            'one partial key leaf'                | '//author[@FirstName="Joe"]'                   || ["/shops/shop[@id='1']/categories[@code='1']/book/author[@FirstName='Joe' and @Surname='Bloggs']", "/shops/shop[@id='1']/categories[@code='2']/book/author[@FirstName='Joe' and @Surname='Smith']"]
-            'one non key leaf'                    | '//author[@title="Dune"]'                      || ["/shops/shop[@id='1']/categories[@code='1']/book/author[@FirstName='Joe' and @Surname='Bloggs']"]
-            'mix of partial key and non key leaf' | '//author[@FirstName="Joe" and @title="Dune"]' || ["/shops/shop[@id='1']/categories[@code='1']/book/author[@FirstName='Joe' and @Surname='Bloggs']"]
-    }
-
     @Sql([CLEAR_DATA, SET_DATA])
     def 'Cps Path query across anchors for leaf value(s) with : #scenario.'() {
         when: 'a query is executed to get a data node by the given cps path'
index 826035a..25e71f1 100644 (file)
@@ -41,9 +41,9 @@ class CpsDataServiceIntegrationSpec extends FunctionalSpecBase {
         where: 'the following option is used'
             fetchDescendantsOption                         || expectNumberOfDataNodes
             FetchDescendantsOption.OMIT_DESCENDANTS        || 1
-            FetchDescendantsOption.DIRECT_CHILDREN_ONLY    || 5
-            FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS || 14
-            new FetchDescendantsOption(2)                  || 14
+            FetchDescendantsOption.DIRECT_CHILDREN_ONLY    || 6
+            FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS || 17
+            new FetchDescendantsOption(2)                  || 17
     }
 
     def 'Read bookstore top-level container(s) has correct dataspace and anchor.'() {
index 6197691..1a31cdd 100644 (file)
@@ -64,8 +64,8 @@ class CpsQueryServiceIntegrationSpec extends FunctionalSpecBase {
             'string and no descendants'            | '/bookstore/categories[@code="1"]/books[@title="Matilda"]' | OMIT_DESCENDANTS               || 1                           | 1
             'integer and descendants'              | '/bookstore/categories[@code="1"]/books[@price=15]'        | INCLUDE_ALL_DESCENDANTS        || 1                           | 1
             'no condition and no descendants'      | '/bookstore/categories'                                    | OMIT_DESCENDANTS               || 4                           | 4
-            'no condition and level 1 descendants' | '/bookstore'                                               | new FetchDescendantsOption(1)  || 1                           | 5
-            'no condition and level 2 descendants' | '/bookstore'                                               | new FetchDescendantsOption(2)  || 1                           | 14
+            'no condition and level 1 descendants' | '/bookstore'                                               | new FetchDescendantsOption(1)  || 1                           | 6
+            'no condition and level 2 descendants' | '/bookstore'                                               | new FetchDescendantsOption(2)  || 1                           | 17
     }
 
     def 'Query for attribute by cps path with cps paths that return no data because of #scenario.'() {
@@ -136,6 +136,19 @@ class CpsQueryServiceIntegrationSpec extends FunctionalSpecBase {
             'leaf and text'            | '//books[@price=14]/authors[text()="Terry Pratchett"]' || ['The Light Fantastic']
     }
 
+    def 'Cps Path query using descendant anywhere with #scenario condition(s) for a list element.'() {
+        when: 'a query is executed to get a data node by the given cps path'
+            def result = objectUnderTest.queryDataNodes(FUNCTIONAL_TEST_DATASPACE, BOOKSTORE_ANCHOR, cpsPath, INCLUDE_ALL_DESCENDANTS)
+        then: 'xpaths of the retrieved data nodes are as expected'
+            result.xpath.toList() == ["/bookstore/premises/addresses[@house-number='2' and @street='Main Street']"]
+        where: 'the following data is used'
+            scenario                              | cpsPath
+            'full composite key'                  | '//addresses[@house-number=2 and @street="Main Street"]'
+            'one partial key leaf'                | '//addresses[@house-number=2]'
+            'one non key leaf'                    | '//addresses[@county="Kildare"]'
+            'mix of partial key and non key leaf' | '//addresses[@street="Main Street" and @county="Kildare"]'
+    }
+
     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)
@@ -162,8 +175,8 @@ class CpsQueryServiceIntegrationSpec extends FunctionalSpecBase {
         where: 'the following data is used'
             scenario | fetchDescendantsOption  || expectedNumberOfNodes
             'no'     | OMIT_DESCENDANTS        || 1
-            'direct' | DIRECT_CHILDREN_ONLY    || 5
-            'all'    | INCLUDE_ALL_DESCENDANTS || 14
+            'direct' | DIRECT_CHILDREN_ONLY    || 6
+            'all'    | INCLUDE_ALL_DESCENDANTS || 17
     }
 
     def 'Cps Path query with syntax error throws a CPS Path Exception.'() {
index c3bfc50..62ebc73 100644 (file)
@@ -21,6 +21,25 @@ module stores {
             type string;
         }
 
+        container premises {
+            list addresses {
+                key "house-number street";
+
+                leaf house-number {
+                    type uint16;
+                }
+                leaf street {
+                    type string;
+                }
+                leaf town {
+                    type string;
+                }
+                leaf county {
+                    type string;
+                }
+            }
+        }
+
         list categories {
 
             key "code";
index 48cf4e4..12df20e 100644 (file)
@@ -1,6 +1,22 @@
 {
   "bookstore": {
     "bookstore-name": "Easons",
+    "premises": {
+      "addresses": [
+        {
+          "house-number": 2,
+          "street": "Main Street",
+          "town": "Maynooth",
+          "county": "Kildare"
+        },
+        {
+          "house-number": 24,
+          "street": "Grafton Street",
+          "town": "Dublin",
+          "county": "Dublin"
+        }
+      ]
+    },
     "categories": [
       {
         "code": 1,