Files
cartodb/lib/assets/test/spec/builder/components/modals/add-widgets/create-tuples-items.spec.js
2020-06-15 10:58:47 +08:00

196 lines
5.8 KiB
JavaScript

var _ = require('underscore');
var ConfigModel = require('builder/data/config-model');
var UserModel = require('builder/data/user-model');
var AnalysisDefinitionNodesCollection = require('builder/data/analysis-definition-nodes-collection');
var LayerDefinitionsCollection = require('builder/data/layer-definitions-collection');
var createTuplesItems = require('builder/components/modals/add-widgets/create-tuples-items');
describe('components/modals/add-widgets/create-tuples-items', function () {
beforeEach(function () {
var configModel = new ConfigModel({
base_url: '/u/pepe'
});
var userModel = new UserModel({}, {
configModel: configModel
});
this.analysisDefinitionNodesCollection = new AnalysisDefinitionNodesCollection(null, {
configModel: configModel,
userModel: userModel
});
this.analysisDefinitionNodesCollection.add({
id: 'a0',
type: 'source',
query: 'SELECT * FROM table_name'
});
this.analysisDefinitionNodesCollection.add({
id: 'b0',
type: 'source',
query: 'SELECT * FROM table_name_two'
});
this.analysisDefinitionNodesCollection.add({
id: 'a1',
type: 'buffer',
radio: 300,
source: 'a0'
});
this.analysisDefinitionNodesCollection.add({
id: 'b1',
type: 'buffer',
radio: 300,
source: 'a1'
});
this.analysisDefinitionNodesCollection.add({
id: 'secondary_source', // created when selecting secondary nodes, so technically orphaned if not used later.
type: 'source',
query: 'SELECT * FROM secondary_source'
});
this.layerDefinitionsCollection = new LayerDefinitionsCollection([
{
id: 'l0',
kind: 'tiled'
}, {
id: 'l1',
kind: 'carto',
options: {
table_name: 'foo_table'
}
}, {
id: 'l2',
kind: 'carto',
options: {
table_name: 'bar_table'
}
}
], {
configModel: configModel,
userModel: userModel,
analysisDefinitionNodesCollection: this.analysisDefinitionNodesCollection,
mapId: 'm-123',
stateDefinitionModel: {}
});
var a1 = this.analysisDefinitionNodesCollection.get('a1');
a1.querySchemaModel.columnsCollection.reset([
{
name: 'cartodb_id',
type: 'number'
}, {
name: 'county_name',
type: 'string'
}, {
name: 'the_geom',
type: 'geom'
}, {
name: 'the_geom_webmercator',
type: 'geom'
}, {
name: 'pop_count',
type: 'number'
}, {
name: 'created_at',
type: 'date'
}, {
name: 'updated_at',
type: 'date'
}
]);
var b1 = this.analysisDefinitionNodesCollection.get('b1');
b1.querySchemaModel.columnsCollection.reset([
{
name: 'cartodb_id',
type: 'number'
}, {
name: 'pop_count',
type: 'number'
}
]);
var secondary = this.analysisDefinitionNodesCollection.get('secondary_source');
secondary.querySchemaModel.columnsCollection.reset([
{
name: 'only_for_secondary',
type: 'number'
}
]);
a1.queryGeometryModel.isDone = function () {
return true;
};
a1.queryGeometryModel.set('simple_geom', true);
b1.queryGeometryModel.isDone = function () {
return true;
};
b1.queryGeometryModel.set('simple_geom', true);
this.tuplesItems = createTuplesItems(this.analysisDefinitionNodesCollection, this.layerDefinitionsCollection);
});
it('should return an object', function () {
expect(this.tuplesItems).toEqual(jasmine.any(Object));
});
it('should contain an item for each column name+type match', function () {
expect(this.tuplesItems['county_name-string'].length).toEqual(1);
expect(this.tuplesItems['pop_count-number'].length).toEqual(2);
});
it('should not add items for blacklisted columns', function () {
var keys = _.keys(this.tuplesItems).toString();
expect(keys).not.toContain('the_geom');
expect(keys).not.toContain('the_geom_webmercator');
expect(keys).not.toContain('created_at');
expect(keys).not.toContain('updated_at');
});
it('should not contain a tuple when no geometry data', function () {
var b1 = this.analysisDefinitionNodesCollection.get('b1');
b1.queryGeometryModel.isDone = function () {
return false;
};
b1.queryGeometryModel.set('simple_geom', false);
this.tuplesItems = createTuplesItems(this.analysisDefinitionNodesCollection, this.layerDefinitionsCollection);
var tuples = this.tuplesItems['pop_count-number'];
expect(tuples.length).toBe(1);
expect(tuples[0].layerDefinitionModel.id).toEqual('l1');
});
it('should contain a tuple of column+layer definition in each item', function () {
var tuples = this.tuplesItems['pop_count-number'];
expect(tuples[0].columnModel).toBeDefined();
expect(tuples[0].columnModel.get('name')).toEqual('pop_count');
expect(tuples[0].layerDefinitionModel.id).toEqual('l1');
expect(tuples[1].columnModel).toBeDefined();
expect(tuples[1].columnModel.get('name')).toEqual('pop_count');
expect(tuples[1].layerDefinitionModel.id).toEqual('l2');
});
it('should skip nodes that does not have an owning layer', function () {
for (var columnName in this.tuplesItems) {
var tuples = this.tuplesItems[columnName];
tuples.forEach(function (tuple) {
expect(tuple.columnModel).toBeDefined('a tuple for ' + columnName + ' is missing columnModel');
expect(tuple.layerDefinitionModel).toBeDefined('a tuple for ' + columnName + ' is missing layerDefinitionModel');
expect(tuple.analysisDefinitionNodeModel).toBeDefined('a tuple for ' + columnName + ' is missing analysisDefinitionModel');
}, this);
}
});
});