import { fireEvent, screen } from "@testing-library/react"; import GeoJsonCatalogItem from "../../../../lib/Models/Catalog/CatalogItems/GeoJsonCatalogItem"; import WebMapServiceCatalogItem from "../../../../lib/Models/Catalog/Ows/WebMapServiceCatalogItem"; import CommonStrata from "../../../../lib/Models/Definition/CommonStrata"; import updateModelFromJson from "../../../../lib/Models/Definition/updateModelFromJson"; import Terria from "../../../../lib/Models/Terria"; import TableStylingWorkflow from "../../../../lib/Models/Workflows/TableStylingWorkflow"; import ViewState from "../../../../lib/ReactViewModels/ViewState"; import { WorkbenchControls } from "../../../../lib/ReactViews/Workbench/Controls/WorkbenchControls"; import WorkbenchItemControls from "../../../../lib/ReactViews/Workbench/Controls/WorkbenchItemControls"; import { renderWithContexts } from "../../withContext"; describe("WorkbenchItemControls", function () { let viewState: ViewState; let item: WebMapServiceCatalogItem; beforeEach(function () { const terria = new Terria({ baseUrl: "./" }); viewState = new ViewState({ terria: terria, catalogSearchProvider: undefined }); item = new WebMapServiceCatalogItem("test-item", terria); }); it("renders controls", function () { renderWithContexts( , viewState ); const aboutData = screen.queryByTitle("workbench.previewItemTitle"); expect((aboutData as HTMLButtonElement).disabled).toBe(false); const opacity = screen.queryByText("workbench.opacity"); expect(opacity).toBeVisible(); }); describe("disableViewingControlsMenu", function () { it("when not set, renders the viewing controls menu", function () { renderWithContexts( , viewState ); const opacity = screen.queryByText("workbench.opacity"); expect(opacity).toBeVisible(); }); it("when true, should not render the viewing controls menu", function () { renderWithContexts( , viewState ); // About data is part of viewing controls menu const aboutData = screen.queryByText("workbench.previewItem"); expect(aboutData).toBeNull(); }); }); describe("control flags", function () { it("can be used to selectively turn off controls", function () { renderWithContexts( , viewState ); const compare = screen.queryByText("workbench.splitItemTitle"); expect(compare).toBeNull(); const opacity = screen.queryByText("workbench.opacity"); expect(opacity).toBeNull(); }); it("can be used to disable a dynamic control like a selectable dimension workflow", function () { const item = new GeoJsonCatalogItem( "test-geojson-item", viewState.terria ); const { rerender } = renderWithContexts( , viewState ); openViewingControlsMenu(); // Test that the edit style option is rendered let editStyle = screen.queryByText("models.tableData.editStyle"); expect(editStyle).toBeVisible(); rerender( ); openViewingControlsMenu(); // Test that the edit style option is not rendered editStyle = screen.queryByText("models.tableData.editStyle"); expect(editStyle).toBeNull("edit style menu option must not be rendered"); }); describe("when disableAll is true", function () { it("turns off all controls", function () { renderWithContexts( , viewState ); const aboutData = screen.queryByTitle("workbench.previewItemTitle"); expect((aboutData as HTMLButtonElement).disabled).toBe(true); const compare = screen.queryByText("workbench.splitItemTitle"); expect(compare).toBeNull(); const opacity = screen.queryByText("workbench.opacity"); expect(opacity).toBeNull(); }); it("shows Remove button in viewing controls menu so that the item can be removed from the workbench even when all other controls are disabled", async function () { renderWithContexts( , viewState ); openViewingControlsMenu(); // Test that the remove button is rendered const remove = screen.queryByTitle("workbench.removeFromMapTitle"); expect(remove).toBeVisible(); }); it("can selectively enable some controls while the rest are disabled", function () { renderWithContexts( , viewState ); const aboutData = screen.queryByTitle("workbench.previewItemTitle"); expect((aboutData as HTMLButtonElement).disabled).toBe(true); const compare = screen.queryByText("workbench.splitItemTitle"); expect(compare).toBeNull(); const opacity = screen.queryByText("workbench.opacity"); expect(opacity).toBeVisible(); }); }); describe("setting controls through item traits", function () { it("control flags can be set using item traits", function () { updateModelFromJson(item, CommonStrata.user, { workbenchControlFlags: { disableAll: true, opacity: true } }); const controls = item.workbenchControlFlags as any as Partial; expect(controls.disableAll).toBe(true); renderWithContexts( , viewState ); const aboutData = screen.queryByTitle("workbench.previewItemTitle"); expect((aboutData as HTMLButtonElement).disabled).toBe(true); const opacity = screen.queryByText("workbench.opacity"); expect(opacity).toBeVisible(); }); it("controls set from item traits must not override props controls", function () { updateModelFromJson(item, CommonStrata.user, { workbenchControlFlags: { disableAll: true, opacity: true } }); renderWithContexts( , viewState ); const aboutData = screen.queryByTitle("workbench.previewItemTitle"); expect((aboutData as HTMLButtonElement).disabled).toBe(false); const opacity = screen.queryByText("workbench.opacity"); expect(opacity).toBeNull(); }); }); }); }); function openViewingControlsMenu() { // Find and open viewing controls menu const menuOpenBtn = screen.queryByTitle("workbench.showMoreActionsTitle"); expect(menuOpenBtn).toBeDefined("viewing controls menu button is defined"); fireEvent.click(menuOpenBtn!); }