(function() { // lazy defined navigator causes global leak warnings... var requireBak; var specialRequires = { 'chai': requireChai }; testSupport = { isNode: (typeof(window) === 'undefined') }; /* stream hack for SAX */ if (!testSupport.isNode) { window.navigator; requireBak = require; require = function require_shim(type) { if (type === 'stream') { throw new Error('this is not node'); } requireBak.apply(this, arguments); }; } /* cross require */ testSupport.require = function cross_require(file, callback) { if (file in specialRequires) { return specialRequires[file](file, callback); } if (!(/\.js$/.test(file))) { file += '.js'; } if (typeof(window) === 'undefined') { var lib = require(__dirname + '/../' + file); if (typeof(callback) !== 'undefined') { callback(lib); } } else { window.require(file, callback); } }; /* sinon */ if (testSupport.isNode) { global.sinon = require('sinon'); } else { window.require('/node_modules/sinon/pkg/sinon.js'); } setup(function() { this.sinon = sinon.sandbox.create(); }); teardown(function() { this.sinon.restore(); }); /* chai */ function setupChai(chai) { chai.Assertion.includeStack = true; assert = chai.assert; } function requireChai(file, callback) { var path; if (testSupport.isNode) { setupChai(require('chai')); } else { require('/node_modules/chai/chai.js', function() { setupChai(chai); }); } } testSupport.require('chai'); if (!testSupport.isNode) { testSupport.require('/vendor/sax'); } testSupport.loadSample = function(file, cb) { if (testSupport.isNode) { var root = __dirname + '/../samples/'; require('fs').readFile(root + file, 'utf8', function(err, contents) { cb(err, contents); }); } else { var xhr = new XMLHttpRequest(); xhr.open('GET', '/samples/' + file, true); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status !== 200) { cb(new Error('file not found or other error', xhr)); } else { cb(null, xhr.responseText); } } }; xhr.send(null); } }; testSupport.defineSample = function(file, cb) { suiteSetup(function(done) { testSupport.loadSample(file, function(err, data) { if (err) { done(err); } cb(data); done(); }); }); }; testSupport.mock = { useFakeXHR: function() { testSupport.helper('fake_xhr'); testSupport.lib('xhr'); var realXHR; var XHR; var FakeXhr; suiteSetup(function() { XHR = Caldav.require('xhr'); FakeXhr = Caldav.require('support/fake_xhr'); realXHR = XHR.prototype.xhrClass; XHR.prototype.xhrClass = FakeXhr; }); suiteTeardown(function() { XHR.prototype.xhrClass = realXHR; }); }, /** * Mocks out a method * * var called = testSupport.mock.method(subject, 'myMethod'); * * subject.myMethod('foo', 'bar'); * * called.args[0] === 'foo'; // true * called.args[1] === 'bar'; // true * * * @return {Object} reference object. */ method: function(obj, method, times) { var calledWith = {}; var calls = 0; if (typeof(times) === 'undefined') { times = 1; } obj[method] = function() { if (calls.length > times) { throw new Error( method + ' called more then ' + times + 'time(s)' ); } calledWith.args = arguments; calls++; }; return calledWith; } }; testSupport.lib = function(lib, callback) { testSupport.require('/lib/caldav/' + lib, callback); }; testSupport.helper = function(lib) { testSupport.require('/test/support/' + lib); }; Caldav = require('../lib/caldav/caldav.js'); if (typeof(window) === 'undefined') { //in node we need to hack Caldav to do the right thing. var oldRequire = Caldav.require; Caldav.require = function exportRequireDev(path) { if (path.indexOf('support') === 0) { path = __dirname + '/' + path; return require(path); } return oldRequire(path); }; } /* since we have global mocks easier to just include these globally */ requireRequest = function(callback) { testSupport.helper('fake_xhr'); testSupport.lib('responder'); testSupport.lib('errors'); testSupport.lib('xhr'); testSupport.lib('oauth2'); testSupport.lib('http/basic_auth'); testSupport.lib('http/oauth2'); testSupport.lib('connection'); testSupport.lib('sax'); testSupport.lib('sax/base'); testSupport.lib('sax/dav_response'); testSupport.lib('request/abstract'); testSupport.lib('template'); testSupport.lib('request/propfind'); //in the future we need a callback for browser support. if (typeof(callback) !== 'undefined') { callback(); } }; }());