From dff7d2420f44ff09535efcf232324f9dab4ab29c Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 14 Nov 2014 10:15:29 +0100 Subject: [PATCH 1/2] Run tests with node too --- .travis.yml | 7 ++++++- Makefile | 7 ++++++- package.json | 2 +- test/init.js | 1 + 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index d2f3209..70a211f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,6 @@ -language: node_js \ No newline at end of file +language: node_js +env: + - TEST_ENV=node + - TEST_ENV=browser +script: + make test-$TEST_ENV diff --git a/Makefile b/Makefile index 50574d7..fc3f141 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,12 @@ dist: deploy: npm run deploy -test: install dist +test: test-node test-browser + +test-node: install + @./node_modules/mocha/bin/mocha --require test/init.js test/test.*.js + +test-browser: install dist @./node_modules/mocha-phantomjs/bin/mocha-phantomjs test/index.html clean: diff --git a/package.json b/package.json index b5d7dd4..e64ecc0 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "mocha": "1.21.*", "chai": "1.9.*", - "sinon": "1.10.*", + "sinon": "1.11.*", "mocha-phantomjs": "3.5.*" } } diff --git a/test/init.js b/test/init.js index ffae2f8..6e68b99 100644 --- a/test/init.js +++ b/test/init.js @@ -6,5 +6,6 @@ if (isBrowser) { else { assert = require('chai').assert; sinon = require('sinon'); + require("sinon/lib/sinon/util/fake_xml_http_request"); Daybed = require('..'); } From 0f8f9c0d1c1cc514a0161531b8a0164813bf18ec Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 14 Nov 2014 10:22:39 +0100 Subject: [PATCH 2/2] Node xmlhttprequest expects protocol --- test/test.gettoken.js | 12 ++++---- test/test.hello.js | 12 ++++---- test/test.model.js | 10 +++---- test/test.session.js | 70 +++++++++++++++++++++---------------------- test/test.sync.js | 24 +++++++-------- 5 files changed, 64 insertions(+), 64 deletions(-) diff --git a/test/test.gettoken.js b/test/test.gettoken.js index 6ab35bf..21ab051 100644 --- a/test/test.gettoken.js +++ b/test/test.gettoken.js @@ -20,18 +20,18 @@ describe('Daybed.getToken', function() { }); it("should requests a new one if no credentials are specified", function(done) { - server.respondWith("POST", "/v1/tokens", '{ "credentials": { "id": 3.14 } }'); + server.respondWith("POST", "http://server/v1/tokens", '{ "credentials": { "id": 3.14 } }'); - Daybed.getToken('').then(function (data) { + Daybed.getToken('http://server').then(function (data) { assert.equal(data.credentials.id, 3.14); done(); }); }); it("should requests a new one if credentials are incomplete", function(done) { - server.respondWith("POST", "/v1/tokens", '{ "credentials": { "id": 3.14 } }'); + server.respondWith("POST", "http://server/v1/tokens", '{ "credentials": { "id": 3.14 } }'); - Daybed.getToken('', {credentials: {id: 1}}) + Daybed.getToken('http://server', {credentials: {id: 1}}) .then(function (data) { assert.equal(data.credentials.id, 3.14); done(); @@ -42,9 +42,9 @@ describe('Daybed.getToken', function() { describe('Validation', function() { it("should validate credentials on server if specified correctly", function(done) { - server.respondWith("GET", "/v1/token", '{ "credentials": { "id": 3.14 } }'); + server.respondWith("GET", "http://server/v1/token", '{ "credentials": { "id": 3.14 } }'); - Daybed.getToken('', {credentials: {id: 'abc', key: 'xyz'}}) + Daybed.getToken('http://server', {credentials: {id: 'abc', key: 'xyz'}}) .then(function (data) { assert.equal(data.credentials.id, 3.14); done(); diff --git a/test/test.hello.js b/test/test.hello.js index 08af856..5d133ee 100644 --- a/test/test.hello.js +++ b/test/test.hello.js @@ -14,21 +14,21 @@ describe('Hello page', function() { }); it("should fetch hello from server", function (done) { - server.respondWith("GET", "/v1/", '{ "version": 1.0 }'); + server.respondWith("GET", "http://server/v1/", '{ "version": 1.0 }'); - Daybed.hello('').then(function (data) { + Daybed.hello('http://server').then(function (data) { assert.equal(data.version, 1.0); done(); }); }); it("should survive server errors", function (done) { - server.respondWith("GET", "/v1/", [500, '', '{ "message": "Server down" }']); + server.respondWith("GET", "http://server/v1/", [500, '', '{ "message": "Server down" }']); sandbox.stub(console, 'warn'); sandbox.stub(console, 'error'); - Daybed.hello('').catch(function (error) { + Daybed.hello('http://server').catch(function (error) { assert.equal(error.name, "DaybedError"); assert.equal(error.status, 500); assert.equal(error.message, 'Internal Server Error'); @@ -39,12 +39,12 @@ describe('Hello page', function() { }); it("should survive client-side errors", function (done) { - server.respondWith("GET", "/v1/", '{ "hello": "Daybed" }'); + server.respondWith("GET", "http://server/v1/", '{ "hello": "Daybed" }'); var failing = sandbox.stub(XMLHttpRequest.prototype, 'setRequestHeader'); failing.throws(); - Daybed.hello('').catch(function (error) { + Daybed.hello('http://server').catch(function (error) { assert.equal(error.name, 'Error'); assert.equal(error.message, 'Error'); assert.isUndefined(error.status, 500); diff --git a/test/test.model.js b/test/test.model.js index e70f91f..5a695ca 100644 --- a/test/test.model.js +++ b/test/test.model.js @@ -12,10 +12,10 @@ describe('Daybed.Model', function() { }); it("should fetch definition and records from server", function (done) { - server.respondWith("GET", "/v1/token", '{ "credentials": { "id": "abc", "key": "xyz" } }'); - server.respondWith("GET", "/v1/models/test", '{ "id": "test", "records": [{"status": "done"}], "definition": {"fields": "fff"}}'); + server.respondWith("GET", "http://server/v1/token", '{ "credentials": { "id": "abc", "key": "xyz" } }'); + server.respondWith("GET", "http://server/v1/models/test", '{ "id": "test", "records": [{"status": "done"}], "definition": {"fields": "fff"}}'); - Daybed.startSession('', {token: "abc"}).then(function (session) { + Daybed.startSession('http://server', {token: "abc"}).then(function (session) { var model = new Daybed.Model({session: session, id: "test"}); model.load() .then(function () { @@ -27,9 +27,9 @@ describe('Daybed.Model', function() { }); it("can be defined from scratch and bound to session", function (done) { - server.respondWith("PUT", "/v1/models/pouet", '{"id": "pouet"}'); + server.respondWith("PUT", "http://server/v1/models/pouet", '{"id": "pouet"}'); - var session = new Daybed.Session(''); + var session = new Daybed.Session('http://server'); var model = new Daybed.Model(); model.save({id: 'pouet', session: session}) .then(function () { diff --git a/test/test.session.js b/test/test.session.js index 15a2fff..10ebafd 100644 --- a/test/test.session.js +++ b/test/test.session.js @@ -12,9 +12,9 @@ describe('Daybed.startSession', function() { }); it("should create a new token if no credentials", function (done) { - server.respondWith("POST", "/v1/tokens", '{ "credentials": { "id": 3.14, "key": "abc" } }'); + server.respondWith("POST", "http://server/v1/tokens", '{ "credentials": { "id": 3.14, "key": "abc" } }'); - Daybed.startSession('').then(function (session) { + Daybed.startSession('http://server').then(function (session) { assert.equal(session.credentials.id, 3.14); done(); }); @@ -22,16 +22,16 @@ describe('Daybed.startSession', function() { it("should not create a new token if anonymous session", function (done) { - Daybed.startSession('', {anonymous: true}).then(function (session) { + Daybed.startSession('http://server', {anonymous: true}).then(function (session) { assert.equal(session.credentials, undefined); done(); }); }); it("should validate credentials if specified", function (done) { - server.respondWith("GET", "/v1/token", '{ "credentials": { "id": 3.14, "key": "abc" } }'); + server.respondWith("GET", "http://server/v1/token", '{ "credentials": { "id": 3.14, "key": "abc" } }'); - Daybed.startSession('', { + Daybed.startSession('http://server', { credentials: {id: 'a', key: 'xyz'}, }).then(function (session) { assert.equal(session.credentials.id, '3.14'); @@ -40,9 +40,9 @@ describe('Daybed.startSession', function() { }); it("should derive the token if specified", function (done) { - server.respondWith("GET", "/v1/token", '{ "credentials": { "id": 3.14, "key": "abc" } }'); + server.respondWith("GET", "http://server/v1/token", '{ "credentials": { "id": 3.14, "key": "abc" } }'); - Daybed.startSession('', { + Daybed.startSession('http://server', { token: 'xyz' }).then(function (session) { assert.equal(session.credentials.algorithm, 'sha256'); @@ -51,9 +51,9 @@ describe('Daybed.startSession', function() { }); it("should derive the token if specified as function", function (done) { - server.respondWith("GET", "/v1/token", '{ "credentials": { "id": 3.14, "key": "abc" } }'); + server.respondWith("GET", "http://server/v1/token", '{ "credentials": { "id": 3.14, "key": "abc" } }'); - Daybed.startSession('', { + Daybed.startSession('http://server', { token: function () { return 'xyz'; }, }).then(function (session) { assert.equal(session.credentials.algorithm, 'sha256'); @@ -66,7 +66,7 @@ describe('Daybed.startSession', function() { describe('Daybed.Session', function() { var server; - var session = new Daybed.Session(''); + var session = new Daybed.Session('http://server'); beforeEach(function () { server = sinon.fakeServer.create(); @@ -105,7 +105,7 @@ describe('Daybed.Session', function() { describe('Get models', function() { it("should fetch models from server", function (done) { - server.respondWith("GET", "/v1/models", '{ "models": [{ "title": "a" }] }'); + server.respondWith("GET", "http://server/v1/models", '{ "models": [{ "title": "a" }] }'); session.getModels().then(function (data) { assert.equal(data[0].title, 'a'); @@ -118,9 +118,9 @@ describe('Daybed.Session', function() { describe('Save models', function() { it("should save all specified models", function (done) { - server.respondWith("GET", "/v1/models", '{ "models": [] }'); - server.respondWith("PUT", "/v1/models/app:mod1", '{ "title": "a", "definition": {} }'); - server.respondWith("PUT", "/v1/models/app:mod2", '{ "title": "b", "definition": {} }'); + server.respondWith("GET", "http://server/v1/models", '{ "models": [] }'); + server.respondWith("PUT", "http://server/v1/models/app:mod1", '{ "title": "a", "definition": {} }'); + server.respondWith("PUT", "http://server/v1/models/app:mod2", '{ "title": "b", "definition": {} }'); session.saveModels({'app:mod1': {}, 'app:mod2': {}}) .then(function (responses) { @@ -131,9 +131,9 @@ describe('Daybed.Session', function() { }); it("should save only those missing", function (done) { - server.respondWith("GET", "/v1/models", '{ "models": [ {"id": "app:mod1"} ] }'); - server.respondWith("GET", "/v1/models/app:mod1/definition", '{ "title": "a", "definition": {} }'); - server.respondWith("PUT", "/v1/models/app:mod2", '{ "title": "b", "definition": {} }'); + server.respondWith("GET", "http://server/v1/models", '{ "models": [ {"id": "app:mod1"} ] }'); + server.respondWith("GET", "http://server/v1/models/app:mod1/definition", '{ "title": "a", "definition": {} }'); + server.respondWith("PUT", "http://server/v1/models/app:mod2", '{ "title": "b", "definition": {} }'); session.saveModels({'app:mod1': {}, 'app:mod2': {}}) .then(function (responses) { @@ -148,7 +148,7 @@ describe('Daybed.Session', function() { describe('Load models', function() { it("should fetch single model from server", function (done) { - server.respondWith("GET", "/v1/models/test", '{ "definition": { "title": "Test" } }'); + server.respondWith("GET", "http://server/v1/models/test", '{ "definition": { "title": "Test" } }'); session.loadModel('test').then(function (model) { assert.equal(model.definition().title, 'Test'); @@ -169,7 +169,7 @@ describe('Daybed.Session', function() { }); it("should prefix automatically model ids", function (done) { - server.respondWith("GET", "/v1/models/app:test", '{ "definition": { "title": "Test" } }'); + server.respondWith("GET", "http://server/v1/models/app:test", '{ "definition": { "title": "Test" } }'); session.loadModel('test').then(function (model) { assert.equal(model.definition().title, 'Test'); @@ -178,7 +178,7 @@ describe('Daybed.Session', function() { }); it("should not add prefix if model id is already prefixed", function (done) { - server.respondWith("GET", "/v1/models/app:test", '{ "definition": { "title": "Test" } }'); + server.respondWith("GET", "http://server/v1/models/app:test", '{ "definition": { "title": "Test" } }'); session.loadModel('app:test').then(function (model) { assert.equal(model.definition().title, 'Test'); @@ -194,7 +194,7 @@ describe('Daybed.Session', function() { var example = {"Everyone": ["-ALL"]}; it("should patch existing permissions by default", function (done) { - server.respondWith("PATCH", "/v1/models/app:test/permissions", '{ "userid": ["read_all_records"] }'); + server.respondWith("PATCH", "http://server/v1/models/app:test/permissions", '{ "userid": ["read_all_records"] }'); session.savePermissions('app:test', example) .then(function (permissions) { @@ -204,7 +204,7 @@ describe('Daybed.Session', function() { }); it("should replace permissions if option is specified", function (done) { - server.respondWith("PUT", "/v1/models/app:test/permissions", '{ "userid": ["read_all_records"] }'); + server.respondWith("PUT", "http://server/v1/models/app:test/permissions", '{ "userid": ["read_all_records"] }'); session.savePermissions('app:test', example, {replace: true}) .then(function (permissions) { @@ -217,7 +217,7 @@ describe('Daybed.Session', function() { describe('Get records', function() { it("should return an object with records attribute", function (done) { - server.respondWith("GET", "/v1/models/app:test/records", '{ "records": [ {"id": 1} ] }'); + server.respondWith("GET", "http://server/v1/models/app:test/records", '{ "records": [ {"id": 1} ] }'); session.getRecords('app:test') .then(function (response) { @@ -227,8 +227,8 @@ describe('Daybed.Session', function() { }); it("should accept a list of many models and return all results", function (done) { - server.respondWith("GET", "/v1/models/app:mod1/records", '{ "records": [ {"id": 3} ] }'); - server.respondWith("GET", "/v1/models/app:mod2/records", '{ "records": [ {"id": 4} ] }'); + server.respondWith("GET", "http://server/v1/models/app:mod1/records", '{ "records": [ {"id": 3} ] }'); + server.respondWith("GET", "http://server/v1/models/app:mod2/records", '{ "records": [ {"id": 4} ] }'); session.getRecords(['app:mod1', 'app:mod2']) .then(function (response) { @@ -256,7 +256,7 @@ describe('Daybed.Session', function() { describe('Save records', function() { it("should post if record has no id", function (done) { - server.respondWith("POST", "/v1/models/app:test/records", '{ "id": "abc" }'); + server.respondWith("POST", "http://server/v1/models/app:test/records", '{ "id": "abc" }'); session.saveRecord('app:test', {age: 42}) .then(function (record) { @@ -266,7 +266,7 @@ describe('Daybed.Session', function() { }); it("should patch by default if id is specified", function (done) { - server.respondWith("PATCH", "/v1/models/app:test/records/abc", '{ "id": "abc" }'); + server.respondWith("PATCH", "http://server/v1/models/app:test/records/abc", '{ "id": "abc" }'); session.saveRecord('app:test', {id: 'abc', age: 42}) .then(function (record) { @@ -276,7 +276,7 @@ describe('Daybed.Session', function() { }); it("should replace existing record if replace is specified", function (done) { - server.respondWith("PUT", "/v1/models/app:test/records/abc", '{ "id": "abc" }'); + server.respondWith("PUT", "http://server/v1/models/app:test/records/abc", '{ "id": "abc" }'); session.saveRecord('app:test', {id: 'abc', age: 42}, {replace: true}) .then(function (record) { @@ -286,7 +286,7 @@ describe('Daybed.Session', function() { }); it("should be able to validate only", function (done) { - server.respondWith("POST", "/v1/models/app:test/records", '{ "id": "abc" }'); + server.respondWith("POST", "http://server/v1/models/app:test/records", '{ "id": "abc" }'); session.validateRecord('app:test', {id: 'abc', age: 42}) .then(function (record) { @@ -296,8 +296,8 @@ describe('Daybed.Session', function() { }); it("should be able to save many records", function (done) { - server.respondWith("PATCH", "/v1/models/app:test/records/abc", '{ "id": "abc" }'); - server.respondWith("PATCH", "/v1/models/app:test/records/xyz", '{ "id": "xyz" }'); + server.respondWith("PATCH", "http://server/v1/models/app:test/records/abc", '{ "id": "abc" }'); + server.respondWith("PATCH", "http://server/v1/models/app:test/records/xyz", '{ "id": "xyz" }'); var records = [{id: 'abc', age: 42}, {id: 'xyz', age: 38}]; @@ -317,7 +317,7 @@ describe('Daybed.Session', function() { describe('Delete records', function() { it("should delete single record", function (done) { - server.respondWith("DELETE", "/v1/models/app:test/records/abc", '{ "id": "abc" }'); + server.respondWith("DELETE", "http://server/v1/models/app:test/records/abc", '{ "id": "abc" }'); session.deleteRecord('app:test', 'abc') .then(function (response) { @@ -327,8 +327,8 @@ describe('Daybed.Session', function() { }); it("should delete many records", function (done) { - server.respondWith("DELETE", "/v1/models/app:test/records/abc", '{ "id": "abc" }'); - server.respondWith("DELETE", "/v1/models/app:test/records/xyz", '{ "id": "xyz" }'); + server.respondWith("DELETE", "http://server/v1/models/app:test/records/abc", '{ "id": "abc" }'); + server.respondWith("DELETE", "http://server/v1/models/app:test/records/xyz", '{ "id": "xyz" }'); session.deleteRecords('app:test', ['abc', 'xyz']) .then(function (response) { @@ -341,7 +341,7 @@ describe('Daybed.Session', function() { }); it("should delete all model records", function (done) { - server.respondWith("DELETE", "/v1/models/app:test/records", '{ "records": [] }'); + server.respondWith("DELETE", "http://server/v1/models/app:test/records", '{ "records": [] }'); session.deleteAllRecords('app:test') .then(function (response) { diff --git a/test/test.sync.js b/test/test.sync.js index 43362c7..c49e267 100644 --- a/test/test.sync.js +++ b/test/test.sync.js @@ -1,7 +1,7 @@ describe('Records synchronization', function() { var server; - var session = new Daybed.Session(''); + var session = new Daybed.Session('http://server'); beforeEach(function () { server = sinon.fakeServer.create(); @@ -14,8 +14,8 @@ describe('Records synchronization', function() { it("should push created records", function (done) { - server.respondWith("GET", "/v1/models/app:test/records", '{ "records": [] }'); - server.respondWith("POST", "/v1/models/app:test/records", '{"id": "abc", "age": 42}'); + server.respondWith("GET", "http://server/v1/models/app:test/records", '{ "records": [] }'); + server.respondWith("POST", "http://server/v1/models/app:test/records", '{"id": "abc", "age": 42}'); session.synchronizeRecords('app:test', [ {age: 42} ]) .then(function (result) { @@ -33,8 +33,8 @@ describe('Records synchronization', function() { describe('Mode push (default)', function () { it("should delete missing records", function (done) { - server.respondWith("GET", "/v1/models/app:test/records", '{ "records": [ {"id": "abc", "age": 42} ] }'); - server.respondWith("DELETE", "/v1/models/app:test/records/abc", '{"id": "abc", "age": 42}'); + server.respondWith("GET", "http://server/v1/models/app:test/records", '{ "records": [ {"id": "abc", "age": 42} ] }'); + server.respondWith("DELETE", "http://server/v1/models/app:test/records/abc", '{"id": "abc", "age": 42}'); session.synchronizeRecords('app:test', []) .then(function (result) { @@ -48,8 +48,8 @@ describe('Records synchronization', function() { }); it("should patch only updated records", function (done) { - server.respondWith("GET", "/v1/models/app:test/records", '{ "records": [ {"id": "abc", "age": 0}, {"id": "xyz", "age": 38}] }'); - server.respondWith("PATCH", "/v1/models/app:test/records/abc", '{"id": "abc", "age": 42}'); + server.respondWith("GET", "http://server/v1/models/app:test/records", '{ "records": [ {"id": "abc", "age": 0}, {"id": "xyz", "age": 38}] }'); + server.respondWith("PATCH", "http://server/v1/models/app:test/records/abc", '{"id": "abc", "age": 42}'); session.synchronizeRecords('app:test', [ {id: 'abc', age: 42}, {id: 'xyz', age: 38} ]) .then(function (result) { @@ -75,7 +75,7 @@ describe('Records synchronization', function() { it("should support empty list of records", function (done) { - server.respondWith("GET", "/v1/models/app:test/records", '{ "records": [] }'); + server.respondWith("GET", "http://server/v1/models/app:test/records", '{ "records": [] }'); session.synchronizeRecords('app:test', []) .then(function (result) { @@ -89,10 +89,10 @@ describe('Records synchronization', function() { }); it("should support multiple models", function (done) { - server.respondWith("GET", "/v1/models/app:mod1/records", '{ "records": [] }'); - server.respondWith("GET", "/v1/models/app:mod2/records", '{ "records": [] }'); - server.respondWith("POST", "/v1/models/app:mod1/records", '{"id": "abc", "age": 42}'); - server.respondWith("POST", "/v1/models/app:mod2/records", '{"id": "xyz", "age": 38}'); + server.respondWith("GET", "http://server/v1/models/app:mod1/records", '{ "records": [] }'); + server.respondWith("GET", "http://server/v1/models/app:mod2/records", '{ "records": [] }'); + server.respondWith("POST", "http://server/v1/models/app:mod1/records", '{"id": "abc", "age": 42}'); + server.respondWith("POST", "http://server/v1/models/app:mod2/records", '{"id": "xyz", "age": 38}'); session.synchronizeRecords({ 'app:mod1': [ {age: 42} ],