extract-cbd-shape
Version:
Extract an entity based on CBD and a SHACL shape
134 lines (119 loc) • 5.36 kB
text/typescript
import {assert} from "chai";
import {DataFactory} from "rdf-data-factory";
import {RdfStore} from "rdf-stores";
import {CBDShapeExtractor} from "../../lib/extract-cbd-shape";
import {rdfDereferencer} from "rdf-dereference";
import sinon, {SinonStub} from "sinon";
const df = new DataFactory();
describe("Check whether a member from the MRG source can be fully extracted", function () {
let fetchStub: SinonStub;
before(() => {
// Mock the global fetch function
fetchStub = sinon.stub(global, "fetch");
// Mock response for the specific MRG member URL
fetchStub
.withArgs("http://marineregions.org/mrgid/24983")
.resolves(
new Response(
`
@prefix mr: <http://marineregions.org/ns/ontology#> .
@prefix mrt: <http://marineregions.org/ns/placetypes#> .
@prefix dc: <http://purl.org/dc/terms/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix dcat: <http://www.w3.org/ns/dcat#> .
@prefix gsp: <http://www.opengis.net/ont/geosparql#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
<http://marineregions.org/mrgid/24983>
a mr:MRGeoObject, mrt:Escarpment ;
mr:hasGeometry <http://marineregions.org/mrgid/24983/geometries?source=110&attributeValue=2004> ;
mr:isPartOf <http://marineregions.org/mrgid/4300>, <http://marineregions.org/mrgid/8487> ;
dc:modified "2023-07-24T14:14:57Z"^^xsd:dateTime ;
skos:altLabel "Minami Amami Escarpment"@en, "Minami Anami Escarpment"@en ;
skos:prefLabel "Minami-Amami Escarpment"@en ;
dcat:bbox "<http://www.opengis.net/def/crs/OGC/1.3/CRS84> POLYGON ((133.4 27.5,133.4 27.5,133.4 27,133.4 27,133.4 27.5))"^^gsp:wktLiteral ;
dcat:centroid "<http://www.opengis.net/def/crs/OGC/1.3/CRS84> POINT (133.4 27.25)"^^gsp:wktLiteral ;
prov:hadPrimarySource <http://www.ngdc.noaa.gov/gazetteer/> .
<http://marineregions.org/mrgid/4300>
a mr:MRGeoObject, mrt:IHOSeaArea ;
skos:prefLabel "Philippine Sea"@en .
<http://marineregions.org/mrgid/8487>
a mr:MRGeoObject, mrt:EEZ ;
skos:prefLabel "Japanese Exclusive Economic Zone"@en .
<http://www.ngdc.noaa.gov/gazetteer/> rdfs:label "IHO-IOC GEBCO Gazetteer of Undersea Feature Names"^^xsd:string .
`,
{
status: 200,
headers: {"Content-Type": "text/turtle"},
}
)
);
// Mock response for the specific MRG geometry URL
fetchStub
.withArgs("http://marineregions.org/mrgid/24983/geometries?source=110&attributeValue=2004")
.resolves(
new Response(
`
@prefix mr: <http://marineregions.org/ns/ontology#> .
@prefix gsp: <http://www.opengis.net/ont/geosparql#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<http://marineregions.org/mrgid/24983> mr:hasGeometry <http://marineregions.org/mrgid/24983/geometries?source=110&attributeValue=2004> .
<http://marineregions.org/mrgid/24983/geometries?source=110&attributeValue=2004>
gsp:asWKT "<http://www.opengis.net/def/crs/OGC/1.3/CRS84> LINESTRING (133.4 27, 133.4 27.5)"^^gsp:wktLiteral ;
prov:hadPrimarySource <http://www.ngdc.noaa.gov/gazetteer/> .
<http://www.ngdc.noaa.gov/gazetteer/> rdfs:label "IHO-IOC GEBCO Gazetteer of Undersea Feature Names"^^xsd:string .
`,
{
status: 200,
headers: {"Content-Type": "text/turtle"},
}
)
);
});
after(() => {
// Restore the original fetch function
fetchStub.restore();
});
it("Extract a shape from MRG and check whether it successfully did a call to a geometry it needs", async () => {
let shapeStore = RdfStore.createDefault();
let readStream = (
await rdfDereferencer.dereference(
"./tests/02 - marine regions LDES/shacl.ttl",
{localFiles: true},
)
).data;
await new Promise((resolve, reject) => {
shapeStore.import(readStream).on("end", resolve).on("error", reject);
});
let extractor = new CBDShapeExtractor(shapeStore);
let dataStore = RdfStore.createDefault();
let readStream2 = (
await rdfDereferencer.dereference(
"./tests/02 - marine regions LDES/data.ttl",
{localFiles: true},
)
).data;
await new Promise((resolve, reject) => {
dataStore.import(readStream2).on("end", resolve).on("error", reject);
});
let result = await extractor.extract(
dataStore,
df.namedNode("http://marineregions.org/mrgid/24983?t=1690208097"),
df.namedNode("http://example.org/shape"),
);
assert(fetchStub.calledWith("http://marineregions.org/mrgid/24983"));
assert(fetchStub.calledWith("http://marineregions.org/mrgid/24983/geometries?source=110&attributeValue=2004"));
assert.equal(
result.filter((quad) => {
return (
quad.subject.value ===
"http://marineregions.org/mrgid/24983/geometries?source=110&attributeValue=2004"
);
}).length,
2,
); // Test whether it actually did a call
});
});