cartodb-4.42/lib/assets/test/spec/builder/deep-insights-integration/map-integration.spec.js
2024-04-06 05:25:13 +00:00

213 lines
7.7 KiB
JavaScript

var _ = require('underscore');
var deepInsightsIntegrationSpecHelpers = require('./deep-insights-integration-spec-helpers');
var MapIntegration = require('builder/deep-insights-integration/map-integration');
var AppNotifications = require('builder/app-notifications');
describe('deep-insights-integrations/map-integration', function () {
var mapElement;
beforeAll(function () {
spyOn(_, 'debounce').and.callFake(function (func) {
return function () {
func.apply(this, arguments);
};
});
});
beforeEach(function (done) {
jasmine.Ajax.install();
AppNotifications.init();
// Mock Map instantiation response
jasmine.Ajax.stubRequest(new RegExp(/api\/v1\/map/)).andReturn({
status: 200,
contentType: 'application/json; charset=utf-8',
responseText: '{ "layergroupid": "123456789", "metadata": { "layers": [] } }'
});
var onDashboardCreated = function (dashboard) {
var fakeObjects = deepInsightsIntegrationSpecHelpers.createFakeObjects(dashboard);
_.extend(this, fakeObjects);
spyOn(this.diDashboardHelpers.getDashboard(), 'onStateChanged').and.callThrough();
spyOn(this.stateDefinitionModel, 'updateState');
// Track map integration
this.integration = MapIntegration.track({
diDashboardHelpers: this.diDashboardHelpers,
editorModel: this.editorModel,
mapDefinitionModel: this.mapDefinitionModel,
stateDefinitionModel: this.stateDefinitionModel,
visDefinitionModel: this.visDefinitionModel
});
done();
}.bind(this);
mapElement = deepInsightsIntegrationSpecHelpers.createFakeDOMElement();
deepInsightsIntegrationSpecHelpers.createFakeDashboard(mapElement, onDashboardCreated);
});
afterEach(function () {
this.integration._mapDefinitionModel.off();
this.integration._map.off();
this.integration._vis.off();
this.integration = null;
document.body.removeChild(mapElement);
jasmine.Ajax.uninstall();
AppNotifications.off();
});
it('mapViewSizeChanged', function () {
var map = this.diDashboardHelpers.visMap();
spyOn(map, 'getMapViewSize').and.returnValue({
x: 120,
y: 133
});
spyOn(this.mapDefinitionModel, 'setMapViewSize').and.callThrough();
map.trigger('mapViewSizeChanged');
expect(this.mapDefinitionModel.setMapViewSize).toHaveBeenCalled();
expect(this.mapDefinitionModel.getMapViewSize()).toEqual({
x: 120,
y: 133
});
});
describe('when vis reloads', function () {
it('should increment changes', function () {
this.diDashboardHelpers.getMap().trigger('reload');
expect(this.visDefinitionModel.get('visChanges')).toBe(1);
});
});
describe('visMetadata', function () {
beforeEach(function () {
spyOn(this.mapDefinitionModel, 'setImageExportMetadata');
spyOn(this.mapDefinitionModel, 'setStaticImageURLTemplate');
});
it('should update vis metadata when state changes', function () {
this.diDashboardHelpers.getDashboard()._dashboard.vis.trigger('dataviewsFetched');
this.diDashboardHelpers.visMap().set('center', [10, 20]);
expect(this.mapDefinitionModel.setImageExportMetadata).toHaveBeenCalled();
expect(this.mapDefinitionModel.setStaticImageURLTemplate).toHaveBeenCalled();
});
it('update vis metadata when vis reload', function () {
this.diDashboardHelpers.getMap().trigger('reload');
expect(this.mapDefinitionModel.setImageExportMetadata).toHaveBeenCalled();
expect(this.mapDefinitionModel.setStaticImageURLTemplate).toHaveBeenCalled();
});
});
describe('max/min zoom changes', function () {
beforeEach(function () {
this.diDashboardHelpers.visMap().set({
minZoom: 1,
maxZoom: 20,
zoom: 12
});
this.mapDefinitionModel.set({
minZoom: 0,
maxZoom: 15
});
// Avoid HTTP requests setting img src to nothing
this.diDashboardHelpers.getDashboard()._dashboard.dashboardView.$('img').attr('src', '');
});
it('should change max and min zoom of the map if changes in map-definition-model', function () {
expect(this.diDashboardHelpers.visMap().get('minZoom')).toBe(0);
expect(this.diDashboardHelpers.visMap().get('maxZoom')).toBe(15);
});
it('should change map zoom if maxZoom is not as high as the current one', function () {
expect(this.diDashboardHelpers.visMap().get('zoom')).toBe(12);
this.mapDefinitionModel.set({
minZoom: 0,
maxZoom: 9
});
// Avoid HTTP requests setting img src to nothing
this.diDashboardHelpers.getDashboard()._dashboard.dashboardView.$('img').attr('src', '');
expect(this.diDashboardHelpers.visMap().get('zoom')).toBe(9);
});
});
describe('legends option', function () {
it('when activating legends', function () {
var vis = this.diDashboardHelpers.getMap();
this.mapDefinitionModel.set({legends: true});
expect(vis.settings.get('showLegends')).toBe(true);
this.mapDefinitionModel.set({legends: false});
expect(vis.settings.get('showLegends')).toBe(false);
});
});
describe('scrollwheel option', function () {
it('when activating scrollwheel', function () {
var map = this.diDashboardHelpers.visMap();
spyOn(map, 'enableScrollWheel');
spyOn(map, 'disableScrollWheel');
this.mapDefinitionModel.set({scrollwheel: !this.mapDefinitionModel.get('scrollwheel')});
this.mapDefinitionModel.set({scrollwheel: !this.mapDefinitionModel.get('scrollwheel')});
expect(map.enableScrollWheel).toHaveBeenCalled();
expect(map.disableScrollWheel).toHaveBeenCalled();
});
});
describe('stateDefinitionModel', function () {
beforeEach(function () {
// All "widgets dataviews" fetched, ready to listen state changes
this.diDashboardHelpers.getDashboard()._dashboard.vis.trigger('dataviewsFetched');
});
it('should be bind to state changes', function () {
expect(this.diDashboardHelpers.getDashboard().onStateChanged).toHaveBeenCalled();
});
it('should change state model when there is any state map change from DI', function () {
expect(this.diDashboardHelpers.getDashboard().onStateChanged).toHaveBeenCalled();
this.diDashboardHelpers.visMap().set('center', [10, 20]);
expect(this.stateDefinitionModel.updateState).toHaveBeenCalled();
});
it('should change state model when there is any state widget change from DI', function () {
expect(this.diDashboardHelpers.getDashboard().onStateChanged).toHaveBeenCalled();
// Simulate a widget change
this.diDashboardHelpers.getDashboard()._dashboard.widgets._widgetsCollection.trigger('change');
expect(this.stateDefinitionModel.updateState).toHaveBeenCalled();
});
it('should set bounds in CARTO.js map when state triggers a "boundsSet" event', function () {
var bounds = [ 808 ];
spyOn(this.diDashboardHelpers, 'setBounds');
this.stateDefinitionModel.setBounds(bounds);
expect(this.diDashboardHelpers.setBounds).toHaveBeenCalledWith(bounds);
});
});
describe('edition option', function () {
it('when changing edition', function () {
spyOn(this.diDashboardHelpers, 'forceResize');
var checked = this.editorModel.get('edition');
this.editorModel.set({ edition: !checked });
expect(this.diDashboardHelpers.forceResize).toHaveBeenCalled();
});
});
describe('when vis error:limit', function () {
it('should add the error to AppNotifications', function () {
spyOn(AppNotifications, 'addNotification');
var error = { type: 'test', message: 'some message' };
this.diDashboardHelpers.visMap().trigger('error:limit', error);
expect(AppNotifications.addNotification).toHaveBeenCalledWith(error);
});
});
});