@itwin/geo-tools-react
Version:
React Geospatial Tools
137 lines • 7.49 kB
JavaScript
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
const chai_1 = require("chai");
const enzyme_1 = require("enzyme");
const react_1 = require("react");
const sinon = require("sinon");
const ts_sinon_1 = require("ts-sinon");
const appui_abstract_1 = require("@itwin/appui-abstract");
const core_common_1 = require("@itwin/core-common");
const core_frontend_1 = require("@itwin/core-frontend");
const react_2 = require("@testing-library/react");
const geo_tools_1 = require("../geo-tools");
const TestUtils_1 = require("./TestUtils");
describe("GeoAddressSearch", () => {
const options = [
{ addressLine: "addrLine1", formattedAddress: "formattedAddr1" },
{ addressLine: "addrLine2", formattedAddress: "formattedAddr2" },
];
const providerStub = (0, ts_sinon_1.stubObject)(new geo_tools_1.BingAddressProvider());
let getFrustumLonLatBBoxStub;
let locateAddressStub;
before(async () => {
await core_frontend_1.NoRenderApp.startup({ localization: new core_common_1.EmptyLocalization() });
await TestUtils_1.default.initializeGeoTools();
});
beforeEach(() => {
locateAddressStub = sinon.stub(geo_tools_1.IModelGeoView, "locateAddress").callsFake(async (_address) => {
return Promise.resolve(true);
});
providerStub.getSuggestions.returns(Promise.resolve([options[0]]));
// providerStub.getAddresses.callsFake(async (_query: string, _viewLatLongBBox: Range2d)=>{
// console.log(`getAddresses called`);
// return Promise.resolve([options[0], options[1]]);
// })
getFrustumLonLatBBoxStub = sinon.stub(geo_tools_1.IModelGeoView, "getFrustumLonLatBBox").callsFake(() => {
return core_frontend_1.MapCartoRectangle.createZero();
});
});
afterEach(() => {
locateAddressStub.restore();
getFrustumLonLatBBoxStub.restore();
providerStub.getSuggestions.reset();
});
after(async () => {
TestUtils_1.default.terminateUiComponents();
});
it("renders", () => {
const wrapper = (0, enzyme_1.mount)(react_1.default.createElement(geo_tools_1.GeoAddressSearch, { provider: new geo_tools_1.BingAddressProvider() }));
(0, chai_1.expect)(wrapper.find("input[type='text']").length).to.eq(1);
wrapper.unmount();
});
it("should invoke getAddress on AddressProvider when value change", async () => {
const wrapper = (0, enzyme_1.mount)(react_1.default.createElement(geo_tools_1.GeoAddressSearch, { provider: providerStub }));
const geoAddrSearch = wrapper.find(geo_tools_1.GeoAddressSearch);
(0, chai_1.expect)(geoAddrSearch.length).to.eq(1);
const input = geoAddrSearch.find("input[type='text']");
(0, chai_1.expect)(input.length).to.eq(1);
(0, chai_1.expect)(providerStub.getSuggestions.called).to.be.false;
// getAddresses should not be called using an empty value
input.simulate("change", { target: { value: "" } });
await TestUtils_1.default.flushAsyncOperations();
wrapper.update();
(0, chai_1.expect)(providerStub.getSuggestions.called).to.be.false;
// First test with a getFrustumLonLatBBox stub that returns undefined
getFrustumLonLatBBoxStub.restore();
getFrustumLonLatBBoxStub = sinon.stub(geo_tools_1.IModelGeoView, "getFrustumLonLatBBox").callsFake(() => {
return undefined;
});
input.simulate("change", { target: { value: "sample Addr" } });
await TestUtils_1.default.flushAsyncOperations();
wrapper.update();
getFrustumLonLatBBoxStub.calledOnce.should.true;
providerStub.getSuggestions.calledOnce.should.false;
// Now test with a stud that returns a proper Range.
getFrustumLonLatBBoxStub.restore();
getFrustumLonLatBBoxStub = sinon.stub(geo_tools_1.IModelGeoView, "getFrustumLonLatBBox").callsFake(() => {
return core_frontend_1.MapCartoRectangle.createZero();
});
input.simulate("change", { target: { value: "sample Addr" } });
await TestUtils_1.default.flushAsyncOperations();
wrapper.update();
getFrustumLonLatBBoxStub.calledOnce.should.true;
providerStub.getSuggestions.calledOnce.should.true;
wrapper.unmount();
});
it("should support getSuggestions prop", async () => {
const { container } = (0, react_2.render)(react_1.default.createElement("div", null,
react_1.default.createElement(geo_tools_1.GeoAddressSearch, { provider: providerStub })));
const input = container.querySelector("input");
(0, chai_1.expect)(input).not.to.be.null;
const inputNode = input;
react_2.fireEvent.focusIn(inputNode);
react_2.fireEvent.change(inputNode, { target: { value: "abc" } });
await TestUtils_1.default.flushAsyncOperations();
const li = container.querySelectorAll("li");
(0, chai_1.expect)(li).not.to.be.null;
(0, chai_1.expect)(li === null || li === void 0 ? void 0 : li.length).to.eq(1);
react_2.fireEvent.click(li[0]);
locateAddressStub.calledOnce.should.true;
});
it("should invoke getAddress when enter is pressed", async () => {
const wrapper = (0, enzyme_1.mount)(react_1.default.createElement(geo_tools_1.GeoAddressSearch, { provider: providerStub }));
const geoAddrSearch = wrapper.find(geo_tools_1.GeoAddressSearch);
(0, chai_1.expect)(geoAddrSearch.length).to.eq(1);
const input = geoAddrSearch.find("input[type='text']");
(0, chai_1.expect)(input.length).to.eq(1);
// Enter should do nothing if no input value
input.simulate("keydown", { key: appui_abstract_1.SpecialKey.Enter });
locateAddressStub.calledOnce.should.false;
input.simulate("change", { target: { value: "addrLine1" } });
await TestUtils_1.default.flushAsyncOperations();
wrapper.update();
// Enter should invoke locateAddress
input.simulate("keydown", { key: appui_abstract_1.SpecialKey.Enter });
locateAddressStub.calledOnce.should.true;
wrapper.unmount();
});
it("should clear value when Escape is pressed", async () => {
const wrapper = (0, enzyme_1.mount)(react_1.default.createElement(geo_tools_1.GeoAddressSearch, { provider: providerStub }));
const geoAddrSearch = wrapper.find(geo_tools_1.GeoAddressSearch);
(0, chai_1.expect)(geoAddrSearch.length).to.eq(1);
const input = geoAddrSearch.find("input[type='text']");
(0, chai_1.expect)(input.length).to.eq(1);
input.simulate("change", { target: { value: "addrLine1" } });
await TestUtils_1.default.flushAsyncOperations();
wrapper.update();
(0, chai_1.expect)(input.getDOMNode().getAttribute("value")).to.eq("addrLine1");
input.simulate("keydown", { key: appui_abstract_1.SpecialKey.Escape });
(0, chai_1.expect)(input.getDOMNode().getAttribute("value")).to.eq("");
wrapper.unmount();
});
});
//# sourceMappingURL=GeoAddressSearch.test.js.map