332 lines
11 KiB
JavaScript
332 lines
11 KiB
JavaScript
var Backbone = require('backbone');
|
|
var _ = require('underscore');
|
|
var RemoveDatasetView = require('builder/components/modals/remove-dataset/remove-dataset-view');
|
|
var UserModel = require('builder/data/user-model');
|
|
var VisDefinitionModel = require('builder/data/vis-definition-model');
|
|
var TableModel = require('builder/data/table-model');
|
|
var ConfigModel = require('builder/data/config-model');
|
|
|
|
describe('modals/remove-dataset-view', function () {
|
|
var modalModel = new Backbone.Model();
|
|
var avatarBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC';
|
|
var configData = {
|
|
base_url: '/u/manolo',
|
|
maps_api_template: 'http://{user}.localhost.lan:8181'
|
|
};
|
|
var userData = {
|
|
id: '8c253a9a-94d8-4042-883c-3aa81285e5e6',
|
|
username: 'cdb',
|
|
organization: {
|
|
display_name: 'Globex Corporation',
|
|
name: 'globex',
|
|
avatar_url: 'https://s3.amazonaws.com/com.cartodb.users-assets.staging/development/cdb/assets/20161028125910fake-company-logo.jpg',
|
|
user_count: 25
|
|
}
|
|
};
|
|
var tableDataWithNoDependentMaps = {
|
|
name: 'NYC Graffiti sights',
|
|
accessible_dependent_derived_maps: []
|
|
};
|
|
var dependentMap = {
|
|
id: '5725afbe-9f51-11e6-af45-080027eb929e',
|
|
name: 'Untitled Map',
|
|
permission: {
|
|
owner: {
|
|
username: 'cdb'
|
|
}
|
|
},
|
|
updated_at: '2016-10-31T10:03:58+00:00'
|
|
};
|
|
var visDataWithNoACL = {
|
|
permission: {
|
|
acl: []
|
|
}
|
|
};
|
|
var visDataWithOrganizationACL = {
|
|
permission: {
|
|
acl: [{
|
|
type: 'org',
|
|
entity: {
|
|
id: 'c210c579-0780-4ccd-83a8-7bf9fee11b34',
|
|
name: 'globex',
|
|
avatar_url: avatarBase64
|
|
}
|
|
}]
|
|
}
|
|
};
|
|
var visDataWithGroupACL = {
|
|
permission: {
|
|
acl: [{
|
|
type: 'group',
|
|
entity: {
|
|
users: [{
|
|
username: 'Meowth',
|
|
avatar_url: avatarBase64
|
|
}]
|
|
}
|
|
}]
|
|
}
|
|
};
|
|
var visModel;
|
|
var configModel;
|
|
var tableModel;
|
|
var userModel;
|
|
var view;
|
|
|
|
function createDependantACL (username) {
|
|
return {
|
|
type: 'user',
|
|
entity: {
|
|
username: username || 'pepe' + _.random(99999).toString(),
|
|
avatar_url: avatarBase64
|
|
}
|
|
};
|
|
}
|
|
|
|
function createView (options) {
|
|
var opts = options || {};
|
|
var numberOfDependentMaps = opts.numberOfDependentMaps || 0;
|
|
var organizationAffected = opts.organizationAffected || false;
|
|
var numberOfDependentEntities = opts.numberOfDependentEntities || 0;
|
|
var repeatAffectedEntity = opts.repeatAffectedEntity || false;
|
|
var affectedGroup = opts.affectedGroup || false;
|
|
var tableData;
|
|
var visData;
|
|
|
|
configModel = new ConfigModel(configData);
|
|
userModel = new UserModel(userData, { configModel: configModel });
|
|
|
|
if (numberOfDependentMaps > 0) {
|
|
tableData = _.clone(tableDataWithNoDependentMaps);
|
|
_.times(numberOfDependentMaps, function () {
|
|
tableData.accessible_dependent_derived_maps.push(dependentMap);
|
|
});
|
|
} else {
|
|
tableModel = new TableModel(tableDataWithNoDependentMaps, { parse: true, configModel: configModel });
|
|
}
|
|
|
|
if (organizationAffected) {
|
|
visModel = new VisDefinitionModel(visDataWithOrganizationACL, {
|
|
configModel: configModel
|
|
});
|
|
} else if (affectedGroup) {
|
|
visModel = new VisDefinitionModel(visDataWithGroupACL, {
|
|
configModel: configModel
|
|
});
|
|
} else if (numberOfDependentEntities > 0) {
|
|
visData = {
|
|
permission: {
|
|
acl: []
|
|
}
|
|
};
|
|
_.times(numberOfDependentEntities, function () {
|
|
visData.permission.acl.push(createDependantACL());
|
|
});
|
|
visData.permission.acl.push(createDependantACL(userData.username)); // To test if we filter ourselves
|
|
if (repeatAffectedEntity) {
|
|
visData.permission.acl.push(_.clone(visData.permission.acl[0])); // Repeat one user to test if we filter only uniques
|
|
}
|
|
visModel = new VisDefinitionModel(visData, {
|
|
configModel: configModel
|
|
});
|
|
} else {
|
|
visModel = new VisDefinitionModel(visDataWithNoACL, {
|
|
configModel: configModel
|
|
});
|
|
}
|
|
|
|
return new RemoveDatasetView({
|
|
modalModel: modalModel,
|
|
userModel: userModel,
|
|
visModel: visModel,
|
|
tableModel: tableModel,
|
|
configModel: configModel
|
|
});
|
|
}
|
|
|
|
describe('render', function () {
|
|
it('Nothing affected, visualization and entities sections not shown', function () {
|
|
// Arrange
|
|
view = createView();
|
|
|
|
// Act
|
|
view.render();
|
|
|
|
// Assert
|
|
expect(view.$('h2')[0].textContent.trim()).toEqual('dataset.delete.title');
|
|
expect(view.$('.MapsList-item').length).toBe(0);
|
|
expect(view.$('.ShareUser').length).toBe(0);
|
|
expect(view.$('button.js-cancel > span')[0].textContent.trim()).toEqual('dataset.delete.cancel');
|
|
expect(view.$('button.js-confirm > span')[0].textContent.trim()).toEqual('dataset.delete.confirm');
|
|
});
|
|
|
|
it('1 visualization affected. Visualization gets properly rendered.', function () {
|
|
// Arrange
|
|
view = createView({ numberOfDependentMaps: 1 });
|
|
|
|
// Act
|
|
view.render();
|
|
|
|
// Assert
|
|
expect(view.$('.js-affectedVis > p')[0].textContent.trim()).toEqual('dataset.delete.affected-vis-count');
|
|
expect(view.$('.js-affectedVis > ul > li').length).toBe(1);
|
|
expect(view.$('.MapCard')[0].dataset['visId']).toEqual(dependentMap.id);
|
|
expect(view.$('.MapCard')[0].dataset['visOwnerName']).toEqual(dependentMap.permission.owner.username);
|
|
expect(view.$('.MapCard > a')[0].href).toBeTruthy();
|
|
expect(view.$('.MapCard > a > img')[0].src).toBeTruthy();
|
|
expect(view.$('.MapCard-content h3 > a')[0].href).toBeTruthy();
|
|
expect(view.$('.MapCard-content h3 > a')[0].title).toEqual(dependentMap.name);
|
|
expect(view.$('.MapCard-contentBodyTimeDiff')[0].textContent.trim()).toBeTruthy();
|
|
});
|
|
|
|
it('More vis affected than AFFECTED_VIS_COUNT. Text changed to extended one.', function () {
|
|
// Arrange
|
|
var maxAffectedVisCount = 3; // AFFECTED_VIS_COUNT
|
|
view = createView({ numberOfDependentMaps: 4 });
|
|
|
|
// Act
|
|
view.render();
|
|
|
|
// Assert
|
|
expect(view.$('.js-affectedVis > p')[0].textContent.trim()).toEqual('dataset.delete.affected-vis-count-extended');
|
|
expect(view.$('.js-affectedVis > ul > li').length).toBe(maxAffectedVisCount);
|
|
});
|
|
|
|
it('Organization affected. Proper text and avatar rendered.', function () {
|
|
// Arrange
|
|
var userNode;
|
|
view = createView({ organizationAffected: true });
|
|
|
|
// Act
|
|
view.render();
|
|
|
|
// Assert
|
|
expect(view.$('.js-affectedEntities > p')[0].textContent.trim()).toEqual('dataset.delete.whole-organization-affected');
|
|
expect(view.$('.js-affectedEntities li').length).toBe(1);
|
|
userNode = view.$('.js-affectedEntities li .Share-user')[0];
|
|
expect(userNode.title).toEqual(userData.organization.display_name);
|
|
expect(userNode.dataset['username']).toEqual(userData.organization.display_name);
|
|
expect(userNode.style.backgroundImage.indexOf(userData.organization.avatar_url) > -1).toBe(true);
|
|
});
|
|
|
|
it('1 user affected. Proper text and avatar rendered.', function () {
|
|
// Arrange
|
|
var userNode;
|
|
var affectedEntity;
|
|
view = createView({ numberOfDependentEntities: 1 });
|
|
affectedEntity = view._visModel._permissionModel.get('acl')[0].entity;
|
|
|
|
// Act
|
|
view.render();
|
|
|
|
// Assert
|
|
expect(view.$('.js-affectedEntities > p')[0].textContent.trim()).toEqual('dataset.delete.affected-entities-count');
|
|
expect(view.$('.js-affectedEntities li').length).toBe(1);
|
|
userNode = view.$('.js-affectedEntities li .Share-user')[0];
|
|
expect(userNode.title).toEqual(affectedEntity.username);
|
|
expect(userNode.dataset['username']).toEqual(affectedEntity.username);
|
|
expect(userNode.style.backgroundImage.indexOf(affectedEntity.avatar_url) > -1).toBe(true);
|
|
});
|
|
|
|
it('More user affected than AFFECTED_ENTITIES_SAMPLE_COUNT. Text changed to extended.', function () {
|
|
// Arrange
|
|
var affectedEntitiesSampleCount = 20; // AFFECTED_ENTITIES_SAMPLE_COUNT
|
|
view = createView({ numberOfDependentEntities: affectedEntitiesSampleCount + 1 });
|
|
|
|
// Act
|
|
view.render();
|
|
|
|
// Assert
|
|
expect(view.$('.js-affectedEntities > p')[0].textContent.trim()).toEqual('dataset.delete.affected-entities-count-extended');
|
|
expect(view.$('.js-affectedEntities li').length).toBe(affectedEntitiesSampleCount);
|
|
});
|
|
|
|
it('Affected entity repeated. Repeated entity gets filtered.', function () {
|
|
// Arrange
|
|
view = createView({
|
|
numberOfDependentEntities: 2,
|
|
repeatAffectedEntity: true
|
|
});
|
|
|
|
// Act
|
|
view.render();
|
|
|
|
// Assert
|
|
expect(view.$('.js-affectedEntities li').length).toBe(2);
|
|
});
|
|
|
|
it('Affected group. Users of that group get rendered.', function () {
|
|
// Arrange
|
|
view = createView({
|
|
affectedGroup: true
|
|
});
|
|
|
|
// Act
|
|
view.render();
|
|
|
|
// Assert
|
|
expect(view.$('.js-affectedEntities li').length).toBe(visDataWithGroupACL.permission.acl[0].entity.users.length);
|
|
});
|
|
});
|
|
|
|
describe('_runAction', function () {
|
|
it('Renders loading view and destory has been set to the right success function.', function () {
|
|
// Arrange
|
|
var successFunction;
|
|
view = createView();
|
|
spyOn(view, '_renderLoadingView');
|
|
spyOn(view, '_onSuccessDestroyDataset');
|
|
spyOn(visModel, 'destroy').and.callFake(function (args) {
|
|
successFunction = args.success;
|
|
});
|
|
|
|
// Act
|
|
view._runAction();
|
|
successFunction();
|
|
|
|
// Assert
|
|
expect(view._renderLoadingView).toHaveBeenCalled();
|
|
expect(view._onSuccessDestroyDataset).toHaveBeenCalled();
|
|
});
|
|
|
|
it('Destroy has been set to the right error function.', function () {
|
|
// Arrange
|
|
var errorFunction;
|
|
view = createView();
|
|
spyOn(view, '_onErrorDestroyDataset');
|
|
spyOn(visModel, 'destroy').and.callFake(function (args) {
|
|
errorFunction = args.error;
|
|
});
|
|
|
|
// Act
|
|
view._runAction();
|
|
errorFunction(null, {});
|
|
|
|
// Assert
|
|
expect(view._onErrorDestroyDataset).toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
it('_renderLoadingView inserts the right HTML', function () {
|
|
// Arrange
|
|
view = createView();
|
|
|
|
// Act
|
|
view._renderLoadingView();
|
|
|
|
// Assert
|
|
expect(view.$('.js-loader').length).toBeGreaterThan(0);
|
|
});
|
|
|
|
it('_onErrorDestroyDataset inserts the right HTML', function () {
|
|
// Arrange
|
|
view = createView();
|
|
|
|
// Act
|
|
view._onErrorDestroyDataset(null, {});
|
|
|
|
// Assert
|
|
expect(view.$('i.CDB-IconFont-cockroach').length).toBeGreaterThan(0);
|
|
});
|
|
});
|