cartodb/lib/assets/test/spec/builder/data/layer-definition-model.spec.js
2020-06-15 10:58:47 +08:00

977 lines
30 KiB
JavaScript

var Backbone = require('backbone');
var ConfigModel = require('builder/data/config-model');
var UserModel = require('builder/data/user-model');
var LayerDefinitionsCollection = require('builder/data/layer-definitions-collection');
var LayerDefinitionModel = require('builder/data/layer-definition-model');
var AnalysisDefinitionNodesCollection = require('builder/data/analysis-definition-nodes-collection');
describe('data/layer-definition-model', function () {
beforeEach(function () {
this.configModel = new ConfigModel({
base_url: '/u/pepe'
});
this.userModel = new UserModel({}, {
configModel: this.configModel
});
this.analysisDefinitionNodesCollection = new AnalysisDefinitionNodesCollection(null, {
configModel: this.configModel,
userModel: this.userModel
});
this.collection = new LayerDefinitionsCollection(null, {
configModel: this.configModel,
userModel: this.userModel,
analysisDefinitionNodesCollection: this.analysisDefinitionNodesCollection,
mapId: 'm123',
stateDefinitionModel: {}
});
this.model = new LayerDefinitionModel({
id: 'abc-123',
kind: 'carto',
options: {
type: 'CartoDB',
color: '#FABADA',
table_name: 'foo',
query: 'SELECT * FROM foo',
tile_style: 'asdasd',
visible: true
}
}, {
parse: true,
configModel: this.configModel,
collection: this.collection
});
});
it('should set autoStyle as false if it is not defined', function () {
expect(this.model.get('autoStyle')).toBe(false);
});
it('should transform some attrs to be compatible with cartodb.js', function () {
expect(this.model.get('cartocss')).toEqual('asdasd');
expect(this.model.get('tile_style')).toBeUndefined();
expect(this.model.get('sql')).toContain('SELECT');
expect(this.model.get('query')).toBeUndefined();
});
describe('.save', function () {
beforeEach(function () {
spyOn(this.model.styleModel, 'resetPropertiesFromAutoStyle');
this.model.sync = function () {};
});
describe('if autostyle is enabled', function () {
beforeEach(function () {
this.model.set('autoStyle', '8888-7777-6666-1111');
this.model.save();
});
it('should "remove" the autoStyle attribute when model is saved', function () {
expect(this.model.get('autoStyle')).toBeFalsy();
});
it('should reset styleModel styles from autostyle properties', function () {
expect(this.model.styleModel.resetPropertiesFromAutoStyle).toHaveBeenCalled();
});
it('should preserve auto style if attribute is true', function () {
var savedAttrs;
this.model.sync = function (method, model, opts) {
savedAttrs = model.attributes;
};
this.model.save({ hello: true }, { shouldPreserveAutoStyle: true });
expect(savedAttrs.autoStyle).toBeFalsy();
expect(savedAttrs.hello).toBeDefined();
});
});
describe('if autostyle is NOT enabled', function () {
beforeEach(function () {
delete this.model.attributes.autoStyle;
this.model.save();
});
it('should not reset styleModel styles if autostyle is not applied', function () {
expect(this.model.styleModel.resetPropertiesFromAutoStyle).not.toHaveBeenCalled();
expect(this.model.get('autoStyle')).toBeFalsy();
});
});
});
describe('.toJSON', function () {
it('should return the original data', function () {
expect(this.model.toJSON()).toEqual({
id: 'abc-123',
kind: 'carto',
options: {
type: 'CartoDB',
visible: true,
color: '#FABADA',
table_name: 'foo',
query: 'SELECT * FROM foo',
tile_style: 'asdasd',
style_properties: jasmine.any(Object),
cartocss_history: jasmine.any(Array),
sql_history: jasmine.any(Array)
}
});
});
it('should not include autoStyle info', function () {
this.model.set('autoStyle', '8888-7777-6666-1111');
var json = this.model.toJSON();
expect(json).not.toContain({
autoStyle: '8888-7777-6666-1111'
});
});
});
describe('styleModel', function () {
it('should create style model if table name attribute exists', function () {
expect(this.model.styleModel).toBeDefined();
});
it('should not add style model if table name doesn\'t exist', function () {
var mdl = new LayerDefinitionModel({
id: 'other',
options: {
type: 'tiled',
tile_style: 'asdasd'
}
}, {
parse: true,
configModel: this.configModel
});
expect(mdl.styleModel).toBeUndefined();
});
describe('.toJSON', function () {
it('should provide style model definition', function () {
spyOn(this.model.styleModel, 'isAutogenerated').and.returnValue(false);
var data = this.model.toJSON();
expect(data.options.style_properties).toBeDefined();
});
it('should not provide style definition if autogenerated option is true', function () {
spyOn(this.model.styleModel, 'isAutogenerated').and.returnValue(true);
var data = this.model.toJSON();
expect(data.options.style_properties).not.toBeDefined();
});
});
});
describe('.isOwnerOfAnalysisNode', function () {
beforeEach(function () {
this.nodeModel = this.analysisDefinitionNodesCollection.add({
id: 'b3',
type: 'source',
params: {
query: 'SELECT * FROM somewhere'
}
});
});
it('should return true if given layer definition model is considered owning it', function () {
expect(this.model.isOwnerOfAnalysisNode(this.nodeModel)).toBe(false);
this.model.set('letter', 'b');
expect(this.model.isOwnerOfAnalysisNode(this.nodeModel)).toBe(true);
});
});
describe('for a layer with an analysis source', function () {
beforeEach(function () {
this.model = new LayerDefinitionModel({
id: 'abc-123',
kind: 'carto',
options: {
type: 'CartoDB',
color: '#FABADA',
table_name: 'foo_table',
source: 'a1'
}
}, {
parse: true,
configModel: this.configModel
});
});
it('should have a source set', function () {
expect(this.model.get('source')).toEqual('a1');
});
describe('.toJSON', function () {
it('should return the original data', function () {
expect(this.model.toJSON()).toEqual({
id: 'abc-123',
kind: 'carto',
options: {
type: 'CartoDB',
color: '#FABADA',
table_name: 'foo_table',
source: 'a1',
style_properties: jasmine.any(Object),
cartocss_history: jasmine.any(Array),
sql_history: jasmine.any(Array)
}
});
});
});
});
describe('for a layer with an infowindow', function () {
beforeEach(function () {
this.configModel = new ConfigModel({
base_url: '/u/pepe'
});
this.model = new LayerDefinitionModel({
id: 'abc-123',
kind: 'carto',
options: {
type: 'CartoDB',
color: '#FABADA',
table_name: 'foo_table',
source: 'a1',
style_properties: jasmine.any(Object),
cartocss_history: jasmine.any(Array),
sql_history: jasmine.any(Array)
},
infowindow: {
template_name: 'infowindow_light',
latlng: [0, 0],
offset: [28, 0],
maxHeight: 180,
autoPan: true,
template: '',
content: '',
visibility: false,
alternative_names: {},
fields: [
{
name: 'description',
title: true,
position: 0
},
{
name: 'name',
title: true,
position: 1
}
],
width: 226,
headerColor: {
color: { fixed: '#35AAE5;', opacity: 1 }
}
}
}, {
parse: true,
configModel: this.configModel
});
this.infowindowModel = this.model.infowindowModel;
});
it('should have an infowindow model', function () {
expect(this.infowindowModel).toBeDefined();
expect(this.infowindowModel.get('fields').length).toEqual(2);
});
describe('infowindow/tooltip reset', function () {
beforeEach(function () {
this.model.tooltipModel = new Backbone.Model();
this.model.tooltipModel.unsetTemplate = function () {};
this.model.infowindowModel = new Backbone.Model();
this.model.infowindowModel.unsetTemplate = function () {};
spyOn(this.model.tooltipModel, 'unsetTemplate');
spyOn(this.model.infowindowModel, 'unsetTemplate');
this.styleModel = this.model.styleModel;
});
it('should reset infowindow/tooltip template and fields if style model type is aggregated', function () {
this.styleModel.set('type', 'heatmap');
expect(this.model.infowindowModel.unsetTemplate).not.toHaveBeenCalled();
expect(this.model.tooltipModel.unsetTemplate).not.toHaveBeenCalled();
this.styleModel.set('type', 'squares');
expect(this.model.infowindowModel.unsetTemplate).toHaveBeenCalled();
expect(this.model.tooltipModel.unsetTemplate).toHaveBeenCalled();
});
it('should reset infowindow/tooltip template and fields if style model has animated enabled', function () {
this.styleModel.set('type', 'simple');
expect(this.model.infowindowModel.unsetTemplate).not.toHaveBeenCalled();
expect(this.model.tooltipModel.unsetTemplate).not.toHaveBeenCalled();
this.styleModel.set('type', 'animation');
expect(this.model.infowindowModel.unsetTemplate).toHaveBeenCalled();
expect(this.model.tooltipModel.unsetTemplate).toHaveBeenCalled();
});
});
it('should not save the model if infowindow changes', function () {
spyOn(this.model, 'save');
this.infowindowModel.set('template_name', 'infowindow_dark');
expect(this.model.save).not.toHaveBeenCalled();
});
describe('.toJSON', function () {
it('should modify infowindow attribute', function () {
this.infowindowModel.setTemplate('testing');
var data = this.model.toJSON();
expect(data.infowindow.template_name).toEqual('testing');
});
it('should return the original data', function () {
expect(this.model.toJSON()).toEqual({
id: 'abc-123',
kind: 'carto',
options: {
type: 'CartoDB',
color: '#FABADA',
table_name: 'foo_table',
source: 'a1',
style_properties: jasmine.any(Object),
cartocss_history: jasmine.any(Array),
sql_history: jasmine.any(Array)
},
infowindow: {
template_name: 'infowindow_light',
latlng: [0, 0],
offset: [28, 0],
maxHeight: 180,
autoPan: true,
template: '',
content: '',
visibility: false,
alternative_names: {},
fields: [
{
name: 'description',
title: true,
position: 0
},
{
name: 'name',
title: true,
position: 1
}
],
width: 226,
headerColor: {
color: { fixed: '#35AAE5;', opacity: 1 }
}
}
});
});
it('should not provide infowindow data if model is empty', function () {
this.infowindowModel.clear();
expect(this.model.toJSON()).toEqual({
id: 'abc-123',
kind: 'carto',
options: {
type: 'CartoDB',
color: '#FABADA',
table_name: 'foo_table',
source: 'a1',
style_properties: jasmine.any(Object),
cartocss_history: jasmine.any(Array),
sql_history: jasmine.any(Array)
}
});
});
});
});
describe('.getAnalysisDefinitionNodeModel', function () {
beforeEach(function () {
this.a1 = {};
spyOn(this.model, 'findAnalysisDefinitionNodeModel').and.returnValue(this.a1);
this.model.set('source', 'a1');
this.model.getAnalysisDefinitionNodeModel();
});
it('should return the current analysis model of layer', function () {
expect(this.model.findAnalysisDefinitionNodeModel).toHaveBeenCalledWith('a1');
expect(this.model.getAnalysisDefinitionNodeModel()).toBe(this.a1);
});
});
describe('.findAnalysisDefinitionNodeModel', function () {
beforeEach(function () {
this.b1 = {id: 'b1'};
spyOn(this.collection, 'findAnalysisDefinitionNodeModel');
this.model.findAnalysisDefinitionNodeModel('b1');
});
it('should return the node for given id', function () {
this.collection.findAnalysisDefinitionNodeModel.and.returnValue(this.b1);
expect(this.model.findAnalysisDefinitionNodeModel('b1')).toBe(this.b1);
});
it('should return nothing given an id of a non-existing node', function () {
expect(this.model.findAnalysisDefinitionNodeModel('x1')).toBeUndefined();
});
});
describe('.toggleVisible', function () {
it('should toggle the visible attr', function () {
this.model.toggleVisible();
expect(this.model.get('visible')).toBe(false);
this.model.toggleVisible();
expect(this.model.get('visible')).toBe(true);
this.model.toggleVisible();
expect(this.model.get('visible')).toBe(false);
});
});
describe('.toggleCollapse', function () {
it('should toggle the collapse attr', function () {
this.model.toggleCollapse();
expect(this.model.get('collapsed')).toBe(true);
this.model.toggleCollapse();
expect(this.model.get('collapsed')).toBe(false);
this.model.toggleCollapse();
expect(this.model.get('collapsed')).toBe(true);
});
});
describe('.getNumberOfAnalyses', function () {
beforeEach(function () {
this.model.set('letter', 'a');
});
it("should return 0 if layer doesn't have a source node", function () {
expect(this.model.getNumberOfAnalyses()).toEqual(0);
});
it('should return 0 if layer has an analysis node as source node', function () {
this.analysisDefinitionNodesCollection.add({
id: 'a0',
type: 'source',
params: {
query: 'SELECT * FROM foo',
table_name: 'foo'
}
});
expect(this.model.getNumberOfAnalyses()).toEqual(0);
});
it('should return the number of analyses owned by the layer', function () {
this.analysisDefinitionNodesCollection.add([{
id: 'a0',
type: 'source',
params: {
query: 'SELECT * FROM foo'
}
}, {
id: 'a1',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'a0'
}, {
id: 'a2',
type: 'buffer',
radio: 600,
distance: 'meters',
source: 'a1'
}, {
id: 'b0',
type: 'source',
params: {
query: 'SELECT * FROM bar'
}
}, {
id: 'b1',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'b0'
}]);
this.model.set('source', 'a2');
expect(this.model.getNumberOfAnalyses()).toEqual(2);
});
});
describe('.containsNode', function () {
beforeEach(function () {
this.analysisDefinitionNodesCollection.add([{
id: 'a0',
type: 'source',
params: {
query: 'SELECT * FROM foo'
}
}, {
id: 'a1',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'a0'
}, {
id: 'b1',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'a0'
}]);
this.model.set('source', 'a1');
});
it('should return true if layer contains given node', function () {
expect(this.model.containsNode(this.analysisDefinitionNodesCollection.get('a1'))).toBe(true);
expect(this.model.containsNode(this.analysisDefinitionNodesCollection.get('a0'))).toBe(true);
expect(this.model.containsNode(this.analysisDefinitionNodesCollection.get('b1'))).toBe(false);
expect(this.model.containsNode(false)).toBe(false);
});
});
describe('.canBeDeletedByUser', function () {
it('should return true as long as it is not the only data layer and not all the other layers depend on it', function () {
expect(this.model.canBeDeletedByUser()).toBe(false);
spyOn(this.collection, 'getNumberOfDataLayers').and.returnValue(3);
expect(this.model.canBeDeletedByUser()).toBe(true);
});
});
describe('.getAllDependentLayers', function () {
beforeEach(function () {
this.model.set('letter', 'a');
this.model.set('source', 'a0');
this.collection.add([{
id: '323',
kind: 'carto',
letter: 'b',
options: {
table_name: 'alice',
source: 'a1'
}
}, {
id: '454',
kind: 'carto',
letter: 'e',
options: {
table_name: 'robin',
source: 'b1'
}
}]);
this.analysisDefinitionNodesCollection.add([{
id: 'a0',
type: 'source',
params: {
query: 'SELECT * FROM foo'
}
}, {
id: 'a1',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'a0'
}, {
id: 'b1',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'a1'
}, {
id: 'e1',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'b1'
}]);
});
it('should return two layers depending on it', function () {
/* ************************************ */
/* Expected layers schema result: */
/* _________ _________ _________ */
/* | A | | B* | | E* | */
/* | - a0 | | - a1 | | - b1 | */
/* | - a1 | | - b1 | | - e1 | */
/* _________ _________ _________ */
/* ************************************ */
expect(this.model.getAllDependentLayers()).toBe(2);
});
it('should return three layers depending on it', function () {
/* ************************************************* */
/* Expected layers schema result: */
/* _________ _________ _________ _________ */
/* | A | | B* | | E* | | F* | */
/* | - a0 | | - a1 | | - b1 | | - e1 | */
/* | - a1 | | - b1 | | - e1 | | - f1 | */
/* _________ _________ _________ _________ */
/* ************************************************* */
this.collection.add({
id: '111',
kind: 'carto',
letter: 'f',
options: {
table_name: 'punki',
source: 'e1'
}
});
this.analysisDefinitionNodesCollection.add({
id: 'f1',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'b1'
});
expect(this.model.getAllDependentLayers()).toBe(3);
});
it('should return five layers depending on it', function () {
/* **************************************************************************** */
/* Expected layers schema result: */
/* _________ _________ _________ _________ _________ _________ */
/* | A | | B* | | E* | | F* | | G* | | H* | */
/* | - a0 | | - a1 | | - b1 | | - e1 | | - f2 | | - g2 | */
/* | - a1 | | - b1 | | - e1 | | - f1 | | - g1 | | - h1 | */
/* | | | | | | | - f2 | | - g2 | | | */
/* _________ _________ _________ _________ _________ _________ */
/* ************************************************************************** */
this.collection.add([{
id: '111',
kind: 'carto',
letter: 'f',
options: {
table_name: 'punki',
source: 'e1'
}
}, {
id: '765',
kind: 'carto',
letter: 'g',
options: {
table_name: 'alice',
source: 'f2'
}
}, {
id: '888',
kind: 'carto',
letter: 'h',
options: {
table_name: 'robin',
source: 'g2'
}
}]);
this.analysisDefinitionNodesCollection.add([{
id: 'f1',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'b1'
}, {
id: 'f2',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'f1'
}, {
id: 'g1',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'f2'
}, {
id: 'g2',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'g1'
}, {
id: 'h1',
type: 'buffer',
radio: 300,
distance: 'meters',
source: 'g2'
}]);
expect(this.model.getAllDependentLayers()).toBe(5);
});
});
describe('.isEmpty', function () {
it('should rise an exeption if this function is called', function (done) {
try {
this.model.isEmpty();
} catch (error) {
expect(error).toBeDefined();
done();
}
});
});
describe('.isEmptyAsync', function () {
beforeEach(function () {
this.nodeModel = this.analysisDefinitionNodesCollection.add({
id: 'a1',
type: 'source',
params: {
query: 'SELECT * FROM somewhere'
}
});
this.model.set('source', 'a1');
});
it('should return the promise given by isEmptyAsync method from queryRowsCollection', function (done) {
var response = false;
spyOn(this.nodeModel.queryRowsCollection, 'isEmptyAsync');
this.nodeModel.queryRowsCollection.isEmptyAsync.and.returnValue(Promise.resolve(response));
this.model.isEmptyAsync()
.then(function (isEmpty) {
expect(isEmpty).toEqual(response);
done();
});
});
});
describe('.isDone', function () {
beforeEach(function () {
this.nodeModel = this.analysisDefinitionNodesCollection.add({
id: 'a1',
type: 'source',
params: {
query: 'SELECT * FROM somewhere'
}
});
this.model.set('source', 'a1');
spyOn(this.nodeModel.queryRowsCollection, 'isDone');
spyOn(this.nodeModel.queryGeometryModel, 'isDone');
spyOn(this.nodeModel.querySchemaModel, 'isDone');
});
it('should be false if queryRowsCollection is not done', function () {
this.nodeModel.queryRowsCollection.isDone.and.returnValue(false);
this.nodeModel.queryGeometryModel.isDone.and.returnValue(true);
this.nodeModel.querySchemaModel.isDone.and.returnValue(true);
expect(this.model.isDone()).toEqual(false);
});
it('should be false if queryGeometryModel is not done', function () {
this.nodeModel.queryRowsCollection.isDone.and.returnValue(true);
this.nodeModel.queryGeometryModel.isDone.and.returnValue(false);
this.nodeModel.querySchemaModel.isDone.and.returnValue(true);
expect(this.model.isDone()).toEqual(false);
});
it('should be false if querySchemaModel is not done', function () {
this.nodeModel.queryRowsCollection.isDone.and.returnValue(true);
this.nodeModel.queryGeometryModel.isDone.and.returnValue(true);
this.nodeModel.querySchemaModel.isDone.and.returnValue(false);
expect(this.model.isDone()).toEqual(false);
});
it('should be true if queryRowsCollection, queryGeometryModel and querySchemaModel are done', function () {
this.nodeModel.queryRowsCollection.isDone.and.returnValue(true);
this.nodeModel.queryGeometryModel.isDone.and.returnValue(true);
this.nodeModel.querySchemaModel.isDone.and.returnValue(true);
expect(this.model.isDone()).toEqual(true);
});
});
describe('.canBeGeoreferenced', function () {
beforeEach(function () {
this.nodeModel = this.analysisDefinitionNodesCollection.add({
id: 'a1',
type: 'source',
params: {
query: 'SELECT * FROM somewhere'
}
});
this.model.set('source', 'a1');
spyOn(this.nodeModel.queryRowsCollection, 'isEmptyAsync');
spyOn(this.nodeModel.queryGeometryModel, 'hasValueAsync');
spyOn(this.model, 'getAnalysisDefinitionNodeModel').and.returnValue(this.nodeModel);
spyOn(this.nodeModel, 'isCustomQueryApplied');
});
it('should be true if there is data, no geocoding analysis applied, no custom query or doesn\'t have geom', function (done) {
this.nodeModel.queryRowsCollection.isEmptyAsync.and.returnValue(Promise.resolve(false));
this.nodeModel.queryGeometryModel.hasValueAsync.and.returnValue(Promise.resolve(false));
this.nodeModel.isCustomQueryApplied.and.returnValue(false);
this.model.canBeGeoreferenced()
.then(function (canBeGeoreferenced) {
expect(canBeGeoreferenced).toEqual(true);
done();
});
});
it('should be false if there is no data', function (done) {
this.nodeModel.queryRowsCollection.isEmptyAsync.and.returnValue(Promise.resolve(true));
this.nodeModel.queryGeometryModel.hasValueAsync.and.returnValue(Promise.resolve(false));
this.nodeModel.isCustomQueryApplied.and.returnValue(false);
this.model.canBeGeoreferenced()
.then(function (canBeGeoreferenced) {
expect(canBeGeoreferenced).toEqual(false);
done();
});
});
it('should be false if there is a geocoding analysis applied', function (done) {
this.nodeModel.set('type', 'geocoding');
this.nodeModel.queryRowsCollection.isEmptyAsync.and.returnValue(Promise.resolve(true));
this.nodeModel.queryGeometryModel.hasValueAsync.and.returnValue(Promise.resolve(false));
this.nodeModel.isCustomQueryApplied.and.returnValue(false);
this.model.canBeGeoreferenced()
.then(function (canBeGeoreferenced) {
expect(canBeGeoreferenced).toEqual(false);
done();
});
});
it('should be false if there is a custom query applied', function (done) {
this.nodeModel.queryRowsCollection.isEmptyAsync.and.returnValue(Promise.resolve(true));
this.nodeModel.queryGeometryModel.hasValueAsync.and.returnValue(Promise.resolve(false));
this.nodeModel.isCustomQueryApplied.and.returnValue(true);
this.model.canBeGeoreferenced()
.then(function (canBeGeoreferenced) {
expect(canBeGeoreferenced).toEqual(false);
done();
});
});
it('should be false if there is geom value', function (done) {
this.nodeModel.queryRowsCollection.isEmptyAsync.and.returnValue(Promise.resolve(true));
this.nodeModel.queryGeometryModel.hasValueAsync.and.returnValue(Promise.resolve(true));
this.nodeModel.isCustomQueryApplied.and.returnValue(true);
this.model.canBeGeoreferenced()
.then(function (canBeGeoreferenced) {
expect(canBeGeoreferenced).toEqual(false);
done();
});
});
});
describe('.fetchQueryRowsIfRequired', function () {
var fetchSpy;
beforeEach(function () {
this.nodeModel = this.analysisDefinitionNodesCollection.add({
id: 'a1',
type: 'source',
params: {
query: 'SELECT * FROM somewhere'
}
});
this.model.set('source', 'a1');
this.nodeModel.set('type', 'random');
spyOn(this.nodeModel.queryGeometryModel, 'hasValueAsync');
spyOn(this.nodeModel.queryRowsCollection, 'isUnavailable');
spyOn(this.nodeModel, 'isCustomQueryApplied');
spyOn(this.model, 'getAnalysisDefinitionNodeModel').and.returnValue(this.nodeModel);
fetchSpy = spyOn(this.nodeModel.queryRowsCollection, 'fetch');
});
it('should fetch if everything is ok', function (done) {
this.nodeModel.queryGeometryModel.hasValueAsync.and.returnValue(Promise.resolve(false));
this.nodeModel.isCustomQueryApplied.and.returnValue(false);
this.nodeModel.queryRowsCollection.isUnavailable.and.returnValue(true);
this.model.fetchQueryRowsIfRequired();
setTimeout(function () {
expect(fetchSpy).toHaveBeenCalled();
done();
}, 0);
});
it('should not fetch if it has geocoding', function (done) {
this.nodeModel.set('type', 'geocoding');
this.nodeModel.queryGeometryModel.hasValueAsync.and.returnValue(Promise.resolve(false));
this.nodeModel.isCustomQueryApplied.and.returnValue(false);
this.nodeModel.queryRowsCollection.isUnavailable.and.returnValue(true);
this.model.fetchQueryRowsIfRequired();
setTimeout(function () {
expect(fetchSpy).not.toHaveBeenCalled();
done();
}, 0);
});
it('should not fetch if queryGeometryModel has value', function (done) {
this.nodeModel.set('type', 'fake');
this.nodeModel.queryGeometryModel.hasValueAsync.and.returnValue(Promise.resolve(true));
this.nodeModel.isCustomQueryApplied.and.returnValue(false);
this.nodeModel.queryRowsCollection.isUnavailable.and.returnValue(true);
this.model.fetchQueryRowsIfRequired();
setTimeout(function () {
expect(fetchSpy).not.toHaveBeenCalled();
done();
}, 0);
});
it('should not fetch if there is a custom query applied', function (done) {
this.nodeModel.set('type', 'fake');
this.nodeModel.queryGeometryModel.hasValueAsync.and.returnValue(Promise.resolve(false));
this.nodeModel.isCustomQueryApplied.and.returnValue(true);
this.nodeModel.queryRowsCollection.isUnavailable.and.returnValue(true);
this.model.fetchQueryRowsIfRequired();
setTimeout(function () {
expect(fetchSpy).not.toHaveBeenCalled();
done();
}, 0);
});
it('should not fetch if it is available', function (done) {
this.nodeModel.set('type', 'fake');
this.nodeModel.queryGeometryModel.hasValueAsync.and.returnValue(Promise.resolve(false));
this.nodeModel.isCustomQueryApplied.and.returnValue(false);
this.nodeModel.queryRowsCollection.isUnavailable.and.returnValue(false);
this.model.fetchQueryRowsIfRequired();
setTimeout(function () {
expect(fetchSpy).not.toHaveBeenCalled();
done();
}, 0);
});
});
});