202 lines
6.5 KiB
JavaScript
202 lines
6.5 KiB
JavaScript
var ConfigModel = require('builder/data/config-model');
|
|
var DatasetOptionsView = require('builder/dataset/dataset-options/dataset-options-view');
|
|
var UserModel = require('builder/data/user-model');
|
|
var AnalysisDefinitionNodeSourceModel = require('builder/data/analysis-definition-node-source-model');
|
|
var VisModel = require('builder/data/vis-definition-model');
|
|
var LayerDefinitionModel = require('builder/data/layer-definition-model');
|
|
var EditorModel = require('builder/data/editor-model');
|
|
|
|
describe('dataset/dataset-options-view', function () {
|
|
beforeEach(function () {
|
|
var configModel = new ConfigModel({
|
|
base_url: '/u/pepe',
|
|
user_name: 'pepe'
|
|
});
|
|
|
|
var userModel = new UserModel({
|
|
username: 'pepe',
|
|
actions: {
|
|
private_tables: true
|
|
}
|
|
}, {
|
|
configModel: configModel
|
|
});
|
|
|
|
this.analysisDefinitionNodeModel = new AnalysisDefinitionNodeSourceModel({
|
|
query: 'select * from table_1',
|
|
table_name: 'table_1',
|
|
id: 'dummy-id'
|
|
}, {
|
|
tableData: {
|
|
permission: {
|
|
owner: {
|
|
username: 'pepe'
|
|
}
|
|
},
|
|
synchronization: {}
|
|
},
|
|
configModel: configModel,
|
|
userModel: userModel
|
|
});
|
|
|
|
this.querySchemaModel = this.analysisDefinitionNodeModel.querySchemaModel;
|
|
this.queryGeometryModel = this.analysisDefinitionNodeModel.queryGeometryModel;
|
|
this.tableModel = this.analysisDefinitionNodeModel.getTableModel();
|
|
this.syncModel = this.tableModel.getSyncModel();
|
|
|
|
spyOn(this.querySchemaModel, 'fetch');
|
|
spyOn(this.queryGeometryModel, 'fetch');
|
|
spyOn(this.tableModel, 'isSync');
|
|
|
|
this.editorModel = new EditorModel();
|
|
|
|
var layerDefinitionModel = new LayerDefinitionModel({
|
|
id: 'l-1',
|
|
type: 'CartoDB',
|
|
table_name: 'table_1'
|
|
}, {
|
|
configModel: configModel
|
|
});
|
|
|
|
this.visModel = new VisModel({
|
|
name: 'table_1',
|
|
privacy: 'PUBLIC'
|
|
}, {
|
|
configModel: configModel
|
|
});
|
|
|
|
var router = jasmine.createSpyObj('router', ['navigate']);
|
|
var modals = jasmine.createSpyObj('modals', ['create', 'isOpen']);
|
|
|
|
spyOn(DatasetOptionsView.prototype, '_onChangeName').and.callThrough();
|
|
|
|
this.view = new DatasetOptionsView({
|
|
editorModel: this.editorModel,
|
|
router: router,
|
|
modals: modals,
|
|
configModel: configModel,
|
|
userModel: userModel,
|
|
analysisDefinitionNodeModel: this.analysisDefinitionNodeModel,
|
|
visModel: this.visModel,
|
|
layerDefinitionModel: layerDefinitionModel,
|
|
onToggleEdition: function () {}
|
|
});
|
|
|
|
spyOn(this.view, '_onToggleEdition');
|
|
|
|
this.view.render();
|
|
});
|
|
|
|
afterEach(function () {
|
|
this.view.clean();
|
|
});
|
|
|
|
it('should render properly', function () {
|
|
expect(this.view.$('.Options-bar').length).toBe(1);
|
|
expect(this.view.$('.js-input').length).toBe(1);
|
|
expect(this.view.$('.js-input:checked').length).toBe(0);
|
|
expect(this.view.$('.js-previewMap').length).toBe(1);
|
|
expect(this.view.$('.js-createMap').length).toBe(1);
|
|
});
|
|
|
|
it('should render properly when edition', function () {
|
|
var content = this.view._codemirrorModel.get('content');
|
|
this.editorModel.set('edition', true);
|
|
expect(this.view.$('.Dataset-codemirror').length).toBe(1);
|
|
expect(content).toContain('table_1');
|
|
});
|
|
|
|
it('should not apply an empty query', function () {
|
|
this.view._codemirrorModel.set('content', '');
|
|
this.view._parseSQL();
|
|
expect(this.querySchemaModel.fetch).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('should fetch geometry when a query is applied', function () {
|
|
this.view._codemirrorModel.set('content', 'select * from whatever');
|
|
this.view._parseSQL();
|
|
expect(this.queryGeometryModel.get('simple_geom')).toBe('');
|
|
expect(this.queryGeometryModel.get('query')).toBe('select * from whatever');
|
|
expect(this.queryGeometryModel.fetch).toHaveBeenCalled();
|
|
});
|
|
|
|
it('should remove ; character from the query if it is in the last position', function () {
|
|
this.view._codemirrorModel.set('content', 'select * from whatever;');
|
|
this.view._parseSQL();
|
|
expect(this.view._codemirrorModel.get('content')).toBe('select * from whatever');
|
|
expect(this.querySchemaModel.fetch).toHaveBeenCalled();
|
|
|
|
this.view._codemirrorModel.set('content', 'select * from whatever; hello');
|
|
this.view._parseSQL();
|
|
expect(this.view._codemirrorModel.get('content')).toBe('select * from whatever; hello');
|
|
});
|
|
|
|
it('should render preview button if geometry exists', function () {
|
|
this.queryGeometryModel.set('simple_geom', 'polygon');
|
|
this.querySchemaModel.columnsCollection.reset([{
|
|
name: 'the_geom_webmercator'
|
|
}]);
|
|
this.view.render();
|
|
|
|
expect(this.view.$('.js-previewMap').length).toBe(1);
|
|
});
|
|
|
|
it('should respond to change dataset name', function () {
|
|
spyOn(this.view, '_parseSQL');
|
|
this.analysisDefinitionNodeModel.setTableName('foo'); // This happens in another view (dataset-header-view)
|
|
this.visModel.set('name', 'foo');
|
|
expect(DatasetOptionsView.prototype._onChangeName).toHaveBeenCalled();
|
|
expect(this.view._parseSQL).not.toHaveBeenCalled();
|
|
|
|
var content = this.view._codemirrorModel.get('content');
|
|
expect(content).toContain('foo');
|
|
expect(content).not.toContain('table_1');
|
|
});
|
|
|
|
it('should not have any leaks', function () {
|
|
expect(this.view).toHaveNoLeaks();
|
|
});
|
|
|
|
describe('._onChangeEdition', function () {
|
|
it('should call _onToggleEdition', function () {
|
|
this.view._onChangeEdition();
|
|
expect(this.view._onToggleEdition).toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
describe('._parseSQL', function () {
|
|
beforeEach(function () {
|
|
this.view._codemirrorModel.set('content', 'UPDATE test SET name = \'test\'');
|
|
});
|
|
|
|
it('should set loading to true when called', function () {
|
|
spyOn(this.view, '_SQL');
|
|
this.view._parseSQL();
|
|
|
|
expect(this.view._applyButtonStatusModel.get('loading')).toBe(true);
|
|
});
|
|
|
|
it('should set loading to false when in success callback', function () {
|
|
spyOn(this.view._SQL, 'execute').and.callFake(function (query, a, options) {
|
|
options.success();
|
|
});
|
|
|
|
this.view._parseSQL();
|
|
|
|
expect(this.view._applyButtonStatusModel.get('loading')).toBe(false);
|
|
});
|
|
|
|
it('should set loading to false when in error callback', function () {
|
|
spyOn(this.view._SQL, 'execute').and.callFake(function (query, a, options) {
|
|
options.error({
|
|
responseJSON: {}
|
|
});
|
|
});
|
|
|
|
this.view._parseSQL();
|
|
|
|
expect(this.view._applyButtonStatusModel.get('loading')).toBe(false);
|
|
});
|
|
});
|
|
});
|