import * as React from 'react';
import Layer from '../layer';
import { withContext } from 'recompose';
import { mount } from 'enzyme';
const PropTypes = require('prop-types'); // tslint:disable-line
describe('Layer', () => {
let LayerWithContext: any;
let addLayerMock = jest.fn();
let addSourceMock = jest.fn();
let addImageMock = jest.fn();
let setDataMock = jest.fn();
let children: any[];
let childrenWithOneFeature: any[];
let feature: any;
beforeEach(() => {
addLayerMock = jest.fn();
addSourceMock = jest.fn();
setDataMock = jest.fn();
addImageMock = jest.fn();
feature = { coordinates: [-123, 45] };
children = [{ props: {} }];
childrenWithOneFeature = [{ props: feature }];
LayerWithContext = withContext(
{
map: PropTypes.object
},
() => ({
map: {
addSource: addSourceMock,
addLayer: addLayerMock,
addImage: addImageMock,
on: jest.fn(),
getSource: jest.fn().mockReturnValue({ setData: setDataMock })
}
})
)(Layer);
});
it('Should render layer with default options', () => {
mount();
expect(addLayerMock.mock.calls[0]).toEqual([
{
id: undefined,
source: undefined,
type: 'symbol',
layout: {},
paint: {}
},
undefined
]);
});
it('Should set all parameters of add layer', () => {
const before = 'test1';
const props = {
id: '123',
type: 'symbol',
paint: {},
layout: {},
metadata: {},
filter: []
};
const mappedProps = {
minZoom: 2,
maxZoom: 10,
sourceLayer: 'sourceTest',
sourceId: 'test'
};
mount(
);
expect(addLayerMock.mock.calls[0]).toEqual([
{
...props,
minzoom: 2,
maxzoom: 10,
source: 'test',
'source-layer': 'sourceTest'
},
before
]);
});
it('Should render layer with default source', () => {
mount();
expect(addSourceMock.mock.calls[0]).toEqual([
undefined,
{
type: 'geojson',
data: {
type: 'FeatureCollection',
features: []
}
}
]);
});
it('Should set all parameters of add source with geojsonSourceOptions', () => {
const geoJSONSourceOptions = {
maxzoom: 10,
buffer: 2,
tolerance: 1,
cluster: 10,
clusterRadius: 50,
clusterMaxZoom: 10
};
const layerSourceId = 'testId';
mount(
);
expect(addSourceMock.mock.calls[0]).toEqual([
layerSourceId,
{
type: 'geojson',
...geoJSONSourceOptions,
data: {
type: 'FeatureCollection',
features: []
}
}
]);
});
it('Should set features based on children', () => {
const layer = mount();
expect(setDataMock.mock.calls[0]).toEqual([
{
type: 'FeatureCollection',
features: [
{
geometry: { ...feature, type: 'Point' },
properties: { id: 0 },
type: 'Feature'
}
]
}
]);
});
it('Should set features to empty array when children disappear', () => {
const layer = mount();
layer.setProps({ children: undefined });
expect(setDataMock.mock.calls[1]).toEqual([
{
type: 'FeatureCollection',
features: []
}
]);
});
it('Should flatten features', () => {
const childrens = [
Test
, [Test
, Test
]];
const layer = mount();
expect(setDataMock.mock.calls[0][0].features).toHaveLength(3);
});
it('Should add images', () => {
const images = ['test', new Image(), {}];
mount();
expect(addImageMock.mock.calls[0]).toEqual(images);
});
});