From bac3df9d4125595e42b15056e9970a179c290751 Mon Sep 17 00:00:00 2001 From: Gabriel Roldan Date: Thu, 14 Nov 2024 14:10:01 -0300 Subject: [PATCH 1/2] Fix DiscoveryCollectionsDefaultCrs look up of codes in global crs DiscoveryCollectionsDefaultCrs asserts that a `/collections` document complies with ``` Abstract Test 2: /conf/crs/default-crs Test Purpose: Verify that the list of supported CRSs includes the default CRS. Requirement: /req/crs/fc-md-crs-list B ``` but doesn't expand the collection's `#/crs` JSON pointer to the collections document crs list. This patch fixes it and adds unit tests to cover all possible cases. --- .../DiscoveryCollectionsDefaultCrs.java | 15 +- .../DiscoveryCollectionsDefaultCrsTest.java | 138 ++++++++++++++++++ .../discovery/collections/collections.json | 87 +++++++++++ 3 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 src/test/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsDefaultCrsTest.java create mode 100644 src/test/resources/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/collections.json diff --git a/src/main/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsDefaultCrs.java b/src/main/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsDefaultCrs.java index 75ce2222..945cdc7c 100644 --- a/src/main/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsDefaultCrs.java +++ b/src/main/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsDefaultCrs.java @@ -7,10 +7,11 @@ import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.opengis.cite.ogcapifeatures10.openapi3.TestPoint; import org.opengis.cite.ogcapifeatures10.util.JsonUtils; -import org.testng.SkipException; import org.testng.annotations.Test; import io.restassured.path.json.JsonPath; @@ -52,12 +53,14 @@ public void verifyCollectionsPathCollectionCrsPropertyContainsDefaultCrs( TestPo if ( hasAtLeastOneSpatialFeatureCollection( collection ) ) { String collectionId = (String) collection.get( "id" ); List crs = JsonUtils.parseAsList( "crs", collection ); - if ( crs.size() == 1 && "#/crs".equals( crs.get( 0 ) ) ) { + if(crs.contains("#/crs")) { List globalCrsList = JsonUtils.parseAsList( "crs", jsonPath ); - assertDefaultCrs( globalCrsList, - String.format( "Collection with id '%s' at collections path %s references to global crs section but provides at least one spatial feature collections. The global crs section does not specify one of the default CRS '%s' or '%s'", - collectionId, testPoint.getPath(), DEFAULT_CRS_CODE, - DEFAULT_CRS_WITH_HEIGHT_CODE ) ); + List expandedCrs = Stream.of(crs, globalCrsList).flatMap(List::stream) + .filter(code -> !"#/crs".equals(code)).collect(Collectors.toList()); + assertDefaultCrs( expandedCrs, + String.format( "Collection with id '%s' at collections path %s references to global crs section but provides at least one spatial feature collections. The global crs section does not specify one of the default CRS '%s' or '%s'", + collectionId, testPoint.getPath(), DEFAULT_CRS_CODE, + DEFAULT_CRS_WITH_HEIGHT_CODE ) ); } else { assertDefaultCrs( crs, String.format( "Collection with id '%s' at collections path %s does not specify one of the default CRS '%s' or '%s' but provides at least one spatial feature collections", diff --git a/src/test/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsDefaultCrsTest.java b/src/test/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsDefaultCrsTest.java new file mode 100644 index 00000000..9bd16eb5 --- /dev/null +++ b/src/test/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsDefaultCrsTest.java @@ -0,0 +1,138 @@ +package org.opengis.cite.ogcapifeatures10.conformance.crs.discovery.collections; + +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.opengis.cite.ogcapifeatures10.openapi3.TestPoint; +import org.testng.ISuite; +import org.testng.ITestContext; + +import io.restassured.path.json.JsonPath; + +/** + * @author Gabriel Roldan + */ +public class DiscoveryCollectionsDefaultCrsTest { + private static ITestContext testContext; + + private static TestPoint testPoint; + + /** + * Sample response from a {@code /collections} endpoint. Contains ex + */ + private static JsonPath collectionsResponse; + + private DiscoveryCollectionsDefaultCrs discoveryCollectionsDefaultCrs; + + @BeforeClass + public static void initTestFixture() throws Exception { + testContext = mock(ITestContext.class); + ISuite suite = mock(ISuite.class); + when(testContext.getSuite()).thenReturn(suite); + + testPoint = new TestPoint("http://localhost:8080/api/ogc/features/v1", "/collections", Collections.emptyMap()); + + collectionsResponse = prepareCollections(); + } + + @Before + public void setUp() { + discoveryCollectionsDefaultCrs = new DiscoveryCollectionsDefaultCrs(); + discoveryCollectionsDefaultCrs.initCommonFixture(testContext); + } + + /** + * Test a collection whose crs contains both its {@code storageCrs} and the + * global {@code #/crs} pointer + */ + @Test + public void testVerifyCollectionsPathCollectionCrsPropertyContainsDefaultCrs_globalCrsAndStorageCrs() { + Map collection = collectionsResponse.getMap("collections[0]"); + // preflight checks + assertNotNull(collection); + assertEquals("sf:archsites", collection.get("id")); + @SuppressWarnings("unchecked") + List crs = (List) collection.get("crs"); + assertThat(collection.get("storageCrs"), equalTo("http://www.opengis.net/def/crs/EPSG/0/26713")); + assertThat(crs, containsInAnyOrder("#/crs", "http://www.opengis.net/def/crs/EPSG/0/26713")); + + // test + discoveryCollectionsDefaultCrs.verifyCollectionsPathCollectionCrsPropertyContainsDefaultCrs(testPoint, + collectionsResponse, collection); + } + + /** + * Test a collection whose crs contains only the global {@code #/crs} pointer + */ + @Test + public void testVerifyCollectionsPathCollectionCrsPropertyContainsDefaultCrs_globalCrs() { + Map collection = collectionsResponse.getMap("collections[1]"); + // preflight checks + assertNotNull(collection); + assertEquals("ne:populated_places", collection.get("id")); + @SuppressWarnings("unchecked") + List crs = (List) collection.get("crs"); + assertThat(collection.get("storageCrs"), equalTo("http://www.opengis.net/def/crs/OGC/1.3/CRS84")); + assertThat(crs, contains("#/crs")); + + // test + discoveryCollectionsDefaultCrs.verifyCollectionsPathCollectionCrsPropertyContainsDefaultCrs(testPoint, + collectionsResponse, collection); + } + + /** + * Test a collection whose crs contains a list of crs identifiers without the + * global {@code #/crs} pointer + */ + @Test + public void testVerifyCollectionsPathCollectionCrsPropertyContainsDefaultCrs() { + Map collection = collectionsResponse.getMap("collections[2]"); + // preflight checks + assertNotNull(collection); + assertEquals("sf:bugsites", collection.get("id")); + @SuppressWarnings("unchecked") + List crs = (List) collection.get("crs"); + assertThat(collection.get("storageCrs"), equalTo("http://www.opengis.net/def/crs/EPSG/0/26713")); + assertThat(crs, contains("http://www.opengis.net/def/crs/EPSG/0/26713", + "http://www.opengis.net/def/crs/OGC/1.3/CRS84")); + + // test + discoveryCollectionsDefaultCrs.verifyCollectionsPathCollectionCrsPropertyContainsDefaultCrs(testPoint, + collectionsResponse, collection); + } + + /** + * Test a collection whose crs does not declare any of the default CRS nor has + * the global {@code #/crs} pointer + */ + @Test(expected = AssertionError.class) + public void testVerifyCollectionsPathCollectionCrsPropertyContainsDefaultCrs_no_default_crs() { + Map collection = collectionsResponse.getMap("collections[3]"); + // preflight checks + assertNotNull(collection); + assertEquals("no_default_crs", collection.get("id")); + + // AssertionError expected here + discoveryCollectionsDefaultCrs.verifyCollectionsPathCollectionCrsPropertyContainsDefaultCrs(testPoint, + collectionsResponse, collection); + } + + private static JsonPath prepareCollections() { + return new JsonPath(Objects + .requireNonNull(DiscoveryCollectionsDefaultCrsTest.class.getResourceAsStream("collections.json"))); + } +} diff --git a/src/test/resources/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/collections.json b/src/test/resources/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/collections.json new file mode 100644 index 00000000..f1a972b9 --- /dev/null +++ b/src/test/resources/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/collections.json @@ -0,0 +1,87 @@ +{ + "links": [ + { + "href": "http://localhost/api/ogc/features/v1/collections?f=json", + "rel": "self", + "type": "application/json", + "title": "This document" + } + ], + "collections": [ + { + "id": "sf:archsites", + "title": "Spearfish archeological sites", + "description": "Sample collection with a crs property having both its storageCrs and the #/crs JSON pointer", + "extent": { + "spatial": { + "crs": "http://www.opengis.net/def/crs/OGC/1.3/CRS84", + "bbox": [ + [ -103.8725637911543, 44.37740330855979, -103.63794182141925, 44.48804280772808 ] + ] + } + }, + "crs": [ + "http://www.opengis.net/def/crs/EPSG/0/26713", + "#/crs" + ], + "storageCrs": "http://www.opengis.net/def/crs/EPSG/0/26713" + }, + { + "id": "ne:populated_places", + "title": "Populated Places", + "description": "Sample collection whose crs property contains only the #/crs JSON pointer and the root crs list contains its storageCrs", + "extent": { + "spatial": { + "crs": "http://www.opengis.net/def/crs/OGC/1.3/CRS84", + "bbox": [ + [ -175.2205644999999, -41.29206799231509, 179.2166470999999, 64.14345946317033 ] + ] + } + }, + "crs": [ + "#/crs" + ], + "storageCrs": "http://www.opengis.net/def/crs/OGC/1.3/CRS84" + }, + { + "id": "sf:bugsites", + "title": "Spearfish bug locations", + "description": "Sample collection with no #/crs pointer", + "extent": { + "spatial": { + "crs": "http://www.opengis.net/def/crs/OGC/1.3/CRS84", + "bbox": [ + [ -103.86796132, 44.37393882, -103.63773523, 44.43418821 ] + ] + } + }, + "crs": [ + "http://www.opengis.net/def/crs/EPSG/0/26713", + "http://www.opengis.net/def/crs/OGC/1.3/CRS84" + ], + "storageCrs": "http://www.opengis.net/def/crs/EPSG/0/26713" + }, + { + "id": "no_default_crs", + "title": "Bogus crs sample", + "description": "Sample collection with no #/crs pointer and no default crs declared", + "extent": { + "spatial": { + "crs": "http://www.opengis.net/def/crs/OGC/1.3/CRS84", + "bbox": [ + [ -103.86796132, 44.37393882, -103.63773523, 44.43418821 ] + ] + } + }, + "crs": [ + "http://www.opengis.net/def/crs/EPSG/0/26713" + ], + "storageCrs": "http://www.opengis.net/def/crs/EPSG/0/26713" + } + ], + "crs": [ + "http://www.opengis.net/def/crs/OGC/1.3/CRS84", + "http://www.opengis.net/def/crs/EPSG/0/4326", + "http://www.opengis.net/def/crs/EPSG/0/3857" + ] +} \ No newline at end of file From 67d4e9bfc8b99ac3df595d51108f4abad5a0a7da Mon Sep 17 00:00:00 2001 From: Gabriel Roldan Date: Thu, 14 Nov 2024 15:01:12 -0300 Subject: [PATCH 2/2] Fix DiscoveryCollectionsStorageCrs look up of global crs DiscoveryCollectionsStorageCrs asserts that a `/collections` document complies with ``` Abstract Test 3: /conf/crs/storageCrs Test Purpose: Verify that the storage CRS identifier is a valid value Test Method: For each collection object that includes a storageCrs property in the paths /collections and /collections/{collectionId}, validate that the string is also found in the crs property of the collection or, in case the crs property includes a value #/crs, in the global list of CRSs. ``` but doesn't expand the collection's `#/crs` JSON pointer to the collections document crs list. This patch fixes it and adds unit tests to cover all possible cases. --- .../DiscoveryCollectionsStorageCrs.java | 21 +- .../DiscoveryCollectionsStorageCrsTest.java | 197 ++++++++++++++++++ .../discovery/collections/collections.json | 32 ++- 3 files changed, 239 insertions(+), 11 deletions(-) create mode 100644 src/test/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsStorageCrsTest.java diff --git a/src/main/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsStorageCrs.java b/src/main/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsStorageCrs.java index 420fd3fe..1eae8972 100644 --- a/src/main/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsStorageCrs.java +++ b/src/main/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsStorageCrs.java @@ -38,7 +38,7 @@ public class DiscoveryCollectionsStorageCrs extends AbstractDiscoveryCollections */ @Test(description = "Implements A.1 Discovery, Abstract Test 2 (Requirement /req/crs/fc-md-storageCrs-valid-value), " + "storageCrs property in the collection objects in the path /collections", dataProvider = "collectionItemUris", dependsOnGroups = "crs-conformance") - public void verifyCollectionsPathCollectionCrsPropertyContainsDefaultCrs( TestPoint testPoint, JsonPath jsonPath, + public void verifyCollectionsPathCollectionCrsPropertyContainsStorageCrs( TestPoint testPoint, JsonPath jsonPath, Map collection ) { String collectionId = (String) collection.get( "id" ); String storageCrs = (String) collection.get( "storageCrs" ); @@ -47,15 +47,18 @@ public void verifyCollectionsPathCollectionCrsPropertyContainsDefaultCrs( TestPo collectionId, testPoint.getPath() ) ); } List crs = JsonUtils.parseAsList( "crs", collection ); - if ( crs.size() == 1 && "#/crs".equals( crs.get( 0 ) ) ) { - List globalCrsList = JsonUtils.parseAsList( "crs", jsonPath ); - if ( !globalCrsList.contains( storageCrs ) ) { - throw new AssertionError( String.format( "Collection with id '%s' at collections path %s specifies the storageCrs '%s' which is not declared in the global list of CRSs", - collectionId, testPoint.getPath(), storageCrs ) ); - } - } else if ( !crs.contains( storageCrs ) ) { - throw new AssertionError( String.format( "Collection with id '%s' at collections path %s specifies the storageCrs '%s' which is not declared as crs property", + + if ( !crs.contains( storageCrs ) ) { + if( crs.contains("#/crs") ) { + List globalCrsList = JsonUtils.parseAsList( "crs", jsonPath ); + if ( !globalCrsList.contains( storageCrs ) ) { + throw new AssertionError( String.format( "Collection with id '%s' at collections path %s specifies the storageCrs '%s' which is not declared in the global list of CRSs", + collectionId, testPoint.getPath(), storageCrs ) ); + } + } else { + throw new AssertionError( String.format( "Collection with id '%s' at collections path %s specifies the storageCrs '%s' which is not declared as crs property", collectionId, testPoint.getPath(), storageCrs ) ); + } } } diff --git a/src/test/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsStorageCrsTest.java b/src/test/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsStorageCrsTest.java new file mode 100644 index 00000000..0d0b2650 --- /dev/null +++ b/src/test/java/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/DiscoveryCollectionsStorageCrsTest.java @@ -0,0 +1,197 @@ +package org.opengis.cite.ogcapifeatures10.conformance.crs.discovery.collections; + +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.opengis.cite.ogcapifeatures10.openapi3.TestPoint; +import org.testng.ISuite; +import org.testng.ITestContext; + +import io.restassured.path.json.JsonPath; + +/** + * @author Gabriel Roldan + */ +public class DiscoveryCollectionsStorageCrsTest { + private static ITestContext testContext; + + private static TestPoint testPoint; + + /** + * Sample response from a {@code /collections} endpoint. Contains ex + */ + private static JsonPath collectionsResponse; + + private DiscoveryCollectionsStorageCrs discoveryCollectionsStorageCrs; + + @BeforeClass + public static void initTestFixture() throws Exception { + testContext = mock(ITestContext.class); + ISuite suite = mock(ISuite.class); + when(testContext.getSuite()).thenReturn(suite); + + testPoint = new TestPoint("http://localhost:8080/api/ogc/features/v1", "/collections", Collections.emptyMap()); + + collectionsResponse = prepareCollections(); + } + + @Before + public void setUp() { + discoveryCollectionsStorageCrs = new DiscoveryCollectionsStorageCrs(); + discoveryCollectionsStorageCrs.initCommonFixture(testContext); + } + + /** + * Test a collection whose crs contains both its {@code storageCrs} and the + * global {@code #/crs} pointer + */ + @Test + public void testVerifyCollectionsPathCollectionCrsPropertyContainsStorageCrs_globalCrsAndStorageCrs() { + Map collection = collectionsResponse.getMap("collections[0]"); + // preflight checks + assertNotNull(collection); + assertEquals("sf:archsites", collection.get("id")); + + @SuppressWarnings("unchecked") + List crs = (List) collection.get("crs"); + assertThat(collection.get("storageCrs"), equalTo("http://www.opengis.net/def/crs/EPSG/0/26713")); + assertThat(crs, contains("http://www.opengis.net/def/crs/EPSG/0/26713", "#/crs")); + + // test + discoveryCollectionsStorageCrs.verifyCollectionsPathCollectionCrsPropertyContainsStorageCrs(testPoint, + collectionsResponse, collection); + } + + /** + * Test a collection whose crs contains only the global {@code #/crs} pointer, + * and the global crs property contains the collection's storageCrs + */ + @Test + public void testVerifyCollectionsPathCollectionCrsPropertyContainsStorageCrs_globalCrs_only() { + Map collection = collectionsResponse.getMap("collections[1]"); + // preflight checks + assertNotNull(collection); + assertEquals("ne:populated_places", collection.get("id")); + @SuppressWarnings("unchecked") + List crs = (List) collection.get("crs"); + assertThat(collection.get("storageCrs"), equalTo("http://www.opengis.net/def/crs/OGC/1.3/CRS84")); + assertThat(crs, contains("#/crs")); + + // test + discoveryCollectionsStorageCrs.verifyCollectionsPathCollectionCrsPropertyContainsStorageCrs(testPoint, + collectionsResponse, collection); + } + + /** + * Test a collection whose crs contains its {@code storageCrs} and no global + * {@code #/crs} pointer + */ + @Test + public void testVerifyCollectionsPathCollectionCrsPropertyContainsStorageCrs() { + Map collection = collectionsResponse.getMap("collections[2]"); + // preflight checks + assertNotNull(collection); + assertEquals("sf:bugsites", collection.get("id")); + @SuppressWarnings("unchecked") + List crs = (List) collection.get("crs"); + assertThat(collection.get("storageCrs"), equalTo("http://www.opengis.net/def/crs/EPSG/0/26713")); + assertThat(crs, containsInAnyOrder("http://www.opengis.net/def/crs/OGC/1.3/CRS84", + "http://www.opengis.net/def/crs/EPSG/0/26713")); + + // test + discoveryCollectionsStorageCrs.verifyCollectionsPathCollectionCrsPropertyContainsStorageCrs(testPoint, + collectionsResponse, collection); + } + + /** + * Test a collection whose storageCrs is declared in the global crs but not on + * its crs property, but it does contain the global {@code #/crs} pointer. + */ + @Test + public void testVerifyCollectionsPathCollectionCrsPropertyContainsStorageCrs_globalCrs_and_custom_crs() { + Map collection = collectionsResponse.getMap("collections[4]"); + // preflight checks + assertNotNull(collection); + assertEquals("storageCrsInGlobalCrs", collection.get("id")); + @SuppressWarnings("unchecked") + List crs = (List) collection.get("crs"); + assertThat(collection.get("storageCrs"), equalTo("http://www.opengis.net/def/crs/EPSG/0/4087")); + assertThat(crs, containsInAnyOrder("#/crs", "http://www.opengis.net/def/crs/EPSG/0/3786")); + + @SuppressWarnings("unchecked") + List globalCrs = (List) collectionsResponse.get("crs"); + assertTrue(globalCrs.contains("http://www.opengis.net/def/crs/EPSG/0/4087")); + + // AssertionError expected here + discoveryCollectionsStorageCrs.verifyCollectionsPathCollectionCrsPropertyContainsStorageCrs(testPoint, + collectionsResponse, collection); + } + + /** + * Test a collection whose storageCrs is not declared in its crs and has no + * pointer to the global crs + */ + @Test(expected = AssertionError.class) + public void testVerifyCollectionsPathCollectionCrsPropertyContainsStorageCrs_no_storage_crs() { + Map collection = collectionsResponse.getMap("collections[5]"); + // preflight checks + assertNotNull(collection); + assertEquals("storageCrsUndeclared", collection.get("id")); + + @SuppressWarnings("unchecked") + List crs = (List) collection.get("crs"); + assertThat(collection.get("storageCrs"), equalTo("http://www.opengis.net/def/crs/EPSG/0/4088")); + assertThat(crs, not(contains("#/crs"))); + + @SuppressWarnings("unchecked") + List globalCrs = (List) collectionsResponse.get("crs"); + assertFalse(globalCrs.contains("http://www.opengis.net/def/crs/EPSG/0/4088")); + + // AssertionError expected here + discoveryCollectionsStorageCrs.verifyCollectionsPathCollectionCrsPropertyContainsStorageCrs(testPoint, + collectionsResponse, collection); + } + + @Test(expected = AssertionError.class) + public void testVerifyCollectionsPathCollectionCrsPropertyContainsStorageCrs_no_storage_crs_in_global_crs() { + Map collection = collectionsResponse.getMap("collections[6]"); + // preflight checks + assertNotNull(collection); + assertEquals("storageCrsUndeclaredInGlobalCrs", collection.get("id")); + + @SuppressWarnings("unchecked") + List crs = (List) collection.get("crs"); + assertThat(collection.get("storageCrs"), equalTo("http://www.opengis.net/def/crs/EPSG/0/4088")); + assertThat(crs, contains("#/crs")); + + @SuppressWarnings("unchecked") + List globalCrs = (List) collectionsResponse.get("crs"); + assertFalse(globalCrs.contains("http://www.opengis.net/def/crs/EPSG/0/4088")); + + // AssertionError expected here + discoveryCollectionsStorageCrs.verifyCollectionsPathCollectionCrsPropertyContainsStorageCrs(testPoint, + collectionsResponse, collection); + } + + private static JsonPath prepareCollections() { + return new JsonPath(Objects + .requireNonNull(DiscoveryCollectionsStorageCrsTest.class.getResourceAsStream("collections.json"))); + } +} diff --git a/src/test/resources/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/collections.json b/src/test/resources/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/collections.json index f1a972b9..4294ea31 100644 --- a/src/test/resources/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/collections.json +++ b/src/test/resources/org/opengis/cite/ogcapifeatures10/conformance/crs/discovery/collections/collections.json @@ -60,7 +60,7 @@ "http://www.opengis.net/def/crs/OGC/1.3/CRS84" ], "storageCrs": "http://www.opengis.net/def/crs/EPSG/0/26713" - }, + }, { "id": "no_default_crs", "title": "Bogus crs sample", @@ -77,11 +77,39 @@ "http://www.opengis.net/def/crs/EPSG/0/26713" ], "storageCrs": "http://www.opengis.net/def/crs/EPSG/0/26713" + }, + { + "id": "storageCrsInGlobalCrs", + "title": "Storage Crs In Global Crs", + "description": "Sampe collection whose storageCrs is only declared in the global crs, but has more codes on its crs property", + "crs": [ + "http://www.opengis.net/def/crs/EPSG/0/3786", + "#/crs" + ], + "storageCrs": "http://www.opengis.net/def/crs/EPSG/0/4087" + }, + { + "id": "storageCrsUndeclared", + "title": "Storage Crs Undeclared In Global crs", + "description": "Sample whose storageCrs is not declared in its crs", + "crs": [ + ], + "storageCrs": "http://www.opengis.net/def/crs/EPSG/0/4088" + }, + { + "id": "storageCrsUndeclaredInGlobalCrs", + "title": "Storage Crs Undeclared In Global crs", + "description": "Sample whose storageCrs is not declared in its crs nor in the global crs", + "crs": [ + "#/crs" + ], + "storageCrs": "http://www.opengis.net/def/crs/EPSG/0/4088" } ], "crs": [ "http://www.opengis.net/def/crs/OGC/1.3/CRS84", "http://www.opengis.net/def/crs/EPSG/0/4326", - "http://www.opengis.net/def/crs/EPSG/0/3857" + "http://www.opengis.net/def/crs/EPSG/0/3857", + "http://www.opengis.net/def/crs/EPSG/0/4087" ] } \ No newline at end of file