[Pkg-javascript-commits] [backbone] 35/101: Wrapped up the model tests.

Jonas Smedegaard js at moszumanska.debian.org
Sat May 3 16:58:26 UTC 2014


This is an automated email from the git hooks/post-receive script.

js pushed a commit to tag 0.1.0
in repository backbone.

commit 16149c7c376eca25fc85db638e2f81de32f71124
Author: Jeremy Ashkenas <jashkenas at gmail.com>
Date:   Wed Oct 6 12:23:22 2010 -0400

    Wrapped up the model tests.
---
 backbone.js      | 125 ++++++++++++++++++++++++-----------------------
 test/bindable.js |  68 +++++++++++++-------------
 test/model.js    | 144 +++++++++++++++++++++++++++++++++++++++++--------------
 3 files changed, 205 insertions(+), 132 deletions(-)

diff --git a/backbone.js b/backbone.js
index 7c33cb3..bddb41f 100644
--- a/backbone.js
+++ b/backbone.js
@@ -101,7 +101,7 @@
   Backbone.Model = function(attributes) {
     this._attributes = {};
     attributes = attributes || {};
-    this.set(attributes, true);
+    this.set(attributes, {silent : true});
     this.cid = _.uniqueId('c');
     this._formerAttributes = this.attributes();
   };
@@ -116,6 +116,26 @@
     // Has the item been changed since the last `changed` event?
     _changed : false,
 
+    // Return a copy of the model's `attributes` object.
+    attributes : function() {
+      return _.clone(this._attributes);
+    },
+
+    // Default URL for the model's representation on the server -- if you're
+    // using Backbone's restful methods, override this to change the endpoint
+    // that will be called.
+    url : function() {
+      var base = this.collection.url();
+      if (this.isNew()) return base;
+      return base + '/' + this.id;
+    },
+
+    // String representation of the model. Override this to provide a nice way
+    // to print models to the console.
+    toString : function() {
+      return 'Model ' + this.id;
+    },
+
     // Create a new model with identical attributes to this one.
     clone : function() {
       return new (this.constructor)(this.attributes());
@@ -132,47 +152,9 @@
       return !this.id;
     },
 
-    // Call this method to fire manually fire a `changed` event for this model.
-    // Calling this will cause all objects observing the model to update.
-    changed : function() {
-      this.trigger('change', this);
-      this._formerAttributes = this.attributes();
-      this._changed = false;
-    },
-
-    // Determine if the model has changed since the last `changed` event.
-    // If you specify an attribute name, determine if that attribute has changed.
-    hasChanged : function(attr) {
-      if (attr) return this._formerAttributes[attr] != this._attributes[attr];
-      return this._changed;
-    },
-
-    // Get the previous value of an attribute, recorded at the time the last
-    // `changed` event was fired.
-    formerValue : function(attr) {
-      if (!attr || !this._formerAttributes) return null;
-      return this._formerAttributes[attr];
-    },
-
-    // Get all of the attributes of the model at the time of the previous
-    // `changed` event.
-    formerAttributes : function() {
-      return this._formerAttributes;
-    },
-
-    // Return an object containing all the attributes that have changed, or false
-    // if there are no changed attributes. Useful for determining what parts of a
-    // view need to be updated and/or what attributes need to be persisted to
-    // the server.
-    changedAttributes : function(now) {
-      var old = this.formerAttributes(), now = now || this.attributes(), changed = false;
-      for (var attr in now) {
-        if (!_.isEqual(old[attr], now[attr])) {
-          changed = changed || {};
-          changed[attr] = now[attr];
-        }
-      }
-      return changed;
+    // Get the value of an attribute.
+    get : function(attr) {
+      return this._attributes[attr];
     },
 
     // Set a hash of model attributes on the object, firing `changed` unless you
@@ -201,40 +183,61 @@
       return this;
     },
 
-    // Get the value of an attribute.
-    get : function(attr) {
-      return this._attributes[attr];
-    },
-
     // Remove an attribute from the model, firing `changed` unless you choose to
     // silence it.
     unset : function(attr, options) {
       options || (options = {});
       var value = this._attributes[attr];
       delete this._attributes[attr];
-      if (!options.silent) this.changed();
+      if (!options.silent) {
+        this._changed = true;
+        this.trigger('change:' + attr);
+        this.changed();
+      }
       return value;
     },
 
-    // Return a copy of the model's attributes.
-    attributes : function() {
-      return _.clone(this._attributes);
+    // Call this method to fire manually fire a `changed` event for this model.
+    // Calling this will cause all objects observing the model to update.
+    changed : function() {
+      this.trigger('change', this);
+      this._formerAttributes = this.attributes();
+      this._changed = false;
     },
 
-    // Bind all methods in the list to the model.
-    bindAll : function() {
-      _.bindAll.apply(_, [this].concat(arguments));
+    // Determine if the model has changed since the last `changed` event.
+    // If you specify an attribute name, determine if that attribute has changed.
+    hasChanged : function(attr) {
+      if (attr) return this._formerAttributes[attr] != this._attributes[attr];
+      return this._changed;
     },
 
-    toString : function() {
-      return 'Model ' + this.id;
+    // Return an object containing all the attributes that have changed, or false
+    // if there are no changed attributes. Useful for determining what parts of a
+    // view need to be updated and/or what attributes need to be persisted to
+    // the server.
+    changedAttributes : function(now) {
+      var old = this.formerAttributes(), now = now || this.attributes(), changed = false;
+      for (var attr in now) {
+        if (!_.isEqual(old[attr], now[attr])) {
+          changed = changed || {};
+          changed[attr] = now[attr];
+        }
+      }
+      return changed;
     },
 
-    // The URL of the model's representation on the server.
-    url : function() {
-      var base = this.collection.url();
-      if (this.isNew()) return base;
-      return base + '/' + this.id;
+    // Get the previous value of an attribute, recorded at the time the last
+    // `changed` event was fired.
+    formerValue : function(attr) {
+      if (!attr || !this._formerAttributes) return null;
+      return this._formerAttributes[attr];
+    },
+
+    // Get all of the attributes of the model at the time of the previous
+    // `changed` event.
+    formerAttributes : function() {
+      return this._formerAttributes;
     },
 
     // Set a hash of model attributes, and sync the model to the server.
diff --git a/test/bindable.js b/test/bindable.js
index 5f8b79a..2c53699 100644
--- a/test/bindable.js
+++ b/test/bindable.js
@@ -2,41 +2,41 @@ $(document).ready(function() {
 
   module("Backbone bindable");
 
-    test("bindable: bind and trigger", function() {
-        var obj = { counter: 0 };
-        _.extend(obj,Backbone.Bindable);
-        obj.bind('event', function() { obj.counter += 1; });
-        obj.trigger('event');
-        equals(obj.counter,1,'counter should be incremented.');
-        obj.trigger('event');
-        obj.trigger('event');
-        obj.trigger('event');
-        obj.trigger('event');
-        equals(obj.counter, 5, 'counter should be incremented five times.');
-    });
+  test("bindable: bind and trigger", function() {
+    var obj = { counter: 0 };
+    _.extend(obj,Backbone.Bindable);
+    obj.bind('event', function() { obj.counter += 1; });
+    obj.trigger('event');
+    equals(obj.counter,1,'counter should be incremented.');
+    obj.trigger('event');
+    obj.trigger('event');
+    obj.trigger('event');
+    obj.trigger('event');
+    equals(obj.counter, 5, 'counter should be incremented five times.');
+  });
 
-    test("bindable: bind, then unbind all functions", function() {
-        var obj = { counter: 0 };
-        _.extend(obj,Backbone.Bindable);
-        var callback = function() { obj.counter += 1; };
-        obj.bind('event', callback);
-        obj.trigger('event');
-        obj.unbind('event');
-        obj.trigger('event');
-        equals(obj.counter, 1, 'counter should have only been incremented once.');
-    });
+  test("bindable: bind, then unbind all functions", function() {
+    var obj = { counter: 0 };
+    _.extend(obj,Backbone.Bindable);
+    var callback = function() { obj.counter += 1; };
+    obj.bind('event', callback);
+    obj.trigger('event');
+    obj.unbind('event');
+    obj.trigger('event');
+    equals(obj.counter, 1, 'counter should have only been incremented once.');
+  });
 
-    test("bindable: bind two callbacks, unbind only one", function() {
-        var obj = { counterA: 0, counterB: 0 };
-        _.extend(obj,Backbone.Bindable);
-        var callback = function() { obj.counterA += 1; };
-        obj.bind('event', callback);
-        obj.bind('event', function() { obj.counterB += 1; });
-        obj.trigger('event');
-        obj.unbind('event', callback);
-        obj.trigger('event');
-        equals(obj.counterA, 1, 'counterA should have only been incremented once.');
-        equals(obj.counterB, 2, 'counterB should have been incremented twice.');
-    });
+  test("bindable: bind two callbacks, unbind only one", function() {
+    var obj = { counterA: 0, counterB: 0 };
+    _.extend(obj,Backbone.Bindable);
+    var callback = function() { obj.counterA += 1; };
+    obj.bind('event', callback);
+    obj.bind('event', function() { obj.counterB += 1; });
+    obj.trigger('event');
+    obj.unbind('event', callback);
+    obj.trigger('event');
+    equals(obj.counterA, 1, 'counterA should have only been incremented once.');
+    equals(obj.counterB, 2, 'counterB should have been incremented twice.');
+  });
 
 });
\ No newline at end of file
diff --git a/test/model.js b/test/model.js
index eb76612..9d5e2a4 100644
--- a/test/model.js
+++ b/test/model.js
@@ -2,51 +2,121 @@ $(document).ready(function() {
 
   module("Backbone model");
 
+  // Variable to catch the last request.
+  var lastRequest = null;
+
+  // Stub out Backbone.request...
+  Backbone.request = function() {
+    lastRequest = _.toArray(arguments);
+  };
+
+  var attrs = {
+    id     : '1-the-tempest',
+    title  : "The Tempest",
+    author : "Bill Shakespeare",
+    length : 123
+  };
+
+  var doc = new Backbone.Model(attrs);
+
+  var klass = Backbone.Collection.extend({
+    url : function() { return '/collection'; }
+  });
+
+  var collection = new klass();
+  collection.add(doc);
+
+  test("model: attributes", function() {
+    ok(doc.attributes() !== attrs, "Attributes are different objects.");
+    ok(_.isEqual(doc.attributes(), attrs), "but with identical contents.");
+  });
+
+  test("model: url", function() {
+    equals(doc.url(), '/collection/1-the-tempest');
+  });
+
+  test("model: toString", function() {
+    equals(doc.toString(), 'Model 1-the-tempest');
+  });
+
   test("model: clone", function() {
-      attrs = { 'foo': 1, 'bar': 2, 'baz': 3};
-      a = new Backbone.Model(attrs);
-      b = a.clone();
-      equals(a.get('foo'), 1);
-      equals(a.get('bar'), 2);
-      equals(a.get('baz'), 3);
-      equals(b.get('foo'), a.get('foo'), "Foo should be the same on the clone.");
-      equals(b.get('bar'), a.get('bar'), "Bar should be the same on the clone.");
-      equals(b.get('baz'), a.get('baz'), "Baz should be the same on the clone.");
+    attrs = { 'foo': 1, 'bar': 2, 'baz': 3};
+    a = new Backbone.Model(attrs);
+    b = a.clone();
+    equals(a.get('foo'), 1);
+    equals(a.get('bar'), 2);
+    equals(a.get('baz'), 3);
+    equals(b.get('foo'), a.get('foo'), "Foo should be the same on the clone.");
+    equals(b.get('bar'), a.get('bar'), "Bar should be the same on the clone.");
+    equals(b.get('baz'), a.get('baz'), "Baz should be the same on the clone.");
+    a.set({foo : 100});
+    equals(a.get('foo'), 100);
+    equals(b.get('foo'), 1, "Changing a parent attribute does not change the clone.");
   });
 
   test("model: isEqual", function() {
-      attrs = { 'foo': 1, 'bar': 2, 'baz': 3};
-      a = new Backbone.Model(attrs);
-      b = new Backbone.Model(attrs);
-      ok(a.isEqual(b), "a should equal b");
-      c = new Backbone.Model({ 'foo': 1, 'bar': 2, 'baz': 3, 'qux': 4});
-      ok(!a.isEqual(c), "a should not equal c");
+    attrs = { 'foo': 1, 'bar': 2, 'baz': 3};
+    a = new Backbone.Model(attrs);
+    b = new Backbone.Model(attrs);
+    ok(a.isEqual(b), "a should equal b");
+    c = new Backbone.Model({ 'foo': 1, 'bar': 2, 'baz': 3, 'qux': 4});
+    ok(!a.isEqual(c), "a should not equal c");
   });
 
   test("model: isNew", function() {
-      attrs = { 'foo': 1, 'bar': 2, 'baz': 3};
-      a = new Backbone.Model(attrs);
-      ok(a.isNew(), "it should be new");
-      attrs = { 'foo': 1, 'bar': 2, 'baz': 3, 'id': -5 };
-      ok(a.isNew(), "any defined ID is legal, negative or positive");
-  });
-
-  test("model: set", function() {
-      attrs = { 'foo': 1, 'bar': 2, 'baz': 3};
-      a = new Backbone.Model(attrs);
-      var changeCount = 0;
-      a.bind("change", function() { changeCount += 1; });
-      a.set({'foo': 2});
-      ok(a.get('foo')== 2, "Foo should have changed.");
-      ok(changeCount == 1, "Change count should have incremented.");
-      a.set({'foo': 2}); // set with value that is not new shouldn't fire change event
-      ok(a.get('foo')== 2, "Foo should NOT have changed, still 2");
-      ok(changeCount == 1, "Change count should NOT have incremented.");
-
-      a.unset('foo');
-      ok(a.get('foo')== null, "Foo should have changed");
-      ok(changeCount == 2, "Change count should have incremented for unset.");
+    attrs = { 'foo': 1, 'bar': 2, 'baz': 3};
+    a = new Backbone.Model(attrs);
+    ok(a.isNew(), "it should be new");
+    attrs = { 'foo': 1, 'bar': 2, 'baz': 3, 'id': -5 };
+    ok(a.isNew(), "any defined ID is legal, negative or positive");
+  });
+
+  test("model: get", function() {
+    equals(doc.get('title'), 'The Tempest');
+    equals(doc.get('author'), 'Bill Shakespeare');
+  });
+
+  test("model: set and unset", function() {
+    attrs = { 'foo': 1, 'bar': 2, 'baz': 3};
+    a = new Backbone.Model(attrs);
+    var changeCount = 0;
+    a.bind("change:foo", function() { changeCount += 1; });
+    a.set({'foo': 2});
+    ok(a.get('foo')== 2, "Foo should have changed.");
+    ok(changeCount == 1, "Change count should have incremented.");
+    a.set({'foo': 2}); // set with value that is not new shouldn't fire change event
+    ok(a.get('foo')== 2, "Foo should NOT have changed, still 2");
+    ok(changeCount == 1, "Change count should NOT have incremented.");
+
+    a.unset('foo');
+    ok(a.get('foo')== null, "Foo should have changed");
+    ok(changeCount == 2, "Change count should have incremented for unset.");
+  });
+
+  test("model: changed, hasChanged, changedAttributes, formerValue, formerAttributes", function() {
+    var model = new Backbone.Model({name : "Tim", age : 10});
+    model.bind('change', function() {
+      ok(model.hasChanged('name'), 'name changed');
+      ok(!model.hasChanged('age'), 'age did not');
+      ok(_.isEqual(model.changedAttributes(), {name : 'Rob'}), 'changedAttributes returns the changed attrs');
+      equals(model.formerValue('name'), 'Tim');
+      ok(_.isEqual(model.formerAttributes(), {name : "Tim", age : 10}), 'formerAttributes is correct');
+    });
+    model.set({name : 'Rob'}, {silent : true});
+    model.changed();
+    equals(model.get('name'), 'Rob');
+  });
+
+  test("model: save", function() {
+    doc.save({title : "Henry V"});
+    equals(lastRequest[0], 'PUT');
+    ok(_.isEqual(lastRequest[1], doc));
+  });
 
+  test("model: destroy", function() {
+    doc.destroy();
+    equals(lastRequest[0], 'DELETE');
+    ok(_.isEqual(lastRequest[1], doc));
   });
 
 });
\ No newline at end of file

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/backbone.git



More information about the Pkg-javascript-commits mailing list