From 92c275db29c497cdb264c8fc86e484e851dac86b Mon Sep 17 00:00:00 2001 From: emaphp Date: Sun, 15 Mar 2015 20:29:42 -0300 Subject: [PATCH] added: model.save tests --- README.md | 10 +- test/specs/collection.js | 25 +++ test/specs/model.js | 396 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 429 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b602e67..89fc591 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,10 @@ contacts.fetch() console.log('Collection fetched correctly'); }) .catch(function(data) { - console.log('Failed to fetch collection'); + if (_.isError(data)) + console.error(data) + else + console.log('Failed to fetch collection'); }); ``` @@ -77,7 +80,10 @@ contact.fetch() console.log('Contact fetched correctly'); }) .catch(function(data) { - console.log('Failed to fetch contact'); + if (_.isError(data)) + console.error(data) + else + console.log('Failed to fetch contact'); }); ``` diff --git a/test/specs/collection.js b/test/specs/collection.js index 3574bd2..f889a08 100644 --- a/test/specs/collection.js +++ b/test/specs/collection.js @@ -309,5 +309,30 @@ describe("ASync.Collection tests", function() { server.respond(); }); + + it('must throw error', function(done) { + server.respondWith( + 'GET', + '/notes', + [ + 200, + null, + JSON.stringify([{id: 1}, {id: 2}, {id: 3}]) + ] + ); + + var notes = new FIXTURES.Notes(); + + notes.fetch() + .then(function(data) { + throw new Error(); + }) + .catch(function(err) { + expect(_.isError(err)).to.be.true; + done(); + }); + + server.respond(); + }); }); }); \ No newline at end of file diff --git a/test/specs/model.js b/test/specs/model.js index a285fd8..2e9cc52 100644 --- a/test/specs/model.js +++ b/test/specs/model.js @@ -311,5 +311,401 @@ describe("ASync.Model tests", function() { server.respond(); }); + + it('must throw error', function(done) { + server.respondWith( + 'GET', + '/notes/5', + [ + 200, + null, + JSON.stringify({id: 5, name: 'Emmanuel', surname: 'Antico'}) + ] + ); + + var note = new FIXTURES.Note({id: 5}); + + note.fetch() + .then(function(data) { + throw new Error(); + }) + .catch(function(err) { + expect(_.isError(err)).to.be.true; + done(); + }); + + server.respond(); + }); + }); + + describe('Save tests', function() { + it('must call then', function() { + var value = {id: 1, name: 'Emmanuel', surname: 'Antico'}; + server.respondWith( + 'PUT', + '/contacts/1', + [ + 200, + {"Content-Type": "application/json"}, + JSON.stringify(value) + ] + ); + + var contact = new FIXTURES.Contact(value); + + contact.save(null, {test: true, silent: false}) + .then(function(data) { + expect(data).to.be.a('object'); + expect(data).to.have.property('model'); + expect(data).to.have.property('response'); + expect(data).to.have.property('options'); + expect(data.model).to.be.deep.equal(contact); + + var attrs = data.model.attributes; + expect(attrs).to.have.property('id'); + expect(attrs).to.have.property('name'); + expect(attrs).to.have.property('surname'); + + var response = data.response; + expect(response).to.be.deep.equal(value); + expect(response).to.be.deep.equal(data.model.attributes); + + expect(data.options).to.be.a('object'); + expect(data.options).to.have.property('test'); + expect(data.options).to.have.property('silent'); + + expect(data.options.test).to.be.true; + expect(data.options.silent).to.be.false; + + done(); + }) + .catch(function(err){done(err)}); + + server.respond(); + }); + + it('must call callbacks in order', function(done) { + var value = {id: 2, name: 'Emmanuel', surname: 'Antico'}; + server.respondWith( + 'PUT', + '/contacts/2', + [ + 200, + {"Content-Type": "application/json"}, + JSON.stringify(value) + ] + ); + + var contact = new FIXTURES.Contact(value); + var callback1 = sinon.spy(); + var callback2 = sinon.spy(); + + contact.save() + .then(callback1) + .then(callback2) + .then(function(data) { + expect(callback1.called).to.be.true; + expect(callback1.calledOnce).to.be.true; + expect(callback2.called).to.be.true; + expect(callback2.calledOnce).to.be.true; + expect(callback1.calledBefore(callback2)).to.be.true; + done(); + }) + .catch(function(err) { done(err); }); + + server.respond(); + }); + + it('must call event handlers', function(done) { + var value = {id: 3, name: 'Emmanuel', surname: 'Antico'}; + server.respondWith( + 'PUT', + '/contacts/3', + [ + 200, + {"Content-Type": "application/json"}, + JSON.stringify(value) + ] + ); + + var obj = _.extend({}, Backbone.Events); + var beforeCallback = sinon.spy(); + var afterCallback = sinon.spy(); + var contact = new FIXTURES.Contact(value); + obj.listenTo(contact, 'before:save', beforeCallback); + obj.listenTo(contact, 'after:save', afterCallback); + + contact.save(value, {test: true, silent:false}) + .then(function(data) { + expect(beforeCallback.called).to.be.true; + expect(afterCallback.called).to.be.true; + expect(beforeCallback.calledBefore(afterCallback)).to.be.true; + + var dataArg = beforeCallback.args[0][0]; + expect(dataArg).to.be.a('object'); + expect(dataArg).to.have.property('model'); + expect(dataArg).to.have.property('options'); + expect(dataArg).to.have.property('attrs'); + expect(dataArg.model).to.be.deep.equal(contact); + expect(dataArg.options).to.have.property('test'); + expect(dataArg.options).to.have.property('silent'); + expect(dataArg.options.test).to.be.true; + expect(dataArg.options.silent).to.be.false; + expect(dataArg.attrs).to.be.deep.equal(value); + + dataArg = afterCallback.args[0][0]; + expect(dataArg).to.be.a('object'); + expect(dataArg).to.have.property('model'); + expect(dataArg).to.have.property('options'); + expect(dataArg).to.have.property('response'); + expect(dataArg.model).to.be.deep.equal(contact); + expect(dataArg.response).to.be.deep.equal(dataArg.model.attributes); + expect(dataArg.options).to.have.property('test'); + expect(dataArg.options).to.have.property('silent'); + expect(dataArg.options.test).to.be.true; + expect(dataArg.options.silent).to.be.false; + + var success = afterCallback.args[0][1]; + expect(success).to.be.true; + + done(); + }) + .catch(function(err) { done(err); }); + + server.respond(); + }); + + it('must match attrs', function(done) { + var value = {id: 4, name: 'Emmanuel', surname: 'Antico'}; + server.respondWith( + 'PUT', + '/contacts/4', + [ + 200, + {"Content-Type": "application/json"}, + JSON.stringify(value) + ] + ); + + var obj = _.extend({}, Backbone.Events); + var beforeCallback = sinon.spy(); + var contact = new FIXTURES.Contact(value); + obj.listenTo(contact, 'before:save', beforeCallback); + + contact.save() + .then(function(data) { + var dataArg = beforeCallback.args[0][0]; + expect(dataArg).to.be.a('object'); + expect(dataArg).to.have.property('attrs'); + expect(dataArg.attrs).to.be.undefined; + done(); + }) + .catch(function(err) { done(err); }); + + server.respond(); + }); + + it('must not call event handlers', function(done) { + var value = {id: 5, name: 'Emmanuel', surname: 'Antico'}; + server.respondWith( + 'PUT', + '/contacts/5', + [ + 200, + {"Content-Type": "application/json"}, + JSON.stringify(value) + ] + ); + + var obj = _.extend({}, Backbone.Events); + var beforeCallback = sinon.spy(); + var afterCallback = sinon.spy(); + var contact = new FIXTURES.Contact(value); + obj.listenTo(contact, 'before:save', beforeCallback); + obj.listenTo(contact, 'after:save', afterCallback); + + contact.save(value, {test: false, silent: true}) + .then(function(data) { + expect(beforeCallback.called).to.be.false; + expect(afterCallback.called).to.be.false; + done(); + }) + .catch(function(err) { done(err); }); + + server.respond(); + }); + }); + + describe('Save fail tests', function() { + it('must call catch', function(done) { + var value = {id: 1, message: 'Hello World'}; + server.respondWith( + 'PUT', + '/notes/1', + [ + 500, + null, + '' + ] + ); + + var note = new FIXTURES.Note(value); + + note.save(note.attributes, {test: true, silent: false}) + .then(function() { + }) + .catch(function(data) { + expect(data).to.be.a('object'); + + expect(data).to.have.property('model'); + expect(data).to.have.property('response'); + expect(data).to.have.property('options'); + + expect(data.model).to.be.deep.equal(note); + expect(data.response).to.be.a('object'); + expect(data.response).to.have.property('status'); + expect(data.response).to.have.property('statusText'); + expect(data.response.status).to.equal(500); + expect(data.response.statusText).to.equal('Internal Server Error'); + + var options = data.options; + expect(options).to.have.property('test'); + expect(options).to.have.property('silent'); + expect(options.test).to.be.true; + expect(options.silent).to.be.false; + done(); + }); + + server.respond(); + }); + + it('must call event handlers', function(done) { + var value = {id: 2, message: 'Hello World'}; + server.respondWith( + 'PUT', + '/notes/2', + [ + 500, + null, + '' + ] + ); + + var obj = _.extend({}, Backbone.Events); + var beforeCallback = sinon.spy(); + var afterCallback = sinon.spy(); + var note = new FIXTURES.Note(value); + obj.listenTo(note, 'before:save', beforeCallback); + obj.listenTo(note, 'after:save', afterCallback); + + note.save(value, {test: true, silent:false}) + .then(function(data) { + }) + .catch(function(data) { + expect(beforeCallback.called).to.be.true; + expect(afterCallback.called).to.be.true; + expect(beforeCallback.calledBefore(afterCallback)).to.be.true; + + var dataArg = beforeCallback.args[0][0]; + expect(dataArg).to.be.a('object'); + expect(dataArg).to.have.property('model'); + expect(dataArg).to.have.property('options'); + expect(dataArg).to.have.property('attrs'); + expect(dataArg.model).to.be.deep.equal(note); + expect(dataArg.options).to.have.property('test'); + expect(dataArg.options).to.have.property('silent'); + expect(dataArg.options.test).to.be.true; + expect(dataArg.options.silent).to.be.false; + expect(dataArg.attrs).to.be.deep.equal(value); + + dataArg = afterCallback.args[0][0]; + expect(dataArg).to.be.a('object'); + expect(dataArg).to.have.property('model'); + expect(dataArg).to.have.property('options'); + expect(dataArg).to.have.property('response'); + expect(dataArg.model).to.be.deep.equal(note); + expect(data.response).to.be.a('object'); + expect(data.response).to.have.property('status'); + expect(data.response).to.have.property('statusText'); + expect(data.response.status).to.equal(500); + expect(data.response.statusText).to.equal('Internal Server Error'); + + expect(dataArg.options).to.have.property('test'); + expect(dataArg.options).to.have.property('silent'); + expect(dataArg.options.test).to.be.true; + expect(dataArg.options.silent).to.be.false; + + var success = afterCallback.args[0][1]; + expect(success).to.be.false; + + done(); + }); + + server.respond(); + }); + + it('must not call event handlers', function(done) { + var value = {id: 3, message: 'Hello World'}; + server.respondWith( + 'PUT', + '/notes/3', + [ + 500, + null, + '' + ] + ); + + var obj = _.extend({}, Backbone.Events); + var beforeCallback = sinon.spy(); + var afterCallback = sinon.spy(); + var note = new FIXTURES.Note(value); + obj.listenTo(note, 'before:save', beforeCallback); + obj.listenTo(note, 'after:save', afterCallback); + + note.save(value, {test: false, silent:true}) + .then(function(data) { + }) + .catch(function(data) { + expect(beforeCallback.called).to.be.false; + expect(afterCallback.called).to.be.false; + done(); + }); + + server.respond(); + }); + + it('must throw error', function(done) { + var value = {id: 4, message: 'Hello World'}; + server.respondWith( + 'PUT', + '/notes/4', + [ + 200, + {"Content-Type": "application/json"}, + JSON.stringify(value) + ] + ); + + var note = new FIXTURES.Note(value); + note.save() + .then(function(data) { + throw new Error(); + }) + .catch(function(err) { + expect(_.isError(err)).to.be.true; + done(); + }); + + server.respond(); + }); + }); + + describe('Delete tests', function() { + + }); + + describe('Delete fail tests', function() { + }); }); \ No newline at end of file