From 8ef1730b73e7b99ce2dfdcbab3249697f69250aa Mon Sep 17 00:00:00 2001 From: Brad Dunbar Date: Thu, 30 Aug 2012 23:05:28 -0400 Subject: [PATCH] Consolidate test boilerplate; use consistent names. --- test/collection.js | 39 +++++-------------- test/environment.js | 39 +++++++++++++++++++ test/model.js | 58 ++++++++++----------------- test/sync.js | 95 ++++++++++++++++++++------------------------- test/test.html | 1 + 5 files changed, 113 insertions(+), 119 deletions(-) create mode 100644 test/environment.js diff --git a/test/collection.js b/test/collection.js index 7cb6ae0da..d3d5aaf87 100644 --- a/test/collection.js +++ b/test/collection.js @@ -1,15 +1,12 @@ $(document).ready(function() { - var lastRequest = null; - var sync = Backbone.sync; - var ajaxParams; - var ajax = Backbone.ajax; - var a, b, c, d, e, col, otherCol; - module("Backbone.Collection", { + module("Backbone.Collection", _.extend(new Environment, { setup: function() { + Environment.prototype.setup.apply(this, arguments); + a = new Backbone.Model({id: 3, label: 'a'}); b = new Backbone.Model({id: 2, label: 'b'}); c = new Backbone.Model({id: 1, label: 'c'}); @@ -17,25 +14,9 @@ $(document).ready(function() { e = null; col = new Backbone.Collection([a,b,c,d]); otherCol = new Backbone.Collection(); - - Backbone.sync = function(method, model, options) { - lastRequest = { - method: method, - model: model, - options: options - }; - sync.apply(this, arguments); - }; - - Backbone.ajax = function(params) { ajaxParams = params; }; - }, - - teardown: function() { - Backbone.sync = sync; - Backbone.ajax = ajax; } - }); + })); test("Collection: new and sort", 7, function() { equal(col.first(), a, "a should be first"); @@ -380,20 +361,20 @@ $(document).ready(function() { var collection = new Backbone.Collection; collection.url = '/test'; collection.fetch(); - equal(lastRequest.method, 'read'); - equal(lastRequest.model, collection); - equal(lastRequest.options.parse, true); + equal(this.syncArgs.method, 'read'); + equal(this.syncArgs.model, collection); + equal(this.syncArgs.options.parse, true); collection.fetch({parse: false}); - equal(lastRequest.options.parse, false); + equal(this.syncArgs.options.parse, false); }); test("Collection: create", 4, function() { var collection = new Backbone.Collection; collection.url = '/test'; var model = collection.create({label: 'f'}, {wait: true}); - equal(lastRequest.method, 'create'); - equal(lastRequest.model, model); + equal(this.syncArgs.method, 'create'); + equal(this.syncArgs.model, model); equal(model.get('label'), 'f'); equal(model.collection, collection); }); diff --git a/test/environment.js b/test/environment.js new file mode 100644 index 000000000..62292dcb3 --- /dev/null +++ b/test/environment.js @@ -0,0 +1,39 @@ +(function() { + + var Environment = this.Environment = function(){}; + + _.extend(Environment.prototype, { + + ajax: Backbone.ajax, + + sync: Backbone.sync, + + setup: function() { + var env = this; + + // Capture ajax settings for comparison. + Backbone.ajax = function(settings) { + env.ajaxSettings = settings; + }; + + // Capture the arguments to Backbone.sync for comparison. + Backbone.sync = function(method, model, options) { + env.syncArgs = { + method: method, + model: model, + options: options + }; + env.sync.apply(this, arguments); + }; + }, + + teardown: function() { + this.syncArgs = null; + this.ajaxSettings = null; + Backbone.sync = this.sync; + Backbone.ajax = this.ajax; + } + + }); + +})(); diff --git a/test/model.js b/test/model.js index 7a63ed299..2da0ae0f9 100644 --- a/test/model.js +++ b/test/model.js @@ -1,22 +1,15 @@ $(document).ready(function() { - // Variable to catch the last request. - var lastRequest = null; - // Variable to catch ajax params. - var ajaxParams = null; - var sync = Backbone.sync; - var ajax = Backbone.ajax; - var urlRoot = null; - var proxy = Backbone.Model.extend(); var klass = Backbone.Collection.extend({ url : function() { return '/collection'; } }); var doc, collection; - module("Backbone.Model", { + module("Backbone.Model", _.extend(new Environment, { setup: function() { + Environment.prototype.setup.apply(this, arguments); doc = new proxy({ id : '1-the-tempest', title : "The Tempest", @@ -25,27 +18,9 @@ $(document).ready(function() { }); collection = new klass(); collection.add(doc); - - Backbone.sync = function(method, model, options) { - lastRequest = { - method: method, - model: model, - options: options - }; - sync.apply(this, arguments); - }; - Backbone.ajax = function(params) { ajaxParams = params; }; - urlRoot = Backbone.Model.prototype.urlRoot; - Backbone.Model.prototype.urlRoot = '/'; - }, - - teardown: function() { - Backbone.sync = sync; - Backbone.ajax = ajax; - Backbone.Model.prototype.urlRoot = urlRoot; } - }); + })); test("Model: initialize", 3, function() { var Model = Backbone.Model.extend({ @@ -334,10 +309,12 @@ $(document).ready(function() { }); test("Model: save within change event", 1, function () { + var env = this; var model = new Backbone.Model({firstName : "Taylor", lastName: "Swift"}); + model.url = '/test'; model.on('change', function () { model.save(); - ok(_.isEqual(lastRequest.model, model)); + ok(_.isEqual(env.syncArgs.model, model)); }); model.set({lastName: 'Hicks'}); }); @@ -371,8 +348,8 @@ $(document).ready(function() { test("Model: save", 2, function() { doc.save({title : "Henry V"}); - equal(lastRequest.method, 'update'); - ok(_.isEqual(lastRequest.model, doc)); + equal(this.syncArgs.method, 'update'); + ok(_.isEqual(this.syncArgs.model, doc)); }); test("Model: save in positional style", 1, function() { @@ -388,14 +365,14 @@ $(document).ready(function() { test("Model: fetch", 2, function() { doc.fetch(); - equal(lastRequest.method, 'read'); - ok(_.isEqual(lastRequest.model, doc)); + equal(this.syncArgs.method, 'read'); + ok(_.isEqual(this.syncArgs.model, doc)); }); test("Model: destroy", 3, function() { doc.destroy(); - equal(lastRequest.method, 'delete'); - ok(_.isEqual(lastRequest.model, doc)); + equal(this.syncArgs.method, 'delete'); + ok(_.isEqual(this.syncArgs.model, doc)); var newModel = new Backbone.Model; equal(newModel.destroy(), false); @@ -595,8 +572,9 @@ $(document).ready(function() { test("save with `wait` succeeds without `validate`", 1, function() { var model = new Backbone.Model(); + model.url = '/test'; model.save({x: 1}, {wait: true}); - ok(lastRequest.model === model); + ok(this.syncArgs.model === model); }); test("`hasChanged` for falsey keys", 2, function() { @@ -616,18 +594,20 @@ $(document).ready(function() { test("`save` with `wait` sends correct attributes", 5, function() { var changed = 0; var model = new Backbone.Model({x: 1, y: 2}); + model.url = '/test'; model.on('change:x', function() { changed++; }); model.save({x: 3}, {wait: true}); - deepEqual(JSON.parse(ajaxParams.data), {x: 3, y: 2}); + deepEqual(JSON.parse(this.ajaxSettings.data), {x: 3, y: 2}); equal(model.get('x'), 1); equal(changed, 0); - lastRequest.options.success({}); + this.syncArgs.options.success({}); equal(model.get('x'), 3); equal(changed, 1); }); test("a failed `save` with `wait` doesn't leave attributes behind", 1, function() { var model = new Backbone.Model; + model.url = '/test'; model.save({x: 1}, {wait: true}); equal(model.get('x'), void 0); }); @@ -644,6 +624,7 @@ $(document).ready(function() { test("save with wait validates attributes", 1, function() { var model = new Backbone.Model(); + model.url = '/test'; model.validate = function() { ok(true); }; model.save({x: 1}, {wait: true}); }); @@ -813,6 +794,7 @@ $(document).ready(function() { test("#1412 - Trigger 'sync' event.", 3, function() { var model = new Backbone.Model({id: 1}); + model.url = '/test'; model.on('sync', function(){ ok(true); }); Backbone.ajax = function(settings){ settings.success(); }; model.fetch(); diff --git a/test/sync.js b/test/sync.js index be95a130b..d25c76ff2 100644 --- a/test/sync.js +++ b/test/sync.js @@ -1,8 +1,5 @@ $(document).ready(function() { - var ajax = Backbone.ajax; - var lastRequest = null; - var Library = Backbone.Collection.extend({ url : function() { return '/library'; } }); @@ -14,42 +11,36 @@ $(document).ready(function() { length : 123 }; - module("Backbone.sync", { + module("Backbone.sync", _.extend(new Environment, { setup : function() { - library = new Library(); - Backbone.ajax = function(obj) { - lastRequest = obj; - }; + Environment.prototype.setup.apply(this, arguments); + library = new Library; library.create(attrs, {wait: false}); - }, - - teardown: function() { - Backbone.ajax = ajax; } - }); + })); test("sync: read", 4, function() { library.fetch(); - equal(lastRequest.url, '/library'); - equal(lastRequest.type, 'GET'); - equal(lastRequest.dataType, 'json'); - ok(_.isEmpty(lastRequest.data)); + equal(this.ajaxSettings.url, '/library'); + equal(this.ajaxSettings.type, 'GET'); + equal(this.ajaxSettings.dataType, 'json'); + ok(_.isEmpty(this.ajaxSettings.data)); }); test("sync: passing data", 3, function() { library.fetch({data: {a: 'a', one: 1}}); - equal(lastRequest.url, '/library'); - equal(lastRequest.data.a, 'a'); - equal(lastRequest.data.one, 1); + equal(this.ajaxSettings.url, '/library'); + equal(this.ajaxSettings.data.a, 'a'); + equal(this.ajaxSettings.data.one, 1); }); test("sync: create", 6, function() { - equal(lastRequest.url, '/library'); - equal(lastRequest.type, 'POST'); - equal(lastRequest.dataType, 'json'); - var data = JSON.parse(lastRequest.data); + equal(this.ajaxSettings.url, '/library'); + equal(this.ajaxSettings.type, 'POST'); + equal(this.ajaxSettings.dataType, 'json'); + var data = JSON.parse(this.ajaxSettings.data); equal(data.title, 'The Tempest'); equal(data.author, 'Bill Shakespeare'); equal(data.length, 123); @@ -57,10 +48,10 @@ $(document).ready(function() { test("sync: update", 7, function() { library.first().save({id: '1-the-tempest', author: 'William Shakespeare'}); - equal(lastRequest.url, '/library/1-the-tempest'); - equal(lastRequest.type, 'PUT'); - equal(lastRequest.dataType, 'json'); - var data = JSON.parse(lastRequest.data); + equal(this.ajaxSettings.url, '/library/1-the-tempest'); + equal(this.ajaxSettings.type, 'PUT'); + equal(this.ajaxSettings.dataType, 'json'); + var data = JSON.parse(this.ajaxSettings.data); equal(data.id, '1-the-tempest'); equal(data.title, 'The Tempest'); equal(data.author, 'William Shakespeare'); @@ -70,11 +61,11 @@ $(document).ready(function() { test("sync: update with emulateHTTP and emulateJSON", 7, function() { Backbone.emulateHTTP = Backbone.emulateJSON = true; library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}); - equal(lastRequest.url, '/library/2-the-tempest'); - equal(lastRequest.type, 'POST'); - equal(lastRequest.dataType, 'json'); - equal(lastRequest.data._method, 'PUT'); - var data = JSON.parse(lastRequest.data.model); + equal(this.ajaxSettings.url, '/library/2-the-tempest'); + equal(this.ajaxSettings.type, 'POST'); + equal(this.ajaxSettings.dataType, 'json'); + equal(this.ajaxSettings.data._method, 'PUT'); + var data = JSON.parse(this.ajaxSettings.data.model); equal(data.id, '2-the-tempest'); equal(data.author, 'Tim Shakespeare'); equal(data.length, 123); @@ -84,10 +75,10 @@ $(document).ready(function() { test("sync: update with just emulateHTTP", 6, function() { Backbone.emulateHTTP = true; library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}); - equal(lastRequest.url, '/library/2-the-tempest'); - equal(lastRequest.type, 'POST'); - equal(lastRequest.contentType, 'application/json'); - var data = JSON.parse(lastRequest.data); + equal(this.ajaxSettings.url, '/library/2-the-tempest'); + equal(this.ajaxSettings.type, 'POST'); + equal(this.ajaxSettings.contentType, 'application/json'); + var data = JSON.parse(this.ajaxSettings.data); equal(data.id, '2-the-tempest'); equal(data.author, 'Tim Shakespeare'); equal(data.length, 123); @@ -97,10 +88,10 @@ $(document).ready(function() { test("sync: update with just emulateJSON", 6, function() { Backbone.emulateJSON = true; library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}); - equal(lastRequest.url, '/library/2-the-tempest'); - equal(lastRequest.type, 'PUT'); - equal(lastRequest.contentType, 'application/x-www-form-urlencoded'); - var data = JSON.parse(lastRequest.data.model); + equal(this.ajaxSettings.url, '/library/2-the-tempest'); + equal(this.ajaxSettings.type, 'PUT'); + equal(this.ajaxSettings.contentType, 'application/x-www-form-urlencoded'); + var data = JSON.parse(this.ajaxSettings.data.model); equal(data.id, '2-the-tempest'); equal(data.author, 'Tim Shakespeare'); equal(data.length, 123); @@ -110,26 +101,26 @@ $(document).ready(function() { test("sync: read model", 3, function() { library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}); library.first().fetch(); - equal(lastRequest.url, '/library/2-the-tempest'); - equal(lastRequest.type, 'GET'); - ok(_.isEmpty(lastRequest.data)); + equal(this.ajaxSettings.url, '/library/2-the-tempest'); + equal(this.ajaxSettings.type, 'GET'); + ok(_.isEmpty(this.ajaxSettings.data)); }); test("sync: destroy", 3, function() { library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}); library.first().destroy({wait: true}); - equal(lastRequest.url, '/library/2-the-tempest'); - equal(lastRequest.type, 'DELETE'); - equal(lastRequest.data, null); + equal(this.ajaxSettings.url, '/library/2-the-tempest'); + equal(this.ajaxSettings.type, 'DELETE'); + equal(this.ajaxSettings.data, null); }); test("sync: destroy with emulateHTTP", 3, function() { library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}); Backbone.emulateHTTP = Backbone.emulateJSON = true; library.first().destroy(); - equal(lastRequest.url, '/library/2-the-tempest'); - equal(lastRequest.type, 'POST'); - equal(JSON.stringify(lastRequest.data), '{"_method":"DELETE"}'); + equal(this.ajaxSettings.url, '/library/2-the-tempest'); + equal(this.ajaxSettings.type, 'POST'); + equal(JSON.stringify(this.ajaxSettings.data), '{"_method":"DELETE"}'); Backbone.emulateHTTP = Backbone.emulateJSON = false; }); @@ -139,7 +130,7 @@ $(document).ready(function() { model.fetch(); }); model.fetch({url: '/one/two'}); - equal(lastRequest.url, '/one/two'); + equal(this.ajaxSettings.url, '/one/two'); }); test("#1052 - `options` is optional.", 0, function() { @@ -163,7 +154,7 @@ $(document).ready(function() { Backbone.sync('read', model, { error: function() { ok(true); } }); - lastRequest.error(); + this.ajaxSettings.error(); }); }); diff --git a/test/test.html b/test/test.html index 2ce88db36..8ad43697b 100644 --- a/test/test.html +++ b/test/test.html @@ -11,6 +11,7 @@ +