import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { runInAction } from "mobx"; import { http, HttpResponse } from "msw"; import { ThemeProvider } from "styled-components"; import CatalogMemberMixin from "../../lib/ModelMixins/CatalogMemberMixin"; import CsvCatalogItem from "../../lib/Models/Catalog/CatalogItems/CsvCatalogItem"; import WebMapServiceCatalogItem from "../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import CreateModel from "../../lib/Models/Definition/CreateModel"; import SelectableDimensions, { DEFAULT_PLACEMENT, SelectableDimensionGroup, SelectableDimension as SelectableDimensionModel } from "../../lib/Models/SelectableDimensions/SelectableDimensions"; import Terria from "../../lib/Models/Terria"; import { terriaTheme } from "../../lib/ReactViews/StandardUserInterface"; import SelectableDimensionSection from "../../lib/ReactViews/Workbench/Controls/SelectableDimensionSection"; import CatalogMemberTraits from "../../lib/Traits/TraitsClasses/CatalogMemberTraits"; import { worker } from "../mocks/browser"; import lgaCode2015 from "../../wwwroot/test/csv/lga_code_2015.csv"; import lgaCodeJson from "../../wwwroot/data/regionids/region_map-FID_LGA_2015_AUST_LGA_CODE15.json"; import regionMapping from "../../wwwroot/data/regionMapping.json"; export default class TestCatalogItem extends CatalogMemberMixin(CreateModel(CatalogMemberTraits)) implements SelectableDimensions { static readonly type = "stub"; get type() { return "test"; } get selectableDimensions() { return this.selectableDimensionsValue; } selectableDimensionsValue: SelectableDimensionModel[] = [ { id: "some-id", name: "Some name", options: [ { id: "option-1", name: "Option 1" }, { id: "option-2", name: "Option 2" } ], selectedId: "option-2", allowUndefined: true, setDimensionValue: (_stratumId: string, _newStyle: string) => {} }, { id: "some-id-2", name: "Some name 2", options: [ { id: "option-3", name: "Option 3" }, { id: "option-4", name: "Option 4" }, { id: "option-5", name: "Option 5" } ], selectedId: "option-3", allowUndefined: false, setDimensionValue: (_stratumId: string, _newStyle: string) => {} }, { id: "some-id-3", name: "Some name 3", options: [ { id: "option-6", name: "Neko" }, { id: "option-7", name: "Mochi" }, { id: "option-8", name: "A dog" } ], selectedId: "option-8", allowUndefined: false, setDimensionValue: (_stratumId: string, _newStyle: string) => {}, disable: true }, { id: "some-id-4", name: "Some name 4", options: [ { id: "true", name: "Option 1" }, { id: "false", name: "Option 2" } ], selectedId: "false", type: "checkbox", setDimensionValue: (_stratumId, _newStyle) => {} } ]; } describe("DimensionSelectorSection", function () { let terria: Terria; beforeEach(function () { terria = new Terria({ baseUrl: "./" }); }); it("shows all dimensions and styles for a mock layer", function () { const mockItem = new TestCatalogItem("what", terria); render( ); // 2 select dropdowns (3rd has disable:true so not rendered) expect(screen.getAllByRole("combobox").length).toBe(2); // 1 checkbox dimension expect(screen.getAllByRole("checkbox").length).toBe(1); }); it("show dimensions and styles for a 'real' WMS layer", async function () { const wmsItem = new WebMapServiceCatalogItem("some-layer", terria); runInAction(() => { wmsItem.setTrait(CommonStrata.definition, "url", "http://example.com"); wmsItem.setTrait( CommonStrata.definition, "getCapabilitiesUrl", "test/WMS/styles_and_dimensions.xml" ); wmsItem.setTrait(CommonStrata.definition, "layers", "A,B"); wmsItem.setTrait(CommonStrata.definition, "dimensions", { styles: "contour/ferret,shadefill/alg2", custom: "Another thing", elevation: "-0.59375" }); wmsItem.setTrait( CommonStrata.definition, "styles", "contour/ferret,shadefill/alg2" ); }); await wmsItem.loadMetadata(); const { container } = render( ); // Expect 5 dimensions (elevation, custom, another + 2 styles) const labels = container.querySelectorAll("label"); expect(screen.getAllByRole("combobox").length).toBe(5); expect(labels.length).toBe(5); }); it("shows csv region mapping options", async function () { worker.use( http.get("*/build/TerriaJS/data/regionMapping.json", () => HttpResponse.json(regionMapping) ), http.get( "https://tiles.terria.io/region-mapping/regionids/region_map-FID_LGA_2015_AUST_LGA_CODE15.json", () => HttpResponse.json(lgaCodeJson) ), http.get( "*/test/csv/lga_code_2015.csv", () => new HttpResponse(lgaCode2015) ) ); const csvItem = new CsvCatalogItem("some-csv", terria, undefined); runInAction(() => { csvItem.setTrait( CommonStrata.definition, "url", "test/csv/lga_code_2015.csv" ); csvItem.setTrait( CommonStrata.definition, "enableManualRegionMapping", true ); }); await csvItem.loadMapItems(); render( ); expect( screen.getByRole("button", { name: "models.tableData.manualRegionMapping" }) ).toBeVisible(); }); // xdescribe("when given a SelectableDimensionCheckboxGroup", function () { // let mockItem: TestCatalogItem; // beforeEach(function () { // mockItem = new TestCatalogItem("what", terria); // mockItem.selectableDimensionsValue = [ // { // id: "checkbox-group1", // type: "checkbox-group", // selectedId: "true", // options: [ // { // id: "true", // name: "true" // }, // { // id: "false", // name: "false" // } // ], // setDimensionValue: () => {}, // selectableDimensions: [ // { // id: "checkbox-1", // type: "checkbox", // name: "Checkbox 1", // selectedId: "true", // options: [ // { id: "true", name: "When checked" }, // { id: "false", name: "When unchecked" } // ], // setDimensionValue: () => {} // }, // { // id: "select-1", // type: "select", // name: "Dropdown 1", // selectedId: "true", // options: [ // { id: "option-1", name: "Option 1" }, // { id: "option-2", name: "Option 2" } // ], // setDimensionValue: () => {} // }, // { // disable: true, // id: "select-2", // type: "select", // name: "Dropdown 2", // selectedId: "true", // options: [ // { id: "option-3", name: "Option 3" }, // { id: "option-4", name: "Option 4" } // ], // setDimensionValue: () => {} // } // ] // } // ]; // }); // }); describe("when given a SelectableDimensionGroup", function () { let mockItem: TestCatalogItem; beforeEach(function () { mockItem = new TestCatalogItem("what", terria); mockItem.selectableDimensionsValue = [ { id: "group", type: "group", name: "Selectable group", isOpen: true, selectableDimensions: [ { id: "checkbox-1", type: "checkbox", name: "Checkbox 1", selectedId: "true", options: [ { id: "true", name: "When checked" }, { id: "false", name: "When unchecked" } ], setDimensionValue: () => {} }, { id: "select-1", type: "select", name: "Dropdown 1", selectedId: "true", options: [ { id: "option-1", name: "Option 1" }, { id: "option-2", name: "Option 2" } ], setDimensionValue: () => {} }, { disable: true, id: "select-2", type: "select", name: "Dropdown 2", selectedId: "true", options: [ { id: "option-3", name: "Option 3" }, { id: "option-4", name: "Option 4" } ], setDimensionValue: () => {} } ] } ]; }); it("renders the group", function () { render( ); expect( screen.getByRole("button", { name: "Selectable group" }) ).toBeVisible(); expect( screen.getByRole("button", { name: "Selectable group" }) ).toHaveAttribute("aria-expanded", "true"); }); it("renders all the group children", async function () { ( mockItem.selectableDimensionsValue[0] as SelectableDimensionGroup ).isOpen = false; render( ); expect(screen.queryAllByRole("checkbox").length).toBe(0); expect(screen.queryAllByRole("combobox").length).toBe(0); await userEvent.click( screen.getByRole("button", { name: "Selectable group" }) ); expect(screen.getAllByRole("checkbox").length).toBe(1); expect(screen.getAllByRole("combobox").length).toBe(1); }); }); });