mirror of https://github.com/artf/grapesjs.git
9 changed files with 5 additions and 599 deletions
@ -1,127 +0,0 @@ |
|||||
|
|
||||
define(['GrapesJS'], |
|
||||
function(GrapesJS) { |
|
||||
|
|
||||
return { |
|
||||
run : function(){ |
|
||||
describe('E2E tests', function() { |
|
||||
|
|
||||
/** |
|
||||
* Create tags viewer |
|
||||
* @param {Object} ctx |
|
||||
*/ |
|
||||
var instClassTagViewer = function(ctx){ |
|
||||
var $clm; |
|
||||
var clm = ctx.gjs.editor.get('ClassManager'); |
|
||||
clm.config.target = ctx.gjs.editor; |
|
||||
if(clm){ |
|
||||
$clm = new clm.ClassTagsView({ |
|
||||
collection: new clm.ClassTags([]), |
|
||||
config: clm.config, |
|
||||
}).render(); |
|
||||
ctx.$fixture.append($clm.el); |
|
||||
} |
|
||||
return $clm; |
|
||||
}; |
|
||||
|
|
||||
before(function () { |
|
||||
this.$fixtures = $("#fixtures"); |
|
||||
this.$fixture = $('<div id="ClassManager-fixture"></div>'); |
|
||||
}); |
|
||||
|
|
||||
beforeEach(function () { |
|
||||
var Grapes = GrapesJS; |
|
||||
this.gjs = Grapes.init({ |
|
||||
stylePrefix: '', |
|
||||
storage: { autoload: 0, type:'none' }, |
|
||||
assetManager: { |
|
||||
storageType: 'none', |
|
||||
}, |
|
||||
container: '#ClassManager-fixture', |
|
||||
}); |
|
||||
this.$fixture.empty().appendTo(this.$fixtures); |
|
||||
this.gjs.render(); |
|
||||
}); |
|
||||
|
|
||||
afterEach(function () { |
|
||||
delete this.gjs; |
|
||||
}); |
|
||||
|
|
||||
after(function () { |
|
||||
this.$fixture.remove(); |
|
||||
}); |
|
||||
|
|
||||
describe('Interaction with Components', function() { |
|
||||
|
|
||||
beforeEach(function () { |
|
||||
this.wrapper = this.gjs.editor.get('Components').getWrapper().get('components'); |
|
||||
this.$clm = instClassTagViewer(this); |
|
||||
}); |
|
||||
|
|
||||
afterEach(function () { |
|
||||
delete this.wrapper; |
|
||||
delete this.$clm; |
|
||||
}); |
|
||||
|
|
||||
it('Assign correctly new class to component', function() { |
|
||||
var model = this.wrapper.add({}); |
|
||||
model.get('classes').length.should.equal(0); |
|
||||
this.gjs.editor.set('selectedComponent', model); |
|
||||
this.$clm.addNewTag('test'); |
|
||||
model.get('classes').length.should.equal(1); |
|
||||
model.get('classes').at(0).get('name').should.equal('test'); |
|
||||
}); |
|
||||
|
|
||||
it('Classes from components are correctly imported inside main container', function() { |
|
||||
var model = this.wrapper.add([ |
|
||||
{ classes: ['test11', 'test12', 'test13'] }, |
|
||||
{ classes: ['test11', 'test22', 'test22'] }, |
|
||||
]); |
|
||||
this.gjs.editor.get('ClassManager').getClasses().length.should.equal(4); |
|
||||
}); |
|
||||
|
|
||||
it('Class imported into component is the same model from main container', function() { |
|
||||
var model = this.wrapper.add({ classes: ['test1'] }); |
|
||||
var clModel = model.get('classes').at(0); |
|
||||
var clModel2 = this.gjs.editor.get('ClassManager').getClasses().at(0); |
|
||||
clModel.should.deep.equal(clModel2); |
|
||||
}); |
|
||||
|
|
||||
it('Can assign only one time the same class on selected component and the class viewer', function() { |
|
||||
var model = this.wrapper.add({}); |
|
||||
this.gjs.editor.set('selectedComponent', model); |
|
||||
this.$clm.addNewTag('test'); |
|
||||
this.$clm.addNewTag('test'); |
|
||||
model.get('classes').length.should.equal(1); |
|
||||
model.get('classes').at(0).get('name').should.equal('test'); |
|
||||
this.$clm.collection.length.should.equal(1); |
|
||||
this.$clm.collection.at(0).get('name').should.equal('test'); |
|
||||
}); |
|
||||
|
|
||||
it('Removing from container removes also from selected component', function() { |
|
||||
var model = this.wrapper.add({}); |
|
||||
this.gjs.editor.set('selectedComponent', model); |
|
||||
this.$clm.addNewTag('test'); |
|
||||
this.$clm.collection.at(0).destroy(); |
|
||||
model.get('classes').length.should.equal(0); |
|
||||
}); |
|
||||
|
|
||||
it("Trigger correctly event on target with new class add", function() { |
|
||||
var spy = sinon.spy(); |
|
||||
var model = this.wrapper.add({}); |
|
||||
this.gjs.editor.set('selectedComponent', model); |
|
||||
this.$clm.addNewTag('test'); |
|
||||
this.gjs.editor.on("targetClassAdded", spy); |
|
||||
this.$clm.addNewTag('test'); |
|
||||
spy.called.should.equal(false); |
|
||||
this.$clm.addNewTag('test2'); |
|
||||
spy.called.should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
}); |
|
||||
|
|
||||
}); |
|
||||
} |
|
||||
}; |
|
||||
|
|
||||
}); |
|
||||
@ -1,93 +0,0 @@ |
|||||
var modulePath = './../../../test/specs/class_manager'; |
|
||||
|
|
||||
define([ |
|
||||
'ClassManager', |
|
||||
modulePath + '/model/ClassModels', |
|
||||
modulePath + '/view/ClassTagView', |
|
||||
modulePath + '/view/ClassTagsView', |
|
||||
modulePath + '/e2e/ClassManager' |
|
||||
], |
|
||||
function( |
|
||||
ClassManager, |
|
||||
Models, |
|
||||
ClassTagView, |
|
||||
ClassTagsView, |
|
||||
e2e |
|
||||
) { |
|
||||
|
|
||||
describe('Class Manager', function() { |
|
||||
|
|
||||
describe('Main', function() { |
|
||||
|
|
||||
beforeEach(function () { |
|
||||
this.obj = new ClassManager(); |
|
||||
}); |
|
||||
|
|
||||
afterEach(function () { |
|
||||
delete this.obj; |
|
||||
}); |
|
||||
|
|
||||
it('Object exists', function() { |
|
||||
ClassManager.should.be.exist; |
|
||||
}); |
|
||||
|
|
||||
it('No classes inside', function() { |
|
||||
this.obj.getClasses().length.should.equal(0); |
|
||||
}); |
|
||||
|
|
||||
it('Able to add default classes', function() { |
|
||||
var cm = new ClassManager({ |
|
||||
defaults: ['test1', 'test2', 'test3'], |
|
||||
}); |
|
||||
cm.getClasses().length.should.equal(3); |
|
||||
}); |
|
||||
|
|
||||
it('Add new class', function() { |
|
||||
this.obj.addClass('test'); |
|
||||
this.obj.getClasses().length.should.equal(1); |
|
||||
}); |
|
||||
|
|
||||
it('Check name property', function() { |
|
||||
var className = 'test'; |
|
||||
var obj = this.obj.addClass(className); |
|
||||
obj.get('name').should.equal(className); |
|
||||
}); |
|
||||
|
|
||||
it('Add 2 classes', function() { |
|
||||
this.obj.addClass('test'); |
|
||||
this.obj.addClass('test2'); |
|
||||
this.obj.getClasses().length.should.equal(2); |
|
||||
}); |
|
||||
|
|
||||
it('Add 2 same classes', function() { |
|
||||
this.obj.addClass('test'); |
|
||||
this.obj.addClass('test'); |
|
||||
this.obj.getClasses().length.should.equal(1); |
|
||||
}); |
|
||||
|
|
||||
it('Get class', function() { |
|
||||
var className = 'test'; |
|
||||
var obj = this.obj.addClass(className); |
|
||||
(this.obj.getClass(className) === null).should.equal(false); |
|
||||
}); |
|
||||
|
|
||||
it('Get empty class', function() { |
|
||||
(this.obj.getClass('test') === null).should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('Get same class', function() { |
|
||||
var className = 'test'; |
|
||||
var obj = this.obj.addClass(className); |
|
||||
var obj2 = this.obj.getClass(className); |
|
||||
obj2.should.deep.equal(obj); |
|
||||
}); |
|
||||
|
|
||||
}); |
|
||||
|
|
||||
Models.run(); |
|
||||
ClassTagView.run(); |
|
||||
ClassTagsView.run(); |
|
||||
e2e.run(); |
|
||||
|
|
||||
}); |
|
||||
}); |
|
||||
@ -1,53 +0,0 @@ |
|||||
var path = 'ClassManager/model/'; |
|
||||
define([path + 'ClassTag', |
|
||||
path + 'ClassTags'], |
|
||||
function(ClassTag, ClassTags) { |
|
||||
|
|
||||
return { |
|
||||
run : function(){ |
|
||||
describe('ClassTag', function() { |
|
||||
|
|
||||
beforeEach(function () { |
|
||||
this.obj = new ClassTag(); |
|
||||
}); |
|
||||
|
|
||||
afterEach(function () { |
|
||||
delete this.obj; |
|
||||
}); |
|
||||
|
|
||||
it('Has name property', function() { |
|
||||
this.obj.has('name').should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('Has label property', function() { |
|
||||
this.obj.has('label').should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('Has active property', function() { |
|
||||
this.obj.has('active').should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('escapeName test', function() { |
|
||||
this.obj.escapeName('@Te sT*').should.equal('-te-st-'); |
|
||||
}); |
|
||||
|
|
||||
it('Name is corrected at instantiation', function() { |
|
||||
this.obj = new ClassTag({ name: '@Te sT*'}); |
|
||||
this.obj.get('name').should.equal('-te-st-'); |
|
||||
}); |
|
||||
|
|
||||
|
|
||||
}); |
|
||||
describe('ClassTags', function() { |
|
||||
|
|
||||
it('Creates collection item correctly', function() { |
|
||||
var c = new ClassTags(); |
|
||||
var m = c.add({}); |
|
||||
m.should.be.an.instanceOf(ClassTag); |
|
||||
}); |
|
||||
|
|
||||
}); |
|
||||
} |
|
||||
}; |
|
||||
|
|
||||
}); |
|
||||
@ -1,126 +0,0 @@ |
|||||
var path = 'ClassManager/view/'; |
|
||||
define([path + 'ClassTagView', 'ClassManager/model/ClassTags'], |
|
||||
function(ClassTagView, ClassTags) { |
|
||||
|
|
||||
return { |
|
||||
run : function(){ |
|
||||
describe('ClassTagView', function() { |
|
||||
|
|
||||
before(function () { |
|
||||
this.$fixtures = $("#fixtures"); |
|
||||
this.$fixture = $('<div class="classtag-fixture"></div>'); |
|
||||
}); |
|
||||
|
|
||||
beforeEach(function () { |
|
||||
this.coll = new ClassTags(); |
|
||||
this.testLabel = 'TestLabel'; |
|
||||
var model = this.coll.add({ |
|
||||
name: 'test', |
|
||||
label: this.testLabel, |
|
||||
}); |
|
||||
this.view = new ClassTagView({ |
|
||||
config : {}, |
|
||||
model: model, |
|
||||
coll: this.coll |
|
||||
}); |
|
||||
this.view.target = { get:function(){} }; |
|
||||
_.extend(this.view.target, Backbone.Events); |
|
||||
this.$fixture.empty().appendTo(this.$fixtures); |
|
||||
this.$fixture.html(this.view.render().el); |
|
||||
}); |
|
||||
|
|
||||
afterEach(function () { |
|
||||
this.view.model.destroy(); |
|
||||
}); |
|
||||
|
|
||||
after(function () { |
|
||||
this.$fixture.remove(); |
|
||||
}); |
|
||||
|
|
||||
it('Object exists', function() { |
|
||||
ClassTagView.should.be.exist; |
|
||||
}); |
|
||||
|
|
||||
it('Not empty', function() { |
|
||||
var $el = this.view.$el; |
|
||||
$el.html().should.not.be.empty; |
|
||||
}); |
|
||||
|
|
||||
it('Not empty', function() { |
|
||||
var $el = this.view.$el; |
|
||||
$el.html().should.contain(this.testLabel); |
|
||||
}); |
|
||||
|
|
||||
describe('Should be rendered correctly', function() { |
|
||||
|
|
||||
it('Has close button', function() { |
|
||||
var $el = this.view.$el; |
|
||||
$el.find('#close').should.have.property(0); |
|
||||
}); |
|
||||
it('Has checkbox', function() { |
|
||||
var $el = this.view.$el; |
|
||||
$el.find('#checkbox').should.have.property(0); |
|
||||
}); |
|
||||
it('Has label', function() { |
|
||||
var $el = this.view.$el; |
|
||||
$el.find('#tag-label').should.have.property(0); |
|
||||
}); |
|
||||
|
|
||||
}); |
|
||||
|
|
||||
it('Could be removed', function() { |
|
||||
var spy = sinon.spy(); |
|
||||
this.view.config.target = { get:function(){} }; |
|
||||
sinon.stub(this.view.config.target, 'get').returns(0); |
|
||||
this.view.$el.find('#close').trigger('click'); |
|
||||
this.$fixture.html().should.be.empty; |
|
||||
}); |
|
||||
|
|
||||
it('On remove triggers event', function() { |
|
||||
var spy = sinon.spy(); |
|
||||
sinon.stub(this.view.target, 'get').returns(0); |
|
||||
this.view.target.on("targetClassRemoved", spy); |
|
||||
this.view.$el.find('#close').trigger('click'); |
|
||||
spy.called.should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('Checkbox toggles status', function() { |
|
||||
var spy = sinon.spy(); |
|
||||
this.view.model.on("change:active", spy); |
|
||||
this.view.model.set('active', true); |
|
||||
this.view.$el.find('#checkbox').trigger('click'); |
|
||||
this.view.model.get('active').should.equal(false); |
|
||||
spy.called.should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('On toggle triggers event', function() { |
|
||||
var spy = sinon.spy(); |
|
||||
sinon.stub(this.view.target, 'get').returns(0); |
|
||||
this.view.target.on("targetClassUpdated", spy); |
|
||||
this.view.$el.find('#checkbox').trigger('click'); |
|
||||
spy.called.should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('Label input is disabled', function() { |
|
||||
var inputProp = this.view.inputProp; |
|
||||
this.view.$labelInput.prop(inputProp).should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('On double click label input is enable', function() { |
|
||||
var inputProp = this.view.inputProp; |
|
||||
this.view.$el.find('#tag-label').trigger('dblclick'); |
|
||||
this.view.$labelInput.prop(inputProp).should.equal(false); |
|
||||
}); |
|
||||
|
|
||||
it('On blur label input turns back disabled', function() { |
|
||||
var inputProp = this.view.inputProp; |
|
||||
this.view.$el.find('#tag-label').trigger('dblclick'); |
|
||||
this.view.endEditTag(); |
|
||||
this.view.$labelInput.prop(inputProp).should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
}); |
|
||||
} |
|
||||
}; |
|
||||
|
|
||||
}); |
|
||||
@ -1,188 +0,0 @@ |
|||||
var path = 'ClassManager/view/'; |
|
||||
define([path + 'ClassTagsView', 'ClassManager/model/ClassTags'], |
|
||||
function(ClassTagsView, ClassTags) { |
|
||||
|
|
||||
return { |
|
||||
run : function(){ |
|
||||
describe('ClassTagsView', function() { |
|
||||
|
|
||||
before(function () { |
|
||||
this.$fixtures = $("#fixtures"); |
|
||||
this.$fixture = $('<div class="classtag-fixture"></div>'); |
|
||||
}); |
|
||||
|
|
||||
beforeEach(function () { |
|
||||
this.target = { get: function(){} }; |
|
||||
this.coll = new ClassTags(); |
|
||||
_.extend(this.target, Backbone.Events); |
|
||||
|
|
||||
this.view = new ClassTagsView({ |
|
||||
config : { target: this.target }, |
|
||||
collection: this.coll |
|
||||
}); |
|
||||
|
|
||||
this.targetStub = { |
|
||||
addClass: function(v){ return {name: v}; } |
|
||||
}; |
|
||||
|
|
||||
this.compTargetStub = { |
|
||||
get: function(){ return { add: function(){} }} |
|
||||
}; |
|
||||
|
|
||||
this.$fixture.empty().appendTo(this.$fixtures); |
|
||||
this.$fixture.html(this.view.render().el); |
|
||||
this.btnAdd = this.view.$el.find('#' + this.view.addBtnId); |
|
||||
this.input = this.view.$el.find('input#' + this.view.newInputId); |
|
||||
this.$tags = this.$fixture.find('#tags-c'); |
|
||||
this.$states = this.$fixture.find('#states'); |
|
||||
this.$statesC = this.$fixture.find('#input-c'); |
|
||||
}); |
|
||||
|
|
||||
afterEach(function () { |
|
||||
delete this.view.collection; |
|
||||
}); |
|
||||
|
|
||||
after(function () { |
|
||||
this.$fixture.remove(); |
|
||||
}); |
|
||||
|
|
||||
it('Object exists', function() { |
|
||||
ClassTagsView.should.be.exist; |
|
||||
}); |
|
||||
|
|
||||
it('Not tags inside', function() { |
|
||||
this.$tags.html().should.equal(''); |
|
||||
}); |
|
||||
|
|
||||
it('Add new tag triggers correct method', function() { |
|
||||
sinon.stub(this.view, "addToClasses"); |
|
||||
this.coll.add({ name: 'test' }); |
|
||||
this.view.addToClasses.calledOnce.should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('Start new tag creation', function() { |
|
||||
this.btnAdd.click(); |
|
||||
(this.btnAdd.css('display') == 'none').should.equal(true); |
|
||||
(this.input.css('display') !== 'none').should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('Stop tag creation', function() { |
|
||||
this.btnAdd.click(); |
|
||||
this.input.val('test') |
|
||||
this.input.blur(); |
|
||||
(this.btnAdd.css('display') !== 'none').should.equal(true); |
|
||||
(this.input.css('display') == 'none').should.equal(true); |
|
||||
this.input.val().should.equal(''); |
|
||||
}); |
|
||||
|
|
||||
it('Check keyup of ESC on input', function() { |
|
||||
this.btnAdd.click(); |
|
||||
sinon.stub(this.view, "addNewTag"); |
|
||||
this.input.trigger({ |
|
||||
type: 'keyup', |
|
||||
keyCode: 13 |
|
||||
}); |
|
||||
this.view.addNewTag.calledOnce.should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('Check keyup on ENTER on input', function() { |
|
||||
this.btnAdd.click(); |
|
||||
sinon.stub(this.view, "endNewTag"); |
|
||||
this.input.trigger({ |
|
||||
type: 'keyup', |
|
||||
keyCode: 27 |
|
||||
}); |
|
||||
this.view.endNewTag.calledOnce.should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it('Collection changes on update of target', function() { |
|
||||
this.coll.add({ name: 'test' }); |
|
||||
this.target.trigger('change:selectedComponent'); |
|
||||
this.coll.length.should.equal(0); |
|
||||
}); |
|
||||
|
|
||||
it('Collection reacts on reset', function() { |
|
||||
this.coll.add([{ name: 'test1' }, { name: 'test2' }]); |
|
||||
sinon.stub(this.view, "addToClasses"); |
|
||||
this.coll.trigger('reset'); |
|
||||
this.view.addToClasses.calledTwice.should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it("Don't accept empty tags", function() { |
|
||||
this.view.addNewTag(''); |
|
||||
this.$tags.html().should.equal(''); |
|
||||
}); |
|
||||
|
|
||||
it("Accept new tags", function() { |
|
||||
sinon.stub(this.target, "get").returns(this.targetStub); |
|
||||
this.view.compTarget = this.compTargetStub; |
|
||||
this.view.addNewTag('test'); |
|
||||
this.view.compTarget = this.compTargetStub; |
|
||||
this.view.addNewTag('test2'); |
|
||||
this.$tags.children().length.should.equal(2); |
|
||||
}); |
|
||||
|
|
||||
it("New tag correctly added", function() { |
|
||||
this.coll.add({ label: 'test' }); |
|
||||
this.$tags.children().first().find('#tag-label input').val().should.equal('test'); |
|
||||
}); |
|
||||
|
|
||||
it("States are hidden in case no tags", function() { |
|
||||
this.view.updateStateVis(); |
|
||||
this.$statesC.css('display').should.equal('none'); |
|
||||
}); |
|
||||
|
|
||||
it("States are visible in case of more tags inside", function() { |
|
||||
this.coll.add({ label: 'test' }); |
|
||||
this.view.updateStateVis(); |
|
||||
this.$statesC.css('display').should.equal('block'); |
|
||||
}); |
|
||||
|
|
||||
it("Update state visibility on new tag", function() { |
|
||||
sinon.stub(this.view, "updateStateVis"); |
|
||||
sinon.stub(this.target, "get").returns(this.targetStub); |
|
||||
this.view.compTarget = this.compTargetStub; |
|
||||
this.view.addNewTag('test'); |
|
||||
this.view.updateStateVis.called.should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it("Update state visibility on removing of the tag", function() { |
|
||||
sinon.stub(this.target, "get").returns(this.targetStub); |
|
||||
this.view.compTarget = this.compTargetStub; |
|
||||
this.view.addNewTag('test'); |
|
||||
sinon.stub(this.view, "updateStateVis"); |
|
||||
this.coll.remove(this.coll.at(0)); |
|
||||
this.view.updateStateVis.calledOnce.should.equal(true); |
|
||||
}); |
|
||||
|
|
||||
it("Output correctly state options", function() { |
|
||||
var view = new ClassTagsView({ |
|
||||
config : { |
|
||||
target: this.target, |
|
||||
states: [ { name: 'testName', label: 'testLabel' } ], |
|
||||
}, |
|
||||
collection: this.coll |
|
||||
}); |
|
||||
view.getStateOptions().should.equal('<option value="testName">testLabel</option>'); |
|
||||
}); |
|
||||
|
|
||||
describe('Should be rendered correctly', function() { |
|
||||
it('Has label', function() { |
|
||||
this.view.$el.find('#label').should.have.property(0); |
|
||||
}); |
|
||||
it('Has tags container', function() { |
|
||||
this.view.$el.find('#tags-c').should.have.property(0); |
|
||||
}); |
|
||||
it('Has add button', function() { |
|
||||
this.view.$el.find('#add-tag').should.have.property(0); |
|
||||
}); |
|
||||
it('Has states input', function() { |
|
||||
this.view.$el.find('#states').should.have.property(0); |
|
||||
}); |
|
||||
}); |
|
||||
|
|
||||
}); |
|
||||
} |
|
||||
}; |
|
||||
|
|
||||
}); |
|
||||
Loading…
Reference in new issue