get-translation
Version:
Effective translation workflow
597 lines (510 loc) • 19.9 kB
JavaScript
/*globals Backbone:false, _:false, jQuery:false, $: false,
describe: true, xdescribe: true, expect: true, sinon: true,
it: true, xit: true, beforeEach: true, afterEach: true*/
describe('backbone.paginator.clientPager', function() {
beforeEach(function() {
// some test don't seem to clean up after them which makes the phantom run fail
_.each([this.addSpy, this.removeSpy, this.defaultsStub], function(spy){
if(spy){
spy.restore();
}
});
this.addSpy = sinon.stub(Backbone.Paginator.clientPager.prototype, 'addModel');
this.removeSpy = sinon.stub(Backbone.Paginator.clientPager.prototype, 'removeModel');
this.defaultsStub = sinon.stub(Backbone.Paginator.clientPager.prototype, 'setDefaults');
this.clientPagerTest = new Backbone.Paginator.clientPager();
});
afterEach(function() {
this.addSpy.restore();
this.removeSpy.restore();
this.defaultsStub.restore();
});
describe('initialize', function() {
it('should set "defaults_ui" object with default values', function() {
expect(this.clientPagerTest.defaults_ui).to.be.an('object');
expect(this.clientPagerTest.defaults_ui).to.have.property('firstPage', 0);
expect(this.clientPagerTest.defaults_ui).to.have.property('currentPage', 1);
expect(this.clientPagerTest.defaults_ui).to.have.property('perPage', 5);
expect(this.clientPagerTest.defaults_ui).to.have.property('totalPages', 10);
expect(this.clientPagerTest.defaults_ui).to.have.property('pagesInRange', 4);
});
it('should fire "add" event', function() {
var called = false;
this.clientPagerTest.on("add", function(){
called = true;
});
this.clientPagerTest.add(new Backbone.Model());
expect(called).to.equal(true);
});
it('should fire "remove" event', function() {
var called = false;
this.clientPagerTest.on("remove", function(){
called = true;
});
this.clientPagerTest.origModels = [];
var model = new Backbone.Model();
this.addSpy.restore();
this.clientPagerTest.add(model);
this.clientPagerTest.remove(model);
expect(called).to.equal(true);
});
it('should set defauls by calling "setDefaults" function', function() {
this.clientPagerTest.add(new Backbone.Model());
expect(this.defaultsStub.calledOnce).to.equal(true);
});
});
describe('setDefaults', function() {
it('should set default values for "paginator_ui" from "defaults_ui" object', function() {
this.clientPagerTest.paginator_ui = {};
this.defaultsStub.restore();
this.clientPagerTest.setDefaults();
expect(this.clientPagerTest.defaults_ui).to.have.property('firstPage', 0);
expect(this.clientPagerTest.defaults_ui).to.have.property('currentPage', 1);
expect(this.clientPagerTest.defaults_ui).to.have.property('perPage', 5);
expect(this.clientPagerTest.defaults_ui).to.have.property('totalPages', 10);
expect(this.clientPagerTest.defaults_ui).to.have.property('pagesInRange', 4);
});
it('should not over write default values for "paginator_ui" from "defaults_ui" object when provided', function() {
this.clientPagerTest.paginator_ui = {
firstPage: 1,
currentPage: 99,
perPage: 22,
totalPages: 100
};
this.defaultsStub.restore();
this.clientPagerTest.setDefaults();
expect(this.clientPagerTest.paginator_ui).to.have.property('firstPage', 1);
expect(this.clientPagerTest.paginator_ui).to.have.property('currentPage', 99);
expect(this.clientPagerTest.paginator_ui).to.have.property('perPage', 22);
expect(this.clientPagerTest.paginator_ui).to.have.property('totalPages', 100);
expect(this.clientPagerTest.paginator_ui).to.have.property('pagesInRange', 4);
});
it('should update global ui settings with values from paginator_ui & defaults_ui', function() {
this.clientPagerTest.paginator_ui = {
firstPage: 1,
currentPage: 99,
perPage: 22,
totalPages: 100
};
this.defaultsStub.restore();
this.clientPagerTest.setDefaults();
expect(this.clientPagerTest).to.have.property('firstPage', 1);
expect(this.clientPagerTest).to.have.property('currentPage', 99);
expect(this.clientPagerTest).to.have.property('perPage', 22);
expect(this.clientPagerTest).to.have.property('totalPages', 100);
expect(this.clientPagerTest).to.have.property('pagesInRange', 4);
});
});
describe('addModel', function() {
it('should add model to "origModels" array', function() {
this.clientPagerTest.origModels = [];
var model = new Backbone.Model();
this.addSpy.restore();
this.clientPagerTest.addModel(model);
expect(this.clientPagerTest.origModels[0]).to.equal(model);
});
});
describe('removeModel', function() {
it('should remove model from "origModels" array', function() {
var model = new Backbone.Model();
this.clientPagerTest.origModels = [model];
this.removeSpy.restore();
expect(this.clientPagerTest.origModels).to.include(model);
this.clientPagerTest.removeModel(model);
expect(this.clientPagerTest.origModels).not.to.include(model);
});
});
describe('sync', function(){
var spy;
beforeEach(function(){
if(spy){
spy.restore();
}
spy = sinon.spy($, 'ajax');
});
afterEach(function(){
spy.restore();
});
it('should call "setDefaults" function', function() {
this.clientPagerTest.paginator_core = {};
this.clientPagerTest.paginator_ui = {};
this.clientPagerTest.sync(null, null, {});
expect(this.clientPagerTest.defaults_ui).to.have.property('firstPage', 0);
expect(this.clientPagerTest.defaults_ui).to.have.property('currentPage', 1);
expect(this.clientPagerTest.defaults_ui).to.have.property('perPage', 5);
expect(this.clientPagerTest.defaults_ui).to.have.property('totalPages', 10);
expect(this.clientPagerTest.defaults_ui).to.have.property('pagesInRange', 4);
});
it("should use 'paginator_core' values as query options to ajax call", function(){
var clientPagerTest = {
paginator_core: {
type: 'POST',
dataType: 'jsonType'
}
};
_.extend(clientPagerTest, new Backbone.Paginator.clientPager());
var options = {};
clientPagerTest.sync(null, null, options);
expect(spy.callCount).to.equal(1);
expect(spy.lastCall.args[0]['type']).to.equal("POST");
expect(spy.lastCall.args[0]['dataType']).to.equal("jsonType");
});
it("should set default values for query options for the ajax call if not provided in 'paginator_core'", function(){
var clientPagerTest = {
paginator_core: {}
};
_.extend(clientPagerTest, new Backbone.Paginator.clientPager());
var options = {};
clientPagerTest.sync(null, null, options);
expect(spy.callCount).to.equal(1);
expect(spy.lastCall.args[0]['timeout']).to.equal(25000);
expect(spy.lastCall.args[0]['cache']).to.equal(false);
expect(spy.lastCall.args[0]['type']).to.equal("GET");
expect(spy.lastCall.args[0]['dataType']).to.equal("jsonp");
});
it("should set 'processData' to 'false' for query options for the ajax call", function(){
var clientPagerTest = {
paginator_core: {
}
};
_.extend(clientPagerTest, new Backbone.Paginator.clientPager());
var options = {};
clientPagerTest.sync(null, null, options);
expect(spy.lastCall.args[0]['processData']).to.equal(false);
});
it("should set url as query option from the evaluated url function value from 'paginator_core'", function(){
var clientPagerTest = {
paginator_core: {
url: function(){
return '/rest/search/presidents';
}
}
};
_.extend(clientPagerTest, new Backbone.Paginator.clientPager());
var options = {};
clientPagerTest.sync(null, null, options);
expect(spy.lastCall.args[0]['url']).to.equal('/rest/search/presidents');
});
it ("should set 'data' query param for the ajax call from 'server_api'", function(){
var clientPagerTest = {
paginator_ui: {},
paginator_core: {},
server_api: {
pageZeroBased: 1,
searchTerm: 'Obama',
sortBy: 'lastName'
}
};
_.extend(clientPagerTest, new Backbone.Paginator.clientPager());
var options = {};
clientPagerTest.sync(null, null, options);
expect(spy.lastCall.args[0]['data']).to.equal('pageZeroBased=1&searchTerm=Obama&sortBy=lastName');
});
it("should evaluate value as function (if it is) before setting 'data' query param for the ajax call from 'server_api'", function(){
var clientPagerTest = {
paginator_ui : {},
paginator_core: {},
server_api: {
searchTerm: function(){
return 'Barack' + ' ' + 'Obama';
}
}
};
_.extend(clientPagerTest, new Backbone.Paginator.clientPager());
var options = {};
clientPagerTest.sync(null, null, options);
expect(spy.lastCall.args[0]['data']).to.equal('searchTerm=Barack+Obama');
});
it("should create serialized representation of value before setting 'data' query param for the ajax call from 'server_api'", function(){
var clientPagerTest = {
paginator_ui : {},
paginator_core: {},
server_api: {
a: {
one: 1,
two: 2,
three: 3
}
}
};
_.extend(clientPagerTest, new Backbone.Paginator.clientPager());
var options = {};
clientPagerTest.sync(null, null, options);
expect(spy.lastCall.args[0]['data']).to.equal('a[one]=1&a[two]=2&a[three]=3');
});
it('should use the correct "options.success" arguments', function(done){
// This is to keep compatibility with Backbone 0.9.10
var clientPagerTest = {
paginator_ui: {},
paginator_core: {
type: 'GET',
dataType: 'json'
}
};
_.extend(clientPagerTest, new Backbone.Paginator.clientPager());
var server = sinon.fakeServer.create();
server.autoRespond = true;
server.respondWith([200, { "Content-Type": "application/json" }, '{ "key": "value" }']);
var bbVer = Backbone.VERSION.split('.');
var promiseSuccessFormat = !(parseInt(bbVer[0], 10) === 0 &&
parseInt(bbVer[1], 10) === 9 &&
parseInt(bbVer[2], 10) === 10);
var model = {};
var options = {
success: function(model_, resp_, options) {
// verify
var bbVer = Backbone.VERSION.split('.');
if (promiseSuccessFormat) {
var status_ = resp_;
resp_ = model_;
var xhr_ = options;
expect(resp_['key']).to.equal('value');
expect(status_).to.equal('success');
expect(xhr_).to.have.property('status', 200);
} else {
expect(model_).to.equal(model);
expect(resp_['key']).to.equal('value');
expect(options).to.have.property('xhr');
}
done();
}
};
// execute
clientPagerTest.sync(null, model, options);
server.restore();
});
describe('"request" "sync" and "error" events ', function() {
var OPTS = {
model: Backbone.Model,
paginator_ui: {
firstPage: 1,
currentPage: 1,
perPage: 3,
totalPages: 10,
pagesInRange: 4
},
paginator_core: {
url: 'test',
dataType: 'json'
},
parse: function (response) {
return response;
}
}, getModels = function(){
return _.map(_.range(30), function(i){
return {name: "Johnny Cash", id: i};
});
}, PagedCollection = Backbone.Paginator.clientPager.extend(OPTS);
it("should emit 'request' event when collection has started a request to the server", function(){
var coll = new PagedCollection();
var model = {
trigger: sinon.spy()
};
// execute
var options = {};
coll.sync('read', model, options);
// verify
expect(model.trigger.withArgs('request').calledOnce).to.equal(true);
});
it("should emit 'sync' event when has been successfully synced with the server", function(done){
var coll = new PagedCollection();
var server = sinon.fakeServer.create();
server.autoRespond = true;
server.respondWith([200, {}, ""]);
// execute
var model = {
trigger: sinon.spy()
};
var options = {};
coll.sync('read', model, options).always(function(){
// verify
expect(model.trigger.withArgs('sync').calledOnce).to.equal(true);
done();
});
server.restore();
});
it("should emit 'error' event when a call fails on the server", function(done){
var coll = new PagedCollection();
var server = sinon.fakeServer.create();
server.autoRespond = true;
server.respondWith([404, {}, ""]);
// execute
var model = {
trigger: sinon.spy()
};
var options = {};
coll.sync('read', model, options).always(function(){
// verify
expect(model.trigger.withArgs('error').calledOnce).to.equal(true);
done();
});
server.restore();
});
});
});
describe("nextPage", function(){
var pagerSpy;
beforeEach(function() {
if (pagerSpy){
pagerSpy.restore();
}
pagerSpy = sinon.stub(this.clientPagerTest, 'pager');
this.clientPagerTest.information = {totalPages : 99};
});
afterEach(function() {
pagerSpy.restore();
});
it('should increment "currentPage" by 1 and call pager', function() {
this.clientPagerTest.currentPage = 9;
this.clientPagerTest.nextPage();
expect(this.clientPagerTest.currentPage).to.equal(10);
expect(pagerSpy.calledOnce).to.equal(true);
});
it('should not increment "currentPage"', function() {
this.clientPagerTest.currentPage = 99;
this.clientPagerTest.nextPage();
expect(this.clientPagerTest.currentPage).to.equal(99);
expect(pagerSpy.calledOnce).to.equal(false);
});
it('should accept an options param and pass it to the pager method', function() {
this.clientPagerTest.currentPage = 9;
var options = {success: function() {}};
this.clientPagerTest.nextPage(options);
expect(pagerSpy.lastCall.args[0]).to.equal(options);
});
});
describe('previousPage', function() {
var pagerSpy;
beforeEach(function() {
if (pagerSpy){
pagerSpy.restore();
}
pagerSpy = sinon.stub(this.clientPagerTest, 'pager');
});
afterEach(function() {
pagerSpy.restore();
});
it('should decrement "currentPage" by 1 and call pager', function() {
this.clientPagerTest.currentPage = 9;
this.clientPagerTest.previousPage();
expect(this.clientPagerTest.currentPage).to.equal(8);
expect(pagerSpy.calledOnce).to.equal(true);
});
it('should not decrement the page when currentPage is 1', function() {
this.clientPagerTest.currentPage = 1;
this.clientPagerTest.previousPage();
expect(this.clientPagerTest.currentPage).to.equal(1);
expect(pagerSpy.calledOnce).to.equal(false);
});
it('should accept an options param and pass it to the pager method', function() {
this.clientPagerTest.currentPage = 2;
var options = {success: function() {}};
this.clientPagerTest.previousPage(options);
expect(pagerSpy.lastCall.args[0]).to.equal(options);
});
});
describe('goTo', function() {
var pagerSpy;
beforeEach(function() {
if (pagerSpy){
pagerSpy.restore();
}
pagerSpy = sinon.stub(this.clientPagerTest, 'pager');
});
afterEach(function() {
pagerSpy.restore();
});
it('should set "currentPage" and call "pager" method', function() {
this.clientPagerTest.goTo(98);
expect(this.clientPagerTest.currentPage).to.equal(98);
expect(pagerSpy.calledOnce).to.equal(true);
this.clientPagerTest.goTo(99);
expect(this.clientPagerTest.currentPage).to.equal(99);
});
it('should not do anything if goTo page is undefined', function() {
this.clientPagerTest.currentPage = 7;
this.clientPagerTest.goTo();
expect(this.clientPagerTest.currentPage).to.equal(7);
expect(pagerSpy.calledOnce).to.equal(false);
});
});
describe('prevPage', function() {
it('should be an alias for the previousPage function', function() {
expect(this.clientPagerTest.prevPage).to.equal(this.clientPagerTest.previousPage);
});
});
describe('howManyPer', function() {
it('should set perPage, currentPage and call pager method', function() {
var pagerSpy = sinon.stub(this.clientPagerTest, 'pager');
this.clientPagerTest.perPage = 4;
this.clientPagerTest.currentPage = 5;
this.clientPagerTest.howManyPer(3);
expect(this.clientPagerTest.currentPage).to.equal(6);
expect(pagerSpy.calledOnce).to.equal(true);
pagerSpy.restore();
});
it('should not do anything if perPage is undefined', function() {
var pagerSpy = sinon.stub(this.clientPagerTest, 'pager');
this.clientPagerTest.howManyPer();
expect(pagerSpy.calledOnce).to.equal(false);
pagerSpy.restore();
});
});
describe('bootstrap', function() {
beforeEach(function() {
this.defaultsStub.restore();
var OPTS = {
paginator_core: {
dataType: 'json',
url: '/'
},
paginator_ui: {
currentPage: 1,
perPage: 1
}
};
var baseCollection = [{id: 1}, {id: 2}];
var PagedCollection = Backbone.Paginator.clientPager.extend(OPTS);
this.clientPagerTest = new PagedCollection(baseCollection);
});
it('should set the currentPage to 1', function() {
this.clientPagerTest.bootstrap();
expect(this.clientPagerTest.currentPage).to.equal(1);
});
it('should set the info.totalPages to 2', function() {
this.clientPagerTest.bootstrap();
expect(this.clientPagerTest.information.totalPages).to.equal(2);
});
it('should set bootstrap options to instance defaults', function() {
this.clientPagerTest.bootstrap({totalRecords: 12});
expect(this.clientPagerTest.totalRecords).to.equal(12);
});
it('should return an instance of this', function() {
expect(this.clientPagerTest.bootstrap()).to.equal(this.clientPagerTest);
});
});
describe('pager', function() {
// TODO: write many more tests for this function
it('should accept an options param and call a success callback', function() {
var successCallbackSpy = sinon.spy();
this.clientPagerTest.pager({success: successCallbackSpy});
expect(successCallbackSpy.calledOnce).to.equal(true);
});
it('should not try to invoke an undefined success callback', function() {
expect(this.clientPagerTest.pager()).to.equal(undefined);
expect(this.clientPagerTest.pager({error: function() {}})).to.equal(undefined);
});
});
//TODO: write tests for these methods
//setSort
//setFieldFilter
//doFakeFieldFilter
//setFilter
//doFakeFilter
//pager
//_sort
//_filedFilter
//_filter
//info
//setPagination
});