UNPKG

react-spatial

Version:

Components to build React map apps.

162 lines (150 loc) 5.4 kB
import 'jest-canvas-mock'; import React from 'react'; import renderer from 'react-test-renderer'; import { configure, shallow } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; import Map from 'ol/Map'; import View from 'ol/View'; import { TiImage } from 'react-icons/ti'; import RenderEvent from 'ol/render/Event'; import CanvasSaveButton from './CanvasSaveButton'; configure({ adapter: new Adapter() }); describe('CanvasSaveButton', function () { var olMap; var conf = { title: 'Karte als Bild speichern.', icon: React.createElement( TiImage, { focusable: false }), className: 'ta-example', saveFormat: 'image/jpeg', }; beforeEach(function () { var target = document.createElement('div'); document.body.appendChild(target); target.style.width = '100px'; target.style.height = '100px'; olMap = new Map({ target: target, controls: [], view: new View({ center: [0, 0], zoom: 0, }), }); olMap.getView().setCenter([1, 1]); }); afterEach(function () { if (olMap.getTargetElement()) { document.body.removeChild(olMap.getTargetElement()); } olMap.setTarget(null); }); test('should match snapshot.', function () { var component = renderer.create( React.createElement( CanvasSaveButton, { title: conf.title, saveFormat: conf.saveFormat, map: olMap }, conf.icon ) ); var tree = component.toJSON(); expect(tree).toMatchSnapshot(); }); test('should call onSaveBefore then download then onSaveEnd function on click.', async function (done) { var saveStart = jest.fn(function (m) { return Promise.resolve(m); }); var saveEnd = jest.fn(); var wrapper = shallow( React.createElement( CanvasSaveButton, { className: "ta-example", title: conf.title, map: olMap, saveFormat: conf.saveFormat, onSaveStart: saveStart, onSaveEnd: saveEnd, extraData: { copyright: { text: function () { return ( 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' + 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' + 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' + 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' + 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' + 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' + 'contributors, SRTM | map style: © OpenTopoMap (CC-BY-SA)' ); }, }, } }, conf.icon ) ); var link = document.createElement('a'); link.click = jest.fn(); var div = document.createElement('div'); var canvas = document.createElement('canvas'); canvas.toBlob = jest.fn(function (callback) { return callback(); }); global.URL.createObjectURL = jest.fn(function () { return 'fooblob'; }); // We use a spy here to be able to correctly restore the initial function var spy3 = jest .spyOn(global.document, 'createElement') .mockImplementation(function (elt) { if (elt === 'canvas') { return canvas; } if (elt === 'div') { return div; } if (elt === 'a') { return link; } return {}; }); var spy = jest.spyOn(CanvasSaveButton.prototype, 'createCanvasImage'); var spy2 = jest.spyOn(CanvasSaveButton.prototype, 'downloadCanvasImage'); var spy4 = jest.spyOn(CanvasSaveButton.prototype, 'splitCopyrightLine'); jest .spyOn(olMap.getTargetElement(), 'getElementsByTagName') .mockReturnValue([canvas]); await wrapper.find('.ta-example').simulate('click'); await olMap.dispatchEvent( new RenderEvent('rendercomplete', undefined, undefined, { canvas: canvas, }) ); await window.setTimeout(function () { expect(spy).toHaveBeenCalledTimes(1); expect(saveStart).toHaveBeenCalledTimes(1); expect(saveEnd).toHaveBeenCalledTimes(1); expect(spy2.mock.calls[0][0]).toBe(canvas); expect(spy2.mock.calls[0][0].toBlob).toHaveBeenCalledTimes(1); expect(link.href).toBe('http://localhost/fooblob'); expect(link.download).toBe('.jpg'); expect(link.click).toHaveBeenCalledTimes(1); expect(spy4).toHaveBeenCalledTimes(1); spy.mockRestore(); spy2.mockRestore(); spy3.mockRestore(); spy4.mockRestore(); done(); }); }); test('stops click event propagation on ie.', function () { var wrapper = shallow( React.createElement( CanvasSaveButton, { className: "ta-example", title: conf.title, map: olMap }, conf.icon ) ); var evt = { stopPropagation: jest.fn(), preventDefault: jest.fn(), }; window.navigator.msSaveBlob = true; var canvas = document.createElement('canvas'); var p = new Promise(function (resolve) { resolve(canvas); }); jest .spyOn(CanvasSaveButton.prototype, 'createCanvasImage') .mockReturnValue(p); wrapper.find('.ta-example').simulate('click', evt); expect(evt.stopPropagation).toHaveBeenCalledTimes(1); expect(evt.preventDefault).toHaveBeenCalledTimes(1); window.navigator.msSaveBlob = false; }); }); //# sourceMappingURL=CanvasSaveButton.test.js.map