forked from MapComplete/MapComplete
276 lines
14 KiB
TypeScript
276 lines
14 KiB
TypeScript
|
import { describe, expect, it } from "vitest"
|
||
|
import LinkedDataLoader from "../../../src/Logic/Web/LinkedDataLoader"
|
||
|
|
||
|
|
||
|
describe("LinkedDataLoader", () => {
|
||
|
it("should compact a shop entry", async () => {
|
||
|
const graph = {
|
||
|
"@context": "http://schema.org",
|
||
|
"@type": "LocalBusiness",
|
||
|
"@id": "http://stores.delhaize.be/nl/ad-delhaize-munsterbilzen",
|
||
|
"name": "AD Delhaize Munsterbilzen",
|
||
|
"url": "http://stores.delhaize.be/nl/ad-delhaize-munsterbilzen",
|
||
|
"logo": "https://stores.delhaize.be/build/images/web/shop/delhaize-be/favicon.ico",
|
||
|
"image": "http://stores.delhaize.be/image/mobilosoft-testing?apiPath=rehab/delhaize-be/images/location/ad%20delhaize%20image%20ge%CC%81ne%CC%81rale%20%281%29%201652787176865&imageSize=h_500",
|
||
|
"email": "",
|
||
|
"telephone": "+3289413520",
|
||
|
"address": {
|
||
|
"@type": "PostalAddress",
|
||
|
"streetAddress": "Waterstraat, 18",
|
||
|
"addressLocality": "Bilzen",
|
||
|
"postalCode": "3740",
|
||
|
"addressCountry": "BE",
|
||
|
},
|
||
|
"geo": {
|
||
|
"@type": "GeoCoordinates",
|
||
|
"latitude": 50.8906898,
|
||
|
"longitude": 5.5260586,
|
||
|
},
|
||
|
"openingHoursSpecification": [
|
||
|
{
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "Tuesday",
|
||
|
"opens": "08:00",
|
||
|
"closes": "18:30",
|
||
|
},
|
||
|
{
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "Wednesday",
|
||
|
"opens": "08:00",
|
||
|
"closes": "18:30",
|
||
|
},
|
||
|
{
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "Thursday",
|
||
|
"opens": "08:00",
|
||
|
"closes": "18:30",
|
||
|
},
|
||
|
{
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "Friday",
|
||
|
"opens": "08:00",
|
||
|
"closes": "18:30",
|
||
|
},
|
||
|
{
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "Saturday",
|
||
|
"opens": "08:00",
|
||
|
"closes": "18:30",
|
||
|
},
|
||
|
{
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "Sunday",
|
||
|
"opens": "08:00",
|
||
|
"closes": "12:00",
|
||
|
},
|
||
|
{
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "Monday",
|
||
|
"opens": "12:00",
|
||
|
"closes": "18:30",
|
||
|
},
|
||
|
],
|
||
|
"@base": "https://stores.delhaize.be/nl/ad-delhaize-munsterbilzen",
|
||
|
}
|
||
|
const compacted = await LinkedDataLoader.compact(graph)
|
||
|
expect(compacted.phone).equal("+32 89 41 35 20")
|
||
|
})
|
||
|
it("should handle velopark data", async () => {
|
||
|
const veloparkEntry = {
|
||
|
"@context": {
|
||
|
"xsd": "http://www.w3.org/2001/XMLSchema#",
|
||
|
"schema": "http://schema.org/",
|
||
|
"mv": "http://schema.mobivoc.org/",
|
||
|
"dct": "http://purl.org/dc/terms#",
|
||
|
"dbo": "http://dbpedia.org/ontology/",
|
||
|
"gr": "http://purl.org/goodrelations/v1#",
|
||
|
"vp": "https://data.velopark.be/openvelopark/vocabulary#",
|
||
|
"vpt": "https://data.velopark.be/openvelopark/terms#",
|
||
|
"PostalAddress": "schema:PostalAddress",
|
||
|
"GeoCoordinates": "schema:GeoCoordinates",
|
||
|
"GeoShape": "schema:GeoShape",
|
||
|
"Map": "schema:Map",
|
||
|
"ContactPoint": "schema:ContactPoint",
|
||
|
"Language": "schema:Language",
|
||
|
"OpeningHoursSpecification": "schema:OpeningHoursSpecification",
|
||
|
"WebSite": "schema:WebSite",
|
||
|
"PriceSpecification": "schema:PriceSpecification",
|
||
|
"Photograph": "schema:Photograph",
|
||
|
"Place": "schema:Place",
|
||
|
"BicycleParkingStation": "mv:BicycleParkingStation",
|
||
|
"Entrance": "mv:ParkingFacilityEntrance",
|
||
|
"Exit": "mv:ParkingFacilityExit",
|
||
|
"TimeSpecification": "mv:TimeSpecification",
|
||
|
"Bicycle": "vp:Bicycle",
|
||
|
"AllowedBicycle": "vp:AllowedBicycle",
|
||
|
"BikeParkingFeature": "vp:BikeParkingFeature",
|
||
|
"SecurityFeature": "vp:SecurityFeature",
|
||
|
"PublicBicycleParking": "vpt:PublicBicycleParking",
|
||
|
"ResidentBicycleParking": "vpt:ResidentBicycleParking",
|
||
|
"BicycleLocker": "vpt:BicycleLocker",
|
||
|
"RegularBicycle": "vpt:RegularBicycle",
|
||
|
"ElectricBicycle": "vpt:ElectricBicycle",
|
||
|
"CargoBicycle": "vpt:CargoBicycle",
|
||
|
"TandemBicycle": "vpt:TandemBicycle",
|
||
|
"CameraSurveillance": "vpt:CameraSurveillance",
|
||
|
"PersonnelSupervision": "vpt:PersonnelSupervision",
|
||
|
"ElectronicAccess": "vpt:ElectronicAccess",
|
||
|
"BicyclePump": "vpt:BicyclePump",
|
||
|
"MaintenanceService": "vpt:MaintenanceService",
|
||
|
"ChargingPoint": "vpt:ChargingPoint",
|
||
|
"LockerService": "vpt:LockerService",
|
||
|
"ToiletService": "vpt:ToiletService",
|
||
|
"BikeRentalService": "vpt:BikeRentalService",
|
||
|
"BusinessEntity": "gr:BusinessEntity",
|
||
|
"address": "schema:address",
|
||
|
"geo": "schema:geo",
|
||
|
"hasMap": "schema:hasMap",
|
||
|
"url": "schema:url",
|
||
|
"image": "schema:image",
|
||
|
"contactPoint": "schema:contactPoint",
|
||
|
"interactionService": "schema:interactionService",
|
||
|
"dueForTime": "mv:dueForTime",
|
||
|
"ownedBy": "mv:ownedBy",
|
||
|
"operatedBy": "mv:operatedBy",
|
||
|
"rights": "dct:rights",
|
||
|
"about": { "@id": "schema:about", "@type": "@id" },
|
||
|
"description": { "@id": "schema:description", "@type": "xsd:string" },
|
||
|
"dateModified": { "@id": "schema:dateModified", "@type": "xsd:dateTime" },
|
||
|
"name": { "@id": "schema:name", "@container": "@set" },
|
||
|
"value": { "@id": "schema:value", "@type": "xsd:boolean" },
|
||
|
"postalCode": { "@id": "schema:postalCode", "@type": "xsd:string" },
|
||
|
"streetAddress": { "@id": "schema:streetAddress", "@type": "xsd:string" },
|
||
|
"country": { "@id": "schema:addressCountry", "@type": "xsd:string" },
|
||
|
"polygon": { "@id": "schema:polygon", "@type": "xsd:string" },
|
||
|
"latitude": { "@id": "schema:latitude", "@type": "xsd:double" },
|
||
|
"longitude": { "@id": "schema:longitude", "@type": "xsd:double" },
|
||
|
"openingHoursSpecification": { "@id": "schema:openingHoursSpecification", "@container": "@set" },
|
||
|
"contactType": { "@id": "schema:contactType", "@type": "xsd:string" },
|
||
|
"email": { "@id": "schema:email", "@type": "xsd:string" },
|
||
|
"telephone": { "@id": "schema:telephone", "@type": "xsd:string" },
|
||
|
"availableLanguage": { "@id": "schema:availableLanguage", "@container": "@set" },
|
||
|
"hoursAvailable": { "@id": "schema:hoursAvailable", "@container": "@set" },
|
||
|
"dayOfWeek": { "@id": "schema:dayOfWeek", "@type": "@id" },
|
||
|
"opens": { "@id": "schema:opens", "@type": "xsd:time" },
|
||
|
"closes": { "@id": "schema:closes", "@type": "xsd:time" },
|
||
|
"sectionName": { "@id": "schema:name", "@type": "xsd:string" },
|
||
|
"publicAccess": { "@id": "schema:publicAccess", "@type": "xsd:boolean" },
|
||
|
"priceSpecification": { "@id": "schema:priceSpecification", "@container": "@set" },
|
||
|
"price": { "@id": "schema:price", "@type": "xsd:double" },
|
||
|
"currency": { "@id": "schema:priceCurrency", "@type": "xsd:string" },
|
||
|
"amenityFeature": { "@id": "schema:amenityFeature", "@container": "@set" },
|
||
|
"photos": { "@id": "schema:photos", "@container": "@set" },
|
||
|
"entrance": { "@id": "mv:entrance", "@container": "@set" },
|
||
|
"exit": { "@id": "mv:exit", "@container": "@set" },
|
||
|
"numberOfLevels": { "@id": "mv:numberOfLevels", "@type": "xsd:integer" },
|
||
|
"totalCapacity": { "@id": "mv:totalCapacity", "@type": "xsd:integer" },
|
||
|
"liveCapacity": { "@id": "mv:capacity", "@type": "@id" },
|
||
|
"currentValue": { "@id": "mv:currentValue", "@type": "xsd:integer" },
|
||
|
"freeOfCharge": { "@id": "mv:freeOfCharge", "@type": "xsd:boolean" },
|
||
|
"timeStartValue": { "@id": "mv:timeStartValue", "@type": "xsd:double" },
|
||
|
"timeEndValue": { "@id": "mv:timeEndValue", "@type": "xsd:double" },
|
||
|
"timeUnit": { "@id": "mv:timeUnit", "@type": "xsd:string" },
|
||
|
"startDate": { "@id": "vp:startDate", "@type": "xsd:dateTime" },
|
||
|
"endDate": { "@id": "vp:endDate", "@type": "xsd:dateTime" },
|
||
|
"allows": { "@id": "vp:allows", "@container": "@set" },
|
||
|
"covered": { "@id": "vp:covered", "@type": "xsd:boolean" },
|
||
|
"maximumParkingDuration": { "@id": "vp:maximumParkingDuration", "@type": "xsd:duration" },
|
||
|
"openingHoursExtraInformation": { "@id": "vp:openingHoursExtraInformation", "@type": "xsd:string" },
|
||
|
"intendedAudience": { "@id": "vp:intendedAudience", "@type": "xsd:string" },
|
||
|
"restrictions": { "@id": "vp:restrictions", "@type": "xsd:string" },
|
||
|
"removalConditions": { "@id": "vp:removalConditions", "@type": "xsd:string" },
|
||
|
"postRemovalAction": { "@id": "vp:postRemovalAction", "@type": "xsd:string" },
|
||
|
"bicycleType": { "@id": "vp:bicycleType", "@type": "@id" },
|
||
|
"bicyclesAmount": { "@id": "vp:bicyclesAmount", "@type": "xsd:integer" },
|
||
|
"countingSystem": { "@id": "vp:countingSystem", "@type": "xsd:boolean" },
|
||
|
"companyName": { "@id": "gr:legalName", "@type": "xsd:string" },
|
||
|
"identifier": { "@id": "dct:identifier", "@type": "xsd:string" },
|
||
|
"date": { "@id": "dct:date", "@type": "xsd:dateTime" },
|
||
|
"closeTo": { "@id": "dbo:closeTo", "@container": "@set" },
|
||
|
"temporarilyClosed": { "@id": "vp:temporarilyClosed", "@type": "xsd:boolean" },
|
||
|
},
|
||
|
"@id": "https://data.velopark.be/data/De-Lijn_303749",
|
||
|
"@type": "BicycleParkingStation",
|
||
|
"dateModified": "2020-04-28T12:34:06.227Z",
|
||
|
"identifier": "303749",
|
||
|
"name": [{ "@value": " Meise Van Dievoetlaan", "@language": "nl" }],
|
||
|
"temporarilyClosed": false,
|
||
|
"ownedBy": { "@id": "https://www.delijn.be/", "@type": "BusinessEntity", "companyName": "De Lijn" },
|
||
|
"operatedBy": { "@id": "https://www.delijn.be/", "@type": "BusinessEntity", "companyName": "De Lijn" },
|
||
|
"address": {
|
||
|
"@type": "PostalAddress",
|
||
|
"postalCode": "1860",
|
||
|
"streetAddress": "Nieuwelaan",
|
||
|
"country": "Belgium",
|
||
|
},
|
||
|
"hasMap": { "@type": "Map", "url": "https://www.openstreetmap.org/#map=18/50.94047/4.324813" },
|
||
|
"interactionService": { "@type": "WebSite", "url": "https://www.delijn.be/en/contact/" },
|
||
|
"@graph": [{
|
||
|
"@type": "https://data.velopark.be/openvelopark/terms#BicycleStand",
|
||
|
"openingHoursSpecification": [{
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "http://schema.org/Monday",
|
||
|
"opens": "00:00",
|
||
|
"closes": "23:59",
|
||
|
}, {
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "http://schema.org/Tuesday",
|
||
|
"opens": "00:00",
|
||
|
"closes": "23:59",
|
||
|
}, {
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "http://schema.org/Wednesday",
|
||
|
"opens": "00:00",
|
||
|
"closes": "23:59",
|
||
|
}, {
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "http://schema.org/Thursday",
|
||
|
"opens": "00:00",
|
||
|
"closes": "23:59",
|
||
|
}, {
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "http://schema.org/Friday",
|
||
|
"opens": "00:00",
|
||
|
"closes": "23:59",
|
||
|
}, {
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "http://schema.org/Saturday",
|
||
|
"opens": "00:00",
|
||
|
"closes": "23:59",
|
||
|
}, {
|
||
|
"@type": "OpeningHoursSpecification",
|
||
|
"dayOfWeek": "http://schema.org/Sunday",
|
||
|
"opens": "00:00",
|
||
|
"closes": "23:59",
|
||
|
}],
|
||
|
"maximumParkingDuration": "P30D",
|
||
|
"publicAccess": true,
|
||
|
"numberOfLevels": 1,
|
||
|
"covered": false,
|
||
|
"totalCapacity": 5,
|
||
|
"allows": [{
|
||
|
"@type": "AllowedBicycle",
|
||
|
"bicycleType": "https://data.velopark.be/openvelopark/terms#RegularBicycle",
|
||
|
"bicyclesAmount": 5,
|
||
|
"countingSystem": false,
|
||
|
}],
|
||
|
"geo": [{ "@type": "GeoCoordinates", "latitude": 50.94047, "longitude": 4.324813 }],
|
||
|
"priceSpecification": [{ "@type": "PriceSpecification", "freeOfCharge": true }],
|
||
|
"@id": "https://data.velopark.be/data/De-Lijn_303749#section1",
|
||
|
}],
|
||
|
}
|
||
|
|
||
|
const compacted = await LinkedDataLoader.compact(veloparkEntry)
|
||
|
expect(compacted.fee).equal("no")
|
||
|
expect(compacted.operator).equal("De Lijn")
|
||
|
|
||
|
expect(compacted.building).equal("bicycle_shed")
|
||
|
expect(compacted.access).equal("yes")
|
||
|
expect(compacted.max_stay).equal("30 days")
|
||
|
expect(compacted.opening_hours).equal("24/7")
|
||
|
|
||
|
|
||
|
|
||
|
})
|
||
|
})
|