UNPKG

react-spatial

Version:

Components to build React map apps.

219 lines (195 loc) 8.14 kB
import 'jest-canvas-mock'; import proj4 from 'proj4'; import { register } from 'ol/proj/proj4'; import React from 'react'; import { configure, shallow, mount } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; import ResizeObserver from 'resize-observer-polyfill'; import MapEvent from 'ol/MapEvent'; import OLLayer from 'ol/layer/Vector'; import OLMap from 'ol/Map'; import OLView from 'ol/View'; import BasicMap from './BasicMap'; import Layer from '../../layers/Layer'; proj4.defs( 'EPSG:21781', '+proj=somerc +lat_0=46.95240555555556 ' + '+lon_0=7.439583333333333 +k_0=1 +x_0=600000 +y_0=200000 +ellps=bessel ' + '+towgs84=674.4,15.1,405.3,0,0,0,0 +units=m +no_defs' ); register(proj4); configure({ adapter: new Adapter() }); var extent = [0, 0, 0, 0]; var olView = new OLView(); var olMap = new OLMap({ view: olView }); var olLayers = [ new Layer({ name: 'foo', olLayer: new OLLayer({}), visible: true, }) ]; describe('BasicMap', function () { test('should be rendered', function () { var setTarget = jest.spyOn(olMap, 'setTarget'); shallow(React.createElement( BasicMap, { map: olMap })); expect(setTarget).toHaveBeenCalled(); }); test('should be rendered with touchAction to none', function () { shallow(React.createElement( BasicMap, { map: olMap })); expect(olMap.getViewport().style.touchAction).toBe('none'); expect(olMap.getViewport().style.msTouchAction).toBe('none'); expect(olMap.getViewport().getAttribute('touch-action')).toBe('none'); }); test('uses onMapMoved function', function () { var spy = jest.fn(function () {}); shallow(React.createElement( BasicMap, { map: olMap, onMapMoved: spy })); olMap.dispatchEvent(new MapEvent('moveend', olMap)); expect(spy).toHaveBeenCalledTimes(1); }); test('uses onFeaturesClick function', function () { var spy = jest.fn(); shallow(React.createElement( BasicMap, { map: olMap, onFeaturesClick: spy })); olMap.dispatchEvent(new MapEvent('singleclick', olMap)); expect(spy).toHaveBeenCalledTimes(1); }); test('uses onFeaturesHover function', function () { var spy = jest.fn(); shallow(React.createElement( BasicMap, { map: olMap, onFeaturesHover: spy })); olMap.dispatchEvent(new MapEvent('pointermove', olMap)); expect(spy).toHaveBeenCalledTimes(1); }); test('should be rendered with a default map', function () { var wrapper = shallow(React.createElement( BasicMap, null )); expect(wrapper.instance().map).toBeDefined(); }); test('should be rendered with layers and an extent', function () { var wrapper = shallow( React.createElement( BasicMap, { map: olMap, layers: olLayers, extent: extent, viewOptions: { minZoom: 16, maxZoom: 22, projection: 'EPSG:21781', } }) ); var inst = wrapper.instance(); expect(inst.map).toBeDefined(); expect(inst.map.getLayers().getLength()).toBe(1); expect(inst.map.getView().calculateExtent()).toEqual([ -1.8640493388513675, -1.8640493388513675, 1.8640493388513675, 1.8640493388513675 ]); }); test('center shoud be set', function () { var map = shallow(React.createElement( BasicMap, { map: olMap })); var setCenter = jest.spyOn(olMap.getView(), 'setCenter'); map.setProps({ center: [0, 0] }).update(); expect(setCenter).toHaveBeenCalled(); }); test('zoom shoud be set', function () { var map = shallow(React.createElement( BasicMap, { map: olMap, zoom: 5 })); expect(olMap.getView().getZoom()).toBe(5); map.setProps({ zoom: 2 }).update(); expect(olMap.getView().getZoom()).toBe(2); }); test('resolution shoud be set', function () { var map = shallow(React.createElement( BasicMap, { map: olMap, resolution: 100 })); expect(olMap.getView().getResolution()).toBe(100); map.setProps({ resolution: 5 }).update(); expect(olMap.getView().getResolution()).toBe(5); }); test('animation shoud be set', function () { var obj = { zoom: 4, }; var map = shallow(React.createElement( BasicMap, { map: olMap })); var spy = jest.spyOn(olMap.getView(), 'animate'); map.setProps({ animationOptions: obj }).update(); expect(spy).toHaveBeenCalledWith(obj); }); test('layers shoud be updated', function () { var addLayer = jest.spyOn(olMap, 'addLayer'); var map = shallow(React.createElement( BasicMap, { map: olMap })); var layer = new Layer({ name: 'test', olLayer: new OLLayer() }); map.setProps({ layers: [layer] }).update(); expect(addLayer).toHaveBeenCalled(); }); test('should be fitted if extent is updated', function () { var fitExtent = jest.spyOn(OLView.prototype, 'fit'); var map = shallow(React.createElement( BasicMap, { map: olMap })); map.setProps({ extent: [1, 2, 3, 4] }).update(); expect(fitExtent).toHaveBeenCalled(); }); test('should be zoomed if zoom is updated', function () { var setZoom = jest.spyOn(OLView.prototype, 'setZoom'); var map = shallow(React.createElement( BasicMap, { map: olMap })); map.setProps({ zoom: 15 }).update(); expect(setZoom).toHaveBeenCalled(); }); test('size is updated when div is resized', function () { var spy = jest.spyOn(olMap, 'updateSize'); var map = mount(React.createElement( BasicMap, { map: olMap })); var node = map.getDOMNode(); expect(spy).toHaveBeenCalledTimes(1); // The mock class set the onResize property, we just have to run it to // simulate a resize ResizeObserver.onResize([ { target: node, contentRect: { width: 20, height: 20, }, } ]); expect(spy).toHaveBeenCalledTimes(2); }); describe('#setLayers()', function () { test('only init layers which are not already on the map.', function () { var layer0 = new Layer({ key: 'test1' }); var spyInit0 = jest.spyOn(layer0, 'init'); var spyTerminate0 = jest.spyOn(layer0, 'terminate'); var layer1 = new Layer({ key: 'test1' }); var spyInit1 = jest.spyOn(layer1, 'init'); var spyTerminate1 = jest.spyOn(layer1, 'terminate'); var layer2 = new Layer({ key: 'test2' }); var spyInit2 = jest.spyOn(layer2, 'init'); var spyTerminate2 = jest.spyOn(layer2, 'terminate'); var layer3 = new Layer({ key: 'test3' }); var spyInit3 = jest.spyOn(layer3, 'init'); var spyTerminate3 = jest.spyOn(layer3, 'terminate'); var layer4 = new Layer({ key: 'test4' }); var spyInit4 = jest.spyOn(layer4, 'init'); var spyTerminate4 = jest.spyOn(layer4, 'terminate'); var startLayers = [layer1, layer3]; var map = shallow(React.createElement( BasicMap, { map: olMap, layers: startLayers })); expect(map.instance().layers).toBe(startLayers); expect(spyInit0).toHaveBeenCalledTimes(0); expect(spyInit1).toHaveBeenCalledTimes(1); expect(spyInit2).toHaveBeenCalledTimes(0); expect(spyInit3).toHaveBeenCalledTimes(1); expect(spyInit4).toHaveBeenCalledTimes(0); expect(spyTerminate0).toHaveBeenCalledTimes(0); expect(spyTerminate1).toHaveBeenCalledTimes(1); expect(spyTerminate2).toHaveBeenCalledTimes(0); expect(spyTerminate3).toHaveBeenCalledTimes(1); expect(spyTerminate4).toHaveBeenCalledTimes(0); expect(map.instance().layers).toBe(startLayers); var layers = [layer0, layer2, layer3, layer4]; map.setProps({ layers: layers, }); expect(spyInit0).toHaveBeenCalledTimes(1); expect(spyInit1).toHaveBeenCalledTimes(1); expect(spyInit2).toHaveBeenCalledTimes(1); expect(spyInit3).toHaveBeenCalledTimes(1); expect(spyInit4).toHaveBeenCalledTimes(1); expect(spyTerminate0).toHaveBeenCalledTimes(1); expect(spyTerminate1).toHaveBeenCalledTimes(2); expect(spyTerminate2).toHaveBeenCalledTimes(1); expect(spyTerminate3).toHaveBeenCalledTimes(1); expect(spyTerminate4).toHaveBeenCalledTimes(1); expect(map.instance().layers).toBe(layers); }); }); }); //# sourceMappingURL=BasicMap.test.js.map