[Maps] Add XYZTMSSource and TileLayer unit test suites (#58567) (#58637)

This commit is contained in:
Thomas Neirynck 2020-02-26 17:01:30 -05:00 committed by GitHub
parent dbc2fab7db
commit 1ac042c7ca
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 177 additions and 4 deletions

View file

@ -4,7 +4,6 @@
* you may not use this file except in compliance with the Elastic License.
*/
import { i18n } from '@kbn/i18n';
export const EMS_CATALOGUE_PATH = 'ems/catalogue';
export const EMS_FILES_CATALOGUE_PATH = 'ems/files';
@ -54,6 +53,7 @@ export const EMS_FILE = 'EMS_FILE';
export const ES_GEO_GRID = 'ES_GEO_GRID';
export const ES_SEARCH = 'ES_SEARCH';
export const ES_PEW_PEW = 'ES_PEW_PEW';
export const EMS_XYZ = 'EMS_XYZ'; // identifies a custom TMS source. Name is a little unfortunate.
export const FIELD_ORIGIN = {
SOURCE: 'source',

View file

@ -4,14 +4,17 @@
* you may not use this file except in compliance with the Elastic License.
*/
import { IFieldType } from '../../../../../src/plugins/data/common/index_patterns/fields';
export interface ISourceDescriptor {
id: string;
type: string;
}
export interface IXYZTMSSourceDescriptor extends ISourceDescriptor {
urlTemplate: string;
}
export interface ILayerDescriptor {
sourceDescriptor: ISourceDescriptor;
id: string;
label?: string;
}

View file

@ -0,0 +1,21 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { ILayerDescriptor } from '../../common/descriptor_types';
import { ISource } from './sources/source';
export interface ILayer {
getDisplayName(): Promise<string>;
}
export interface ILayerArguments {
layerDescriptor: ILayerDescriptor;
source: ISource;
}
export class AbstractLayer implements ILayer {
constructor(layerArguments: ILayerArguments);
getDisplayName(): Promise<string>;
}

View file

@ -0,0 +1,19 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { ISourceDescriptor } from '../../../common/descriptor_types';
import { ILayer } from '../layer';
export interface ISource {
createDefaultLayer(): ILayer;
getDisplayName(): Promise<string>;
}
export class AbstractSource implements ISource {
constructor(sourceDescriptor: ISourceDescriptor, inspectorAdapters: object);
createDefaultLayer(): ILayer;
getDisplayName(): Promise<string>;
}

View file

@ -0,0 +1,15 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { AbstractSource, ISource } from './source';
export interface ITMSSource extends ISource {
getUrlTemplate(): Promise<string>;
}
export class AbstractTMSSource extends AbstractSource implements ITMSSource {
getUrlTemplate(): Promise<string>;
}

View file

@ -0,0 +1,11 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { AbstractTMSSource } from './tms_source';
import { IXYZTMSSourceDescriptor } from '../../../common/descriptor_types';
export class XYZTMSSource extends AbstractTMSSource {
constructor(sourceDescriptor: IXYZTMSSourceDescriptor, inspectorAdapters: unknown);
}

View file

@ -12,9 +12,10 @@ import { TileLayer } from '../tile_layer';
import { i18n } from '@kbn/i18n';
import { getDataSourceLabel, getUrlLabel } from '../../../common/i18n_getters';
import _ from 'lodash';
import { EMS_XYZ } from '../../../common/constants';
export class XYZTMSSource extends AbstractTMSSource {
static type = 'EMS_XYZ';
static type = EMS_XYZ;
static title = i18n.translate('xpack.maps.source.ems_xyzTitle', {
defaultMessage: 'Tile Map Service',
});

View file

@ -0,0 +1,30 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { XYZTMSSource } from './xyz_tms_source';
import { ILayer } from '../layer';
import { TileLayer } from '../tile_layer';
import { EMS_XYZ } from '../../../common/constants';
import { IXYZTMSSourceDescriptor } from '../../../common/descriptor_types';
const descriptor: IXYZTMSSourceDescriptor = {
type: EMS_XYZ,
urlTemplate: 'https://example.com/{x}/{y}/{z}.png',
id: 'foobar',
};
describe('xyz Tilemap Source', () => {
it('should create a tile-layer', () => {
const source = new XYZTMSSource(descriptor, null);
const layer: ILayer = source.createDefaultLayer();
expect(layer instanceof TileLayer).toEqual(true);
});
it('should echo url template for url template', async () => {
const source = new XYZTMSSource(descriptor, null);
const template = await source.getUrlTemplate();
expect(template).toEqual(descriptor.urlTemplate);
});
});

View file

@ -0,0 +1,18 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { AbstractLayer, ILayerArguments } from './layer';
import { ITMSSource } from './sources/tms_source';
import { ILayerDescriptor } from '../../common/descriptor_types';
interface ITileLayerArguments extends ILayerArguments {
source: ITMSSource;
layerDescriptor: ILayerDescriptor;
}
export class TileLayer extends AbstractLayer {
constructor(args: ITileLayerArguments);
}

View file

@ -0,0 +1,55 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { TileLayer } from './tile_layer';
import { EMS_XYZ } from '../../common/constants';
import { IXYZTMSSourceDescriptor } from '../../common/descriptor_types';
import { ITMSSource } from './sources/tms_source';
import { ILayer } from './layer';
const sourceDescriptor: IXYZTMSSourceDescriptor = {
type: EMS_XYZ,
urlTemplate: 'https://example.com/{x}/{y}/{z}.png',
id: 'foobar',
};
class MockTileSource implements ITMSSource {
private _descriptor: IXYZTMSSourceDescriptor;
constructor(descriptor: IXYZTMSSourceDescriptor) {
this._descriptor = descriptor;
}
createDefaultLayer(): ILayer {
throw new Error('not implemented');
}
async getDisplayName(): Promise<string> {
return this._descriptor.urlTemplate;
}
async getUrlTemplate(): Promise<string> {
return 'template/{x}/{y}/{z}.png';
}
}
describe('TileLayer', () => {
it('should use display-label from source', async () => {
const source = new MockTileSource(sourceDescriptor);
const layer: ILayer = new TileLayer({
source,
layerDescriptor: { id: 'layerid', sourceDescriptor },
});
expect(await source.getDisplayName()).toEqual(await layer.getDisplayName());
});
it('should override with custom display-label if present', async () => {
const source = new MockTileSource(sourceDescriptor);
const layer: ILayer = new TileLayer({
source,
layerDescriptor: { id: 'layerid', sourceDescriptor, label: 'custom' },
});
expect('custom').toEqual(await layer.getDisplayName());
});
});