UNPKG

terriajs

Version:

Geospatial data visualization platform.

329 lines (275 loc) 11.7 kB
import { configure, runInAction } from "mobx"; import { http, HttpResponse } from "msw"; import Terria from "../../../../lib/Models/Terria"; import ArcGisMapServerCatalogGroup from "../../../../lib/Models/Catalog/Esri/ArcGisMapServerCatalogGroup"; import CommonStrata from "../../../../lib/Models/Definition/CommonStrata"; import i18next from "i18next"; import ArcGisMapServerCatalogItem from "../../../../lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem"; import { worker } from "../../../mocks/browser"; import redlandsMapServerJson from "../../../../wwwroot/test/ArcGisMapServer/Redlands_Emergency_Vehicles/mapServer.json"; import redlands17Json from "../../../../wwwroot/test/ArcGisMapServer/Redlands_Emergency_Vehicles/17.json"; import singleFusedMapCacheMapServerJson from "../../../../wwwroot/test/ArcGisMapServer/SingleFusedMapCache/mapserver.json"; import singleFusedMapCacheLegendJson from "../../../../wwwroot/test/ArcGisMapServer/SingleFusedMapCache/legend.json"; import singleFusedMapCacheLayersJson from "../../../../wwwroot/test/ArcGisMapServer/SingleFusedMapCache/layers.json"; import residentialMapServerJson from "../../../../wwwroot/test/ArcGisMapServer/Residential_Dwelling_Density/mapServer.json"; configure({ enforceActions: "observed", computedRequiresReaction: true }); describe("ArcGisMapServerCatalogGroup", function () { const mapServerUrl = "http://example.com/arcgis/rest/services/Redlands_Emergency_Vehicles/MapServer"; const mapServerErrorUrl = "http://example.com/arcgis/rest/services/unknown/MapServer"; let terria: Terria; let group: ArcGisMapServerCatalogGroup; beforeEach(function () { terria = new Terria({ baseUrl: "./" }); group = new ArcGisMapServerCatalogGroup("test", terria); worker.use( // Redlands MapServer - sub-layer 17 http.get( "http://example.com/arcgis/rest/services/Redlands_Emergency_Vehicles/MapServer/17", () => HttpResponse.json(redlands17Json) ), // Redlands MapServer root http.get( "http://example.com/arcgis/rest/services/Redlands_Emergency_Vehicles/MapServer", () => HttpResponse.json(redlandsMapServerJson) ), // SingleFusedMapCache MapServer http.get( "http://www.example.com/SingleFusedMapCache/MapServer/Layers", () => HttpResponse.json(singleFusedMapCacheLayersJson) ), http.get( "http://www.example.com/SingleFusedMapCache/MapServer/Legend", () => HttpResponse.json(singleFusedMapCacheLegendJson) ), http.get("http://www.example.com/SingleFusedMapCache/MapServer", () => HttpResponse.json(singleFusedMapCacheMapServerJson) ), // Error tests: unknown MapServer returns network error http.get( "http://example.com/arcgis/rest/services/unknown/MapServer", () => HttpResponse.error() ) ); }); it("has a type and typeName", function () { expect(group.type).toBe("esri-mapServer-group"); expect(group.typeName).toBe( i18next.t("models.arcGisMapServerCatalogGroup.name") ); }); describe("after loading metadata", function () { beforeEach(async function () { runInAction(() => { group.setTrait("definition", "url", mapServerUrl); }); await group.loadMetadata(); }); it("defines info", function () { const serviceDescription = i18next.t( "models.arcGisMapServerCatalogGroup.serviceDescription" ); const dataDescription = i18next.t( "models.arcGisMapServerCatalogGroup.dataDescription" ); const copyrightText = i18next.t( "models.arcGisMapServerCatalogGroup.copyrightText" ); expect(group.info.map(({ name }) => name)).toEqual([ serviceDescription, dataDescription, copyrightText ]); expect(group.info.map(({ content }) => content)).toEqual([ "Vehicle Service Description", "Vehicle Description", "Vehicle Copyright" ]); }); }); describe("loadMembers", function () { it("properly creates members", async function () { runInAction(() => { group.setTrait(CommonStrata.definition, "url", mapServerUrl); }); await group.loadMembers(); expect(group.members).toBeDefined(); expect(group.members.length).toBe(4); expect(group.memberModels).toBeDefined(); expect(group.memberModels.length).toBe(4); const member0 = group.memberModels[0] as ArcGisMapServerCatalogItem; const member1 = group.memberModels[1] as ArcGisMapServerCatalogItem; const member2 = group.memberModels[2] as ArcGisMapServerCatalogItem; const member3 = group.memberModels[3] as ArcGisMapServerCatalogGroup; expect(member0.name).toBe("Ambulances"); expect(member0.url).toBe(mapServerUrl + "/0"); expect(member1.name).toBe("Police"); expect(member1.url).toBe(mapServerUrl + "/1"); expect(member2.name).toBe("Fire"); expect(member2.url).toBe(mapServerUrl + "/25"); expect(member3.name).toBe("911 Calls Hotspot"); expect(member3.url).toBe(mapServerUrl + "/17"); expect(member3.members.length).toBe(0); expect(member3.memberModels.length).toBe(0); await member3.loadMembers(); expect(member3.members.length).toBe(2); expect(member3.memberModels.length).toBe(2); const member4 = member3.memberModels[0] as ArcGisMapServerCatalogGroup; const member5 = member3.memberModels[1] as ArcGisMapServerCatalogGroup; expect(member4.name).toBe("Output Features"); expect(member4.url).toBe(mapServerUrl + "/23"); expect(member5.name).toBe("Hotspot Raster"); expect(member5.url).toBe(mapServerUrl + "/27"); }); it("throws error on unavailable url", async function () { runInAction(() => { group.setTrait(CommonStrata.definition, "url", mapServerErrorUrl); }); const error = (await group.loadMembers()).error; expect(error).toBeDefined("Load member should error"); }); it("throws error if it's not mapserver ", async function () { runInAction(() => { group.setTrait(CommonStrata.definition, "url", mapServerErrorUrl); }); const error = (await group.loadMembers()).error; expect(error).toBeDefined("Load member should error"); }); }); describe("Supports MapServer with token", function () { beforeEach(async function () { runInAction(() => { group.setTrait(CommonStrata.definition, "url", mapServerUrl); group.setTrait(CommonStrata.definition, "token", "test-token"); }); }); it("Uses token in url", async function () { worker.use( http.get( "http://example.com/arcgis/rest/services/Redlands_Emergency_Vehicles/MapServer", ({ request }) => { if (new URL(request.url).searchParams.get("token") !== "test-token") return HttpResponse.error(); return HttpResponse.json(redlandsMapServerJson); } ) ); await group.loadMembers(); expect(group.members.length).toBe(4); }); it("Correctly passes token to members", async function () { await group.loadMembers(); expect(group.members).toBeDefined(); expect(group.members.length).toBe(4); expect(group.memberModels).toBeDefined(); expect(group.memberModels.length).toBe(4); const member0 = group.memberModels[0] as ArcGisMapServerCatalogItem; const member1 = group.memberModels[1] as ArcGisMapServerCatalogItem; const member2 = group.memberModels[2] as ArcGisMapServerCatalogItem; const member3 = group.memberModels[3] as ArcGisMapServerCatalogGroup; expect(member0.token).toBe("test-token"); expect(member1.token).toBe("test-token"); expect(member2.token).toBe("test-token"); expect(member3.token).toBe("test-token"); await member3.loadMembers(); const member4 = member3.memberModels[0] as ArcGisMapServerCatalogGroup; const member5 = member3.memberModels[1] as ArcGisMapServerCatalogGroup; expect(member4.token).toBe("test-token"); expect(member5.token).toBe("test-token"); }); }); describe("Supports MapServer with TilesOnly single fused map cache", function () { beforeEach(async () => { runInAction(() => { group.setTrait( CommonStrata.definition, "url", "http://www.example.com/SingleFusedMapCache/MapServer" ); }); (await group.loadMembers()).throwIfError(); }); it('Creates a single item called "models.arcGisMapServerCatalogGroup.singleFusedMapCacheLayerName"', function () { expect(group.memberModels.length).toBe(1); expect( group.memberModels[0] instanceof ArcGisMapServerCatalogItem ).toBeTruthy(); const item = group.memberModels[0] as ArcGisMapServerCatalogItem; expect(item.name).toBe( "models.arcGisMapServerCatalogGroup.singleFusedMapCacheLayerName" ); expect(item.layers).toBeUndefined(); expect(item.layersArray.length).toBe(0); }); it("Correctly passes token to members", async function () { runInAction(() => { group.setTrait(CommonStrata.definition, "token", "test-token"); }); await group.loadMembers(); const member = group.memberModels[0] as ArcGisMapServerCatalogItem; expect(member.token).toBe("test-token"); }); }); }); describe("ArcGisMapServerCatalogGroup creates its layer members with given traits", function () { const mapServerUrl = "http://example.com/arcgis/rest/services/Residential_Dwelling_Density/MapServer"; const rectangle = { east: 158, north: -8, south: -45, west: 109 }; const initialMessage = { title: "Hint", content: "If map items can not be seen, zoom in further to reveal them.", confirmation: false }; const featureInfoTemplate = { template: "{{Pixel Value}} people in the given radius." }; const numberOfGroupMembers = 4; let terria: Terria; let group: ArcGisMapServerCatalogGroup; beforeEach(function () { terria = new Terria({ baseUrl: "./" }); group = new ArcGisMapServerCatalogGroup("test", terria); worker.use( http.get( "http://example.com/arcgis/rest/services/Residential_Dwelling_Density/MapServer", () => HttpResponse.json(residentialMapServerJson) ) ); }); describe("loadMembers", function () { it("properly creates members with parent's traits", async function () { runInAction(() => { group.setTrait(CommonStrata.definition, "url", mapServerUrl); group.setTrait(CommonStrata.definition, "itemProperties", { rectangle: rectangle, initialMessage: initialMessage, featureInfoTemplate: featureInfoTemplate }); }); await group.loadMembers(); for (let i = 0; i < numberOfGroupMembers; i++) { const member = group.memberModels[i] as ArcGisMapServerCatalogItem; expect(member.rectangle?.east).toEqual(rectangle.east); expect(member.rectangle?.north).toEqual(rectangle.north); expect(member.rectangle?.west).toEqual(rectangle.west); expect(member.rectangle?.south).toEqual(rectangle.south); expect(member.initialMessage?.title).toEqual(initialMessage.title); expect(member.initialMessage?.content).toEqual(initialMessage.content); expect(member.initialMessage?.confirmation).toEqual( initialMessage.confirmation ); expect(member.featureInfoTemplate?.template).toEqual( featureInfoTemplate.template ); } }); }); });