495 lines
15 KiB
JavaScript
495 lines
15 KiB
JavaScript
module('Backbone.Mutators');
|
||
|
||
test("can get 'normal' value", function () {
|
||
expect(2);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
fullname: function () {
|
||
return this.firstname + ' ' + this.lastname;
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
model.set('firstname', 'Sebastian');
|
||
model.set('lastname', 'Golasch');
|
||
|
||
equal(model.get('firstname'), 'Sebastian', 'Can get unmutated firstname');
|
||
equal(model.get('lastname'), 'Golasch', 'Can get unmutated lastname');
|
||
});
|
||
|
||
test("can get 'mutated' value (newly created)", function () {
|
||
expect(3);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
fullname: function () {
|
||
return this.get('firstname') + ' ' + this.get('lastname');
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
model.set('firstname', 'Sebastian');
|
||
model.set('lastname', 'Golasch');
|
||
equal(model.get('firstname'), 'Sebastian', 'Can get unmutated firstname');
|
||
equal(model.get('lastname'), 'Golasch', 'Can get unmutated lastname');
|
||
equal(model.get('fullname'), 'Sebastian Golasch', 'Can get mutated fullname');
|
||
});
|
||
|
||
test("can get 'mutated' value (overridden)", function () {
|
||
expect(5);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
status: function (key, value, options, set) {
|
||
if(key){
|
||
set('status', value);
|
||
}
|
||
|
||
return { status: this.attributes.status, overallStatus: this.get('overallStatus'), underestimatedNonOverallStatus: this.get('underestimatedNonOverallStatus') };
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
model.set('overallStatus', 1);
|
||
model.set('underestimatedNonOverallStatus', 3);
|
||
model.set('status', 2);
|
||
|
||
equal(model.get('overallStatus'), 1, 'Can get unmutated overallStatus');
|
||
equal(model.get('underestimatedNonOverallStatus'), 3, 'Can get unmutated underestimatedNonOverallStatus');
|
||
equal(model.get('status').status, 2, 'Can get mutated status');
|
||
equal(model.get('status').overallStatus, 1, 'Can get mutated status');
|
||
equal(model.get('status').underestimatedNonOverallStatus, 3, 'Can get mutated status');
|
||
});
|
||
|
||
test("can get 'normal' value - object context", function () {
|
||
expect(2);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
fullanme: {
|
||
get: function () {
|
||
return this.get('firstname') + ' ' + this.get('lastname');
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
model.set('firstname', 'Sebastian');
|
||
model.set('lastname', 'Golasch');
|
||
|
||
equal(model.get('firstname'), 'Sebastian', 'Can get unmutated firstname');
|
||
equal(model.get('lastname'), 'Golasch', 'Can get unmutated lastname');
|
||
});
|
||
|
||
test("can get 'mutated' value (newly created) - object context", function () {
|
||
expect(3);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
fullname: {
|
||
get: function () {
|
||
return this.get('firstname') + ' ' + this.get('lastname');
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
model.set('firstname', 'Sebastian');
|
||
model.set('lastname', 'Golasch');
|
||
|
||
equal(model.get('firstname'), 'Sebastian', 'Can get unmutated firstname');
|
||
equal(model.get('lastname'), 'Golasch', 'Can get unmutated lastname');
|
||
equal(model.get('fullname'), 'Sebastian Golasch', 'Can get mutated fullname');
|
||
});
|
||
|
||
test("can get 'mutated' value (overridden) - object context", function () {
|
||
expect(5);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
status: {
|
||
get: function () {
|
||
return { status: this.attributes.status, overallStatus: this.get('overallStatus'), underestimatedNonOverallStatus: this.get('underestimatedNonOverallStatus') };
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
model.set('overallStatus', 1);
|
||
model.set('underestimatedNonOverallStatus', 3);
|
||
model.set('status', 2);
|
||
|
||
equal(model.get('overallStatus'), 1, 'Can get unmutated overallStatus');
|
||
equal(model.get('underestimatedNonOverallStatus'), 3, 'Can get unmutated underestimatedNonOverallStatus');
|
||
equal(model.get('status').status, 2, 'Can get mutated status');
|
||
equal(model.get('status').overallStatus, 1, 'Can get mutated status');
|
||
equal(model.get('status').underestimatedNonOverallStatus, 3, 'Can get mutated status');
|
||
});
|
||
|
||
test("can set 'normal' value (key <-> value)", function () {
|
||
expect(1);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
status: {
|
||
set: function () {
|
||
return { status: this.attributes.status, overallStatus: this.get('overallStatus'), underestimatedNonOverallStatus: this.get('underestimatedNonOverallStatus') };
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
model.set('overallStatus', 1);
|
||
|
||
equal(model.get('overallStatus'), 1, 'Can get unmutated overallStatus');
|
||
});
|
||
|
||
test("can set 'mutated' value (key <-> value)", function () {
|
||
expect(2);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
status: {
|
||
set: function (key, value, options) {
|
||
this.set('pState', value.pState, options);
|
||
this.set('aState', value.aState, options);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
model.set('status', {pState: 1, aState: 2});
|
||
|
||
equal(model.get('pState'), 1, 'Can get mutated pState');
|
||
equal(model.get('aState'), 2, 'Can get mutated aState');
|
||
});
|
||
|
||
test("can set 'normal' value (object)", function () {
|
||
expect(1);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
status: {
|
||
set: function () {
|
||
return { status: this.attributes.status, overallStatus: this.get('overallStatus'), underestimatedNonOverallStatus: this.get('underestimatedNonOverallStatus') };
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
model.set({overallStatus: 1});
|
||
|
||
equal(model.get('overallStatus'), 1, 'Can get unmutated overallStatus');
|
||
});
|
||
|
||
test("can set attribute objects", function () {
|
||
expect(3);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
fullname: {
|
||
set: function (key, value, options) {
|
||
var names = value.split(' ');
|
||
this.set('firstname', names[0], options);
|
||
this.set('lastname', names[1], options);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
model.set({ fullname: 'Sebastian Golasch', admin: true });
|
||
|
||
equal(model.get('firstname'), 'Sebastian', 'Can get the firstname');
|
||
equal(model.get('lastname'), 'Golasch', 'Can get the lastname');
|
||
equal(model.get('admin'), true, 'Can get the admin status');
|
||
});
|
||
|
||
test("can set newly created 'mutated' value (object)", function () {
|
||
expect(2);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
status: {
|
||
set: function (key, value, options) {
|
||
this.set('pState', value.pState, options);
|
||
this.set('aState', value.aState, options);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
model.set({status: {pState: 1, aState: 2, dState: 3}});
|
||
|
||
equal(model.get('pState'), 1, 'Can get mutated pState');
|
||
equal(model.get('aState'), 2, 'Can get mutated aState');
|
||
});
|
||
|
||
test("can set 'mutated' value (object)", function () {
|
||
expect(4);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
status: {
|
||
set: function (key, value, options, set) {
|
||
if(_.isString(value)){
|
||
set(key, value);
|
||
} else {
|
||
this.set('pState', value.pState, options);
|
||
this.set('aState', value.aState, options);
|
||
if (value.pState === 1) {
|
||
set(key, 'supercool', options);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
defaults: {
|
||
status: 'awkward'
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
|
||
equal(model.get('status'), 'awkward', 'Can get unmodified value');
|
||
model.set({status: {pState: 1, aState: 2, dState: 3}});
|
||
equal(model.get('status'), 'supercool', 'Can get mutated status value');
|
||
equal(model.get('pState'), 1, 'Can get mutated pState');
|
||
equal(model.get('aState'), 2, 'Can get mutated aState');
|
||
|
||
});
|
||
|
||
test("can set 'mutated' value and fire event", function () {
|
||
expect(3);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
status: {
|
||
set: function (key, value, options, set) {
|
||
set(key, value.toLowerCase(), options);
|
||
}
|
||
}
|
||
},
|
||
defaults: {
|
||
status: 'awkward'
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
|
||
model.bind('mutators:set:status', function () {
|
||
ok(true, 'Callback called');
|
||
});
|
||
|
||
equal(model.get('status'), 'awkward', 'Can get unmodified value');
|
||
model.set({status: 'SUPERCOOL'});
|
||
equal(model.get('status'), 'supercool', 'Can get mutated status value');
|
||
|
||
});
|
||
|
||
test("can set 'mutated' value and fire event", function () {
|
||
expect(2);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
status: {
|
||
set: function (key, value, options, set) {
|
||
set(key, value.toLowerCase(), options);
|
||
}
|
||
}
|
||
},
|
||
defaults: {
|
||
status: 'awkward'
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
|
||
model.bind('mutators:set:status', function () {
|
||
ok(true, 'Callback called (And this shouldn´t happen)');
|
||
});
|
||
|
||
equal(model.get('status'), 'awkward', 'Can get unmodified value');
|
||
model.set('status', 'SUPERCOOL', {silent: true});
|
||
equal(model.get('status'), 'supercool', 'Can get mutated status value');
|
||
|
||
});
|
||
|
||
test("can set 'mutated' value and fire event", function () {
|
||
expect(4);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
status: {
|
||
set: function (key, value, options, set) {
|
||
set(key, value.toLowerCase(), options);
|
||
}
|
||
}
|
||
},
|
||
defaults: {
|
||
status: 'awkward'
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
|
||
model.bind('mutators:set:status', function () {
|
||
ok(true, 'Callback called (And this shouldn´t happen)');
|
||
});
|
||
|
||
model.bind('change:status', function () {
|
||
ok(true, 'Callback called (And this should happen)');
|
||
});
|
||
|
||
equal(model.get('status'), 'awkward', 'Can get unmodified value');
|
||
model.set('status', 'SUPERCOOL', {mutators: {silent: true}});
|
||
equal(model.get('status'), 'supercool', 'Can get mutated status value');
|
||
|
||
});
|
||
|
||
test("can serialize an unmutated model", function () {
|
||
expect(2);
|
||
var Model = Backbone.Model.extend({
|
||
defaults: {
|
||
a: 'a',
|
||
b: 'b'
|
||
}
|
||
});
|
||
|
||
equal((new Model()).toJSON().a, 'a', 'can serialize unmutated model');
|
||
equal((new Model()).toJSON().b, 'b', 'can serialize unmutated model');
|
||
});
|
||
|
||
test("can serialize mutated model", function () {
|
||
expect(3);
|
||
var Model = Backbone.Model.extend({
|
||
defaults: {
|
||
a: 'a',
|
||
b: 'b'
|
||
},
|
||
mutators: {
|
||
state: function () {
|
||
return this.get('a') + ', ' + this.get('b');
|
||
}
|
||
}
|
||
});
|
||
|
||
equal((new Model()).toJSON().a, 'a', 'can serialize mutated model');
|
||
equal((new Model()).get('state'), 'a, b', 'can serialize mutated model');
|
||
equal((new Model()).toJSON().state, 'a, b', 'can serialize mutated model');
|
||
});
|
||
|
||
test("can serialize mutated model with only a setter", function () {
|
||
expect(2);
|
||
var Model = Backbone.Model.extend({
|
||
mutators: {
|
||
status: {
|
||
set: function (key, value, options, set) {
|
||
set(key, value.toLowerCase(), options);
|
||
}
|
||
}
|
||
},
|
||
defaults: {
|
||
status: 'awkward'
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
|
||
equal(model.toJSON().status, 'awkward', 'can serialize mutated model');
|
||
model.set('status', 'SUPERCOOL', {mutators: {silent: true}});
|
||
equal(model.toJSON().status, 'supercool', 'can serialize mutated model');
|
||
});
|
||
|
||
test("can escape mutated properties", function () {
|
||
expect(2);
|
||
var Model = Backbone.Model.extend({
|
||
defaults: {
|
||
a: 'a',
|
||
b: 'b'
|
||
},
|
||
mutators: {
|
||
b: function () {
|
||
return 'c';
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
equal(model.get('b'), 'c');
|
||
model.set('b', 'foobar');
|
||
equal(model.get('b'), 'c');
|
||
});
|
||
|
||
test("can get/set using single method", 6, function(){
|
||
|
||
var Model = Backbone.Model.extend({
|
||
mutators:{
|
||
state:function(key, value){
|
||
if(key){
|
||
this.set("a", value);
|
||
|
||
equal(arguments.length, 4);
|
||
return null; //prevents ret from returning
|
||
}
|
||
|
||
return this.get("a");
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
|
||
var value = "happy";
|
||
model.set('state', value);
|
||
|
||
equal(model.get('state'), value);
|
||
|
||
var new_state = "excited",
|
||
new_level = 10;
|
||
|
||
|
||
//set multiple
|
||
model.set({
|
||
level:new_level,
|
||
state:new_state
|
||
});
|
||
|
||
equal(model.get('state'), new_state);
|
||
equal(model.get('level'), new_level);
|
||
|
||
});
|
||
|
||
test("can omit transient variables from JSON when saving", 4, function() {
|
||
var Model = Backbone.Model.extend({
|
||
defaults:{
|
||
firstName:"Iain",
|
||
middleInit:"M",
|
||
lastName:"Banks"
|
||
},
|
||
mutators:{
|
||
fullName:{
|
||
get: function() {
|
||
var fullName = this.get("firstName");
|
||
fullName += " " + this.get("middleInit");
|
||
fullName += ". " + this.get("lastName");
|
||
return fullName;
|
||
},
|
||
transient: true
|
||
}
|
||
}
|
||
});
|
||
|
||
var model = new Model();
|
||
// First make sure we didn't break the accessor (or the normal model property
|
||
// access)
|
||
equal(model.get("fullName"), "Iain M. Banks");
|
||
equal(model.get("firstName"), "Iain");
|
||
|
||
// Ensure that a normal toJSON call (like you'd use with a template) includes
|
||
// the computed value
|
||
var modelToJSON = model.toJSON();
|
||
equal(modelToJSON.fullName, "Iain M. Banks");
|
||
|
||
// Backbone always sets 'emulateHTTP' to true or (usually) false when syncing,
|
||
// so we use the existence of that property as a proxy for "yes I'm syncing"
|
||
var modelToJSONSync = model.toJSON({emulateHTTP:false});
|
||
equal(typeof modelToJSONSync.fullName, "undefined");
|
||
});
|