Initial commit
This commit is contained in:
+331
@@ -0,0 +1,331 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user