UNPKG

terriajs

Version:

Geospatial data visualization platform.

200 lines (179 loc) 7.1 kB
import { configure, reaction, toJS } from "mobx"; import { http, HttpResponse } from "msw"; import addUserCatalogMember from "../../../../lib/Models/Catalog/addUserCatalogMember"; import CommonStrata from "../../../../lib/Models/Definition/CommonStrata"; import CsvCatalogItem from "../../../../lib/Models/Catalog/CatalogItems/CsvCatalogItem"; import Terria from "../../../../lib/Models/Terria"; import YDYRCatalogFunction from "../../../../lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunction"; import YDYRCatalogFunctionJob from "../../../../lib/Models/Catalog/CatalogFunctions/YDYRCatalogFunctionJob"; import { worker } from "../../../mocks/browser"; import "../../../SpecHelpers"; import regionMapping from "../../../../wwwroot/data/regionMapping.json"; import sa4regionCodes from "../../../../wwwroot/data/regionids/region_map-SA4_2016_AUST_SA4_CODE16.json"; import lga2011RegionCodes from "../../../../wwwroot/data/regionids/region_map-FID_LGA_2011_AUST_LGA_CODE11.json"; configure({ enforceActions: "observed", computedRequiresReaction: true }); import lga11Csv from "../../../../wwwroot/test/csv/lga_code_2011.csv"; describe("YDYRCatalogFunction", function () { let terria: Terria; let csv: CsvCatalogItem; let ydyr: YDYRCatalogFunction; beforeEach(async function () { let logCounter = 0; worker.use( http.all( "http://example.com/api/v1/disaggregate.json", () => new HttpResponse(`"someStatusId"`) ), http.get( "http://example.com/api/v1/download/someResultKey", ({ request }) => { const url = new URL(request.url); if (url.searchParams.get("format") !== "csv") throw new Error(`Unexpected query params: ${url.search}`); return new HttpResponse(`SA4_code_2016,Negative Binomial: Lower (10%),Negative Binomial: Upper (90%),Negative Binomial: Average 313,0,1,0 316,0,1,0 `); } ), http.get("http://example.com/api/v1/status/someStatusId", () => { if (logCounter < 1) { const msg = `"Some Log ${logCounter}"`; logCounter++; return new HttpResponse(msg); } return new HttpResponse( `{"key":"someResultKey","report":{"Quality Control":"OK (Model is performing better than baseline), providing full result"}}` ); }), http.get( "https://tiles.terria.io/region-mapping/regionids/region_map-SA4_2016_AUST_SA4_CODE16.json", () => HttpResponse.json(sa4regionCodes) ), http.get( "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2011_AUST_LGA_CODE11.json", () => HttpResponse.json(lga2011RegionCodes) ), http.get("*/build/TerriaJS/data/regionMapping.json", () => HttpResponse.json(regionMapping) ) ); terria = new Terria(); csv = new CsvCatalogItem("test", terria, undefined); csv.setTrait(CommonStrata.user, "csvString", lga11Csv); await csv.loadRegionProviderList(); await csv.loadMapItems(); await addUserCatalogMember(terria, csv, { enable: true }); ydyr = new YDYRCatalogFunction("testYdyr", terria); ydyr.setTrait(CommonStrata.definition, "parameters", { apiUrl: "http://example.com/api/v1/", "Negative Binomial": true, "Population Weighted": false, "Poisson Linear": false, "Ridge Regressor": false, "Output Geography": "ABS - 2016 Statistical Areas Level 4" }); // A few reactions will happen, while setting default values for functionParameters await new Promise<void>((resolve) => { reaction( () => ydyr.functionParameters, () => { if (ydyr.functionParameters.length === 9) resolve(); } ); }); }); it("has a type & typeName", function () { expect(YDYRCatalogFunction.type).toBe("ydyr"); expect(ydyr.typeName).toBe("YourDataYourRegions"); }); describe("when loading", function () { it("should correctly render functionParameters", function () { expect(ydyr.functionParameters.map(({ type }) => type)).toEqual([ "string", "enumeration", "enumeration", "enumeration", "enumeration", "info", "boolean", "boolean", "info" ]); }); it("should set default values", () => { expect(ydyr.functionParameters.map((p) => p.value)).toEqual([ "http://example.com/api/v1/", csv.uniqueId, csv.activeTableStyle.regionColumn?.name, csv.activeStyle, "ABS - 2016 Statistical Areas Level 4", "Predictive models used to convert data between the input and output geographies:", true, false, "By submitting this form your tabular data will be sent to http://example.com/api/v1/ for processing." ]); }); }); describe("when submitted", function () { let job: YDYRCatalogFunctionJob; let dispose: () => void; beforeEach(async () => { job = (await ydyr.submitJob()) as YDYRCatalogFunctionJob; // Override the 2-second polling interval to speed up tests Object.defineProperty(job, "refreshInterval", { get: () => 0.01 }); dispose = reaction( () => job.mapItems, () => {} ); }); afterEach(() => { dispose(); }); it("should correctly set parameters", function () { expect(toJS(job.parameters)).toEqual(toJS(ydyr.parameters)); }); it("should be in workbench", function () { expect(job.inWorkbench).toBeTruthy(); }); it("calls YDYR api and sets status id", function () { expect(job.jobId).toEqual("someStatusId"); }); it("polls twice - and creates 2 log entries", async function () { // Wait until job finished await new Promise<void>((resolve) => { reaction( () => job.jobStatus, (status) => (status === "finished" ? resolve() : undefined) ); }); expect(job.logs.length).toBe(2); expect(job.logs).toEqual([ "Some Log 0", `{"key":"someResultKey","report":{"Quality Control":"OK (Model is performing better than baseline), providing full result"}}` ]); expect(job.resultId).toBe("someResultKey"); }); it("downloads results and creates CSVCatalogItem", async function () { // Wait until job finished downloading results await new Promise<void>((resolve) => { reaction( () => job.downloadedResults, (downloadedResults) => (downloadedResults ? resolve() : undefined) ); }); expect(job.results.length).toBe(1); expect(job.results[0].type).toBe(CsvCatalogItem.type); const result = job.results[0] as CsvCatalogItem; await result.loadMapItems(); expect(result.tableColumns.length).toBe(4); expect(result.activeStyle).toBe("Negative Binomial: Lower (10%)"); expect(result.regionProviderDimensions?.selectedId).toBe("SA4_2016"); expect(result.enableManualRegionMapping).toBeTruthy(); expect(result.inWorkbench).toBeTruthy(); }); }); });