cartodb-4.42/lib/assets/test/spec/dashboard/data/dashboard-background-polling-model.spec.js
2024-04-06 05:25:13 +00:00

133 lines
4.8 KiB
JavaScript

const _ = require('underscore');
const BackgroundPollingModel = require('dashboard/data/background-polling/dashboard-background-polling-model');
const ImportCollection = require('dashboard/data/imports-collection');
const MapUrlModel = require('dashboard/data/map-url-model');
const VisualizationModel = require('dashboard/data/visualization-model');
const configModel = require('fixtures/dashboard/config-model.fixture');
const userModelFixture = require('fixtures/dashboard/user-model.fixture');
function attributesForRedirect (attrs) {
return _.extend({
tables_created_count: 2,
service_name: 'other',
table_name: 'foobar',
state: 'complete',
display_name: 'foo.carto'
}, attrs);
}
describe('dashboard/data/background-polling-model', function () {
beforeEach(function () {
this.user = userModelFixture({
username: 'pepe',
base_url: 'http://pepe.carto.com'
});
this.importsCollection = new ImportCollection({}, {
userModel: this.user,
configModel
});
this.importsModel = this.importsCollection.at(0);
this.model = new BackgroundPollingModel({}, {
userModel: this.user,
configModel,
importsCollection: this.importsCollection
});
spyOn(this.model, '_redirectTo');
this.url = new MapUrlModel({
base_url: 'http://pepe.carto.com/viz/abc-123'
});
spyOn(VisualizationModel.prototype, 'viewUrl').and.returnValue(this.url);
this.importsModel.set('step', 'import');
// Add some more imports to the collection
this.importsCollection.add({});
this.importsCollection.add({});
this.importsModel2 = this.importsCollection.at(1);
this.importsModel3 = this.importsCollection.at(2);
// Two previous imports have failed
spyOn(this.importsModel2, 'hasCompleted').and.returnValue(false);
spyOn(this.importsModel2, 'hasFailed').and.returnValue(true);
spyOn(this.importsModel3, 'hasCompleted').and.returnValue(false);
spyOn(this.importsModel3, 'hasFailed').and.returnValue(true);
});
describe('when import has been completed', function () {
beforeEach(function () {
spyOn(this.importsModel, 'hasCompleted').and.returnValue(true);
});
it('should redirect to vis', function () {
this.importsModel.getImportModel().set(attributesForRedirect());
expect(this.model._redirectTo).toHaveBeenCalled();
expect(this.model._redirectTo.calls.argsFor(0)[0]).toEqual('http://pepe.carto.com/viz/abc-123/map');
expect(VisualizationModel.prototype.viewUrl).toHaveBeenCalledWith(this.user);
});
describe('should NOT redirect', function () {
it('if more than one table is created and file is not .carto', function () {
this.importsModel.getImportModel().set(attributesForRedirect({
tables_created_count: 2,
display_name: 'foo.csv'
}));
this.importsModel.set('state', 'complete');
expect(this.model._redirectTo).not.toHaveBeenCalled();
});
it('if service name is twitter search', function () {
this.importsModel.getImportModel().set(attributesForRedirect({
'service_name': 'twitter_search'
}));
this.importsModel.set('state', 'complete');
expect(this.model._redirectTo).not.toHaveBeenCalled();
});
it('if for some reason there is no vis to redirect to', function () {
spyOn(this.importsModel, 'importedVis').and.returnValue(false);
this.importsModel.set('state', 'complete');
expect(this.model._redirectTo).not.toHaveBeenCalled();
});
it('if other imports are still running', function () {
this.importsModel2.hasCompleted.and.returnValue(false);
this.importsModel2.hasFailed.and.returnValue(false);
this.importsModel.getImportModel().set(attributesForRedirect());
this.importsModel.set('state', 'complete');
expect(this.model._redirectTo).not.toHaveBeenCalled();
});
it('if other imports have been completed', function () {
// Has failed
this.importsModel2.hasFailed.and.returnValue(true);
this.importsModel2.hasCompleted.and.returnValue(false);
// Has completed
this.importsModel3.hasFailed.and.returnValue(false);
this.importsModel3.hasCompleted.and.returnValue(true);
this.importsModel.getImportModel().set(attributesForRedirect());
this.importsModel.set('state', 'complete');
expect(this.model._redirectTo).not.toHaveBeenCalled();
});
});
});
describe('when import has NOT been completed', function () {
beforeEach(function () {
spyOn(this.importsModel, 'hasCompleted').and.returnValue(false);
});
it('should not redirect if not complete yet', function () {
this.importsModel.set('state', 'whatever');
expect(this.model._redirectTo).not.toHaveBeenCalled();
});
});
});