UNPKG

terriajs

Version:

Geospatial data visualization platform.

549 lines (496 loc) 18.2 kB
import { runInAction } from "mobx"; import CatalogGroup from "../../lib/Models/Catalog/CatalogGroup"; import CsvCatalogItem from "../../lib/Models/Catalog/CatalogItems/CsvCatalogItem"; import GeoJsonCatalogItem from "../../lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem"; import MagdaReference from "../../lib/Models/Catalog/CatalogReferences/MagdaReference"; import WebMapServiceCatalogGroup from "../../lib/Models/Catalog/Ows/WebMapServiceCatalogGroup"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import updateModelFromJson from "../../lib/Models/Definition/updateModelFromJson"; import Terria from "../../lib/Models/Terria"; describe("MagdaReference", function () { const recordGroupWithOneCsv = { id: "test-group", name: "Test Group", aspects: { group: { members: [ { id: "thing-in-group", name: "A thing in the group", aspects: { terria: { type: "csv", definition: { url: "some.csv" } } } } ] } } }; it("can dereference to a group", async function () { const terria = new Terria(); const model = new MagdaReference(undefined, terria); model.setTrait(CommonStrata.definition, "recordId", "test-group"); model.setTrait( CommonStrata.definition, "magdaRecord", recordGroupWithOneCsv ); await model.loadReference(); expect(model.target instanceof CatalogGroup).toBe(true); const group = model.target as CatalogGroup; expect(group.isOpen).toBe(false); }); it("dereferenced group contains expected item", async function () { const terria = new Terria(); const model = new MagdaReference(undefined, terria); model.setTrait(CommonStrata.definition, "recordId", "test-group"); model.setTrait( CommonStrata.definition, "magdaRecord", recordGroupWithOneCsv ); await model.loadReference(); const group = model.target as CatalogGroup; expect(group.members.length).toBe(1); expect(group.members[0]).toBe( recordGroupWithOneCsv.aspects.group.members[0].id ); expect(group.memberModels.length).toBe(1); expect(group.memberModels[0] instanceof CsvCatalogItem).toBe(true); }); it("definition trait can override traits of dereferenced member", async function () { const terria = new Terria(); const model = new MagdaReference(undefined, terria); model.setTrait(CommonStrata.definition, "recordId", "test-group"); model.setTrait( CommonStrata.definition, "magdaRecord", recordGroupWithOneCsv ); model.setTrait(CommonStrata.definition, "override", { isOpen: true }); await model.loadReference(); const group = model.target as CatalogGroup; expect(group.isOpen).toBe(true); }); it("override trait can override traits of the members of a dereferenced group", async function () { const terria = new Terria(); const model = new MagdaReference(undefined, terria); model.setTrait(CommonStrata.definition, "recordId", "test-group"); model.setTrait( CommonStrata.definition, "magdaRecord", recordGroupWithOneCsv ); model.setTrait(CommonStrata.definition, "override", { members: [ { id: "thing-in-group", type: "csv", url: "somethingelse.csv" } ] }); await model.loadReference(); const group = model.target as CatalogGroup; const csv = group.memberModels[0] as CsvCatalogItem; expect(csv.url).toBe("somethingelse.csv"); }); it("changes to override trait affect members of a dereferenced group", async function () { const terria = new Terria(); const model = new MagdaReference(undefined, terria); model.setTrait(CommonStrata.definition, "recordId", "test-group"); model.setTrait( CommonStrata.definition, "magdaRecord", recordGroupWithOneCsv ); model.setTrait(CommonStrata.definition, "override", { members: [ { id: "thing-in-group", type: "csv", url: "first.csv" } ] }); await Promise.resolve(); await model.loadReference(); const group = model.target as CatalogGroup; const csv = group.memberModels[0] as CsvCatalogItem; expect(csv.url).toBe("first.csv"); runInAction(() => { const override: any = model.getTrait(CommonStrata.definition, "override"); override.members[0].url = "second.csv"; }); await model.loadReference(); const group2 = model.target as CatalogGroup; const csv2 = group2.memberModels[0] as CsvCatalogItem; expect(csv2.url).toBe("second.csv"); }); it("changes to Magda record affect members of a dereferenced group", async function () { const terria = new Terria(); const model = new MagdaReference(undefined, terria); model.setTrait(CommonStrata.definition, "recordId", "test-group"); model.setTrait( CommonStrata.definition, "magdaRecord", recordGroupWithOneCsv ); model.setTrait(CommonStrata.definition, "override", { members: [ { id: "thing-in-group", type: "csv", url: "first.csv" } ] }); await Promise.resolve(); await model.loadReference(); const group = model.target as CatalogGroup; const csv = group.memberModels[0] as CsvCatalogItem; expect(csv.name).toContain("A thing"); runInAction(() => { const magdaRecord: any = model.getTrait( CommonStrata.definition, "magdaRecord" ); magdaRecord.aspects.group.members[0].name = "!!!"; }); await model.loadReference(); const group2 = model.target as CatalogGroup; const csv2 = group2.memberModels[0] as CsvCatalogItem; expect(csv2.name).toBe("!!!"); }); it("loads valid items and ignores broken items", async function () { const groupWithBrokenItem: any = { aspects: { group: { members: [ { aspects: { terria: { definition: { name: "GeoJSON Another Test", url: "http://ci.terria.io/master/test/bike_racks.geojson" }, id: "fa0e6775-e285-4f49-8d5a-abd58cbfdfad", type: "geojson" } }, id: "fa0e6775-e285-4f49-8d5a-abd58cbfdfad", name: "GeoJSON Another Test" }, { aspects: { terria: { definition: { name: "GeoJSON Another Test with broken url", url: null }, id: "1057cfde-243b-4aa0-8bba-732f45327c96", type: "geojson" } }, id: "1057cfde-243b-4aa0-8bba-732f45327c96", name: "GeoJSON Another Test with broken url" }, { aspects: { terria: { definition: {}, id: "item-with-no-type-and-definition", type: "unknown" } }, id: "item-with-no-type-and-definition", name: "item with no type and definition" } ] }, terria: { definition: { description: "New empty catalog group", name: "Contains broken stuff" }, id: "c0f03092-d7e8-4ff0-9edd-72393b256960", type: "group" } }, id: "c0f03092-d7e8-4ff0-9edd-72393b256960", name: "Contains broken stuff", tenantId: 0 }; const terria = new Terria(); const model = new MagdaReference(undefined, terria); model.setTrait(CommonStrata.definition, "recordId", "test-group"); model.setTrait(CommonStrata.definition, "magdaRecord", groupWithBrokenItem); await model.loadReference(); const group = model.target as CatalogGroup; expect(group.members.length).toBe(3); const member0 = group.memberModels[0] as GeoJsonCatalogItem; expect(member0.uniqueId).toBe("fa0e6775-e285-4f49-8d5a-abd58cbfdfad"); expect(member0.type).toBe(GeoJsonCatalogItem.type); expect(member0.isExperiencingIssues).toBe(false); const member1 = group.memberModels[1] as GeoJsonCatalogItem; expect(member1.uniqueId).toBe("1057cfde-243b-4aa0-8bba-732f45327c96"); expect(member1.type).toBe(GeoJsonCatalogItem.type); expect(member1.isExperiencingIssues).toBe(true); const unknown = group.memberModels[2] as MagdaReference; expect(unknown.uniqueId).toBe("item-with-no-type-and-definition"); expect(unknown.name).toBe("item with no type and definition"); expect(unknown.type).toBe("magda"); expect(unknown.target).toBeUndefined(); }); it("can add record aspects by override", async function () { const theMagdaItemId = "a magda item id"; const theRecordName = "Test Record"; const theRecordId = "test-record-id"; const theType = "wms-group"; const theDataUrl = "https://some.wms.service"; const theCatalogItemName = "a catalogue item from magda portal"; // The aspects in this record will be ignored. const theRecord = { id: theRecordId, name: theRecordName, aspects: { "dataset-format": { format: "WMS", confidenceLevel: 0.7 }, "dcat-distribution-strings": { downloadURL: "http://geofabric.bom.gov.au/simplefeatures/ows?service=WMS&request=GetCapabilities", format: "WMS", issued: "2020-04-21T05:26:45Z", license: "Creative Commons Attribution", title: "WMS - Geofabric" } } }; // The aspects will be added to the record and used. const theOverriddenAspects = { aspects: { terria: { type: theType, definition: { name: theCatalogItemName, url: theDataUrl }, id: theMagdaItemId } } }; // Simulate a catalog item of magda type. const theCatalogItem = { id: theMagdaItemId, name: theCatalogItemName, recordId: theRecordId, url: "https://a.magda.portal", // ok not being used in the test addOrOverrideAspects: theOverriddenAspects, type: "magda" // ok not being used in the test }; const terria = new Terria(); const referenceModel = new MagdaReference(undefined, terria); updateModelFromJson(referenceModel, CommonStrata.user, theCatalogItem); const catalogItem = MagdaReference.createMemberFromRecord( terria, referenceModel, [], undefined, referenceModel.recordId, theRecord, undefined, undefined, referenceModel.addOrOverrideAspects ); expect(catalogItem).toBeDefined(); expect(catalogItem!.type).toBe(theType); expect((catalogItem as WebMapServiceCatalogGroup).isGroup).toBe(true); expect( (catalogItem as WebMapServiceCatalogGroup).getCapabilitiesUrl ).toContain(theDataUrl); expect((catalogItem as WebMapServiceCatalogGroup).nameInCatalog).toBe( theCatalogItemName ); expect(catalogItem!.uniqueId).toBe(theRecordId); }); describe("UI access type", function () { it("returns 'public' when magda v1 access control says the record is public", async function () { const terria = new Terria(); const reference = new MagdaReference("magda-reference", terria); reference.setTrait(CommonStrata.definition, "recordId", "test id"); reference.setTrait(CommonStrata.definition, "magdaRecord", { id: "test id", name: "Test", aspects: { "esri-access-control": { access: "public" } } }); expect(reference.accessType === "public").toBeTruthy(); }); it("does not return 'public' when magda v1 access control does not say the record is public", async function () { const terria = new Terria(); const reference = new MagdaReference("magda-reference", terria); reference.setTrait(CommonStrata.definition, "recordId", "test id"); reference.setTrait(CommonStrata.definition, "magdaRecord", { id: "test id", name: "Test", aspects: { "esri-access-control": { access: "non-public" } } }); expect(reference.accessType === "public").toBeFalsy(); }); it("does not return 'public' when magda v2 access control says the record belongs to an org unit without constraint exemption being set.", async function () { const terria = new Terria(); const reference = new MagdaReference("magda-reference", terria); reference.setTrait(CommonStrata.definition, "recordId", "test id"); reference.setTrait(CommonStrata.definition, "magdaRecord", { id: "test id", name: "Test", aspects: { "access-control": { orgUnitId: "some org id" } } }); expect(reference.accessType === "public").toBeFalsy(); }); it("returns 'public' when magda v2 access control says the record belongs to an org unit with constraint exemption being set to true.", async function () { const terria = new Terria(); const reference = new MagdaReference("magda-reference", terria); reference.setTrait(CommonStrata.definition, "recordId", "test id"); reference.setTrait(CommonStrata.definition, "magdaRecord", { id: "test id", name: "Test", aspects: { "access-control": { orgUnitId: "some org id", constraintExemption: true } } }); expect(reference.accessType === "public").toBeTruthy(); }); it("does not return 'public' when magda v2 access control says the record belongs to an org unit with constraint exemption being set to false.", async function () { const terria = new Terria(); const reference = new MagdaReference("magda-reference", terria); reference.setTrait(CommonStrata.definition, "recordId", "test id"); reference.setTrait(CommonStrata.definition, "magdaRecord", { id: "test id", name: "Test", aspects: { "access-control": { orgUnitId: "some org id", constraintExemption: false } } }); expect(reference.accessType === "public").toBeFalsy(); }); it("returns 'public' when magda v2 access control does not say the record belongs to an org unit.", async function () { const terria = new Terria(); const reference = new MagdaReference("magda-reference", terria); reference.setTrait(CommonStrata.definition, "recordId", "test id"); reference.setTrait(CommonStrata.definition, "magdaRecord", { id: "test id", name: "Test", aspects: { "access-control": { someOtherProperty: "something else" } } }); expect(reference.accessType === "public").toBeTruthy(); }); it("returns value depends on magda v2 access control if magda v1 access control also exists.", async function () { const terria = new Terria(); const reference = new MagdaReference("magda-reference", terria); reference.setTrait(CommonStrata.definition, "recordId", "test id"); reference.setTrait(CommonStrata.definition, "magdaRecord", { id: "test id", name: "Test", aspects: { "esri-access-control": { access: "public" }, "access-control": { orgUnitId: "some org id" } } }); expect(reference.accessType === "public").toBeFalsy(); reference.setTrait(CommonStrata.definition, "magdaRecord", { id: "test id", name: "Test", aspects: { "esri-access-control": { access: "non-public" }, "access-control": { someOtherProperty: "something else" } } }); expect(reference.accessType === "public").toBeTruthy(); reference.setTrait(CommonStrata.definition, "magdaRecord", { id: "test id", name: "Test", aspects: { "esri-access-control": { access: "public" }, "access-control": { orgUnitId: "some org id" } } }); expect(reference.accessType === "public").toBeFalsy(); }); it("returns 'public' when there are no any access control aspects.", async function () { const terria = new Terria(); const reference = new MagdaReference("magda-reference", terria); reference.setTrait(CommonStrata.definition, "recordId", "test id"); reference.setTrait(CommonStrata.definition, "magdaRecord", { id: "test id", name: "Test", aspects: { "some other aspect": {} } }); expect(reference.accessType === "public").toBeTruthy(); }); it("returns `super.accessType` when magdaRecord is unset", function () { const terria = new Terria(); const reference = new MagdaReference("magda-reference", terria); reference.setAccessType("foo-doesnt-matter"); reference.setTrait(CommonStrata.definition, "recordId", "test id"); reference.setTrait(CommonStrata.definition, "magdaRecord", { id: "test id", name: "Test", aspects: { "access-control": { orgUnitId: "some org id", constraintExemption: false } } }); // Picks up the access type from magdaRecord settings expect(reference.accessType).toBe("non-public"); reference.setTrait(CommonStrata.definition, "magdaRecord", undefined); // Reverts to whatever accessType value is returned by super.accessType expect(reference.accessType).toBe("foo-doesnt-matter"); }); }); });