testSupport.lib('xhr'); testSupport.helper('fake_xhr'); suite('webacls/xhr', function() { var subject, Xhr, FakeXhr; suiteSetup(function() { Xhr = Caldav.require('xhr'); FakeXhr = Caldav.require('support/fake_xhr'); }); setup(function() { subject = new Xhr({ method: 'POST' }); }); suite('initialization', function() { test('should set options on instance', function() { assert.equal(subject.method, 'POST'); }); suite('with global args', function() { var old; var opts = { system: true }; setup(function() { var old = Xhr.prototype.globalXhrOptions; Xhr.prototype.globalXhrOptions = opts; }); teardown(function() { Xhr.prototype.globalXhrOptions = old; }); test('constructed xhr', function() { var subject = new Xhr({ method: 'POST', xhrClass: FakeXhr }); subject.send(function() {}); assert.ok(subject.xhr); assert.equal(subject.xhr.constructorArgs[0], opts); }); }); }); test('#_credentials', function() { // don't run this in node if (typeof(window) === 'undefined') { return; } var user = 'james'; var password = 'lal'; var expected = 'Basic ' + window.btoa(user + ':' + password); assert.equal( subject._credentials(user, password), expected ); }); suite('.abort', function() { suite('when there is an xhr object', function() { var aborted; setup(function() { aborted = false; subject.xhr = { abort: function() { aborted = true; } }; subject.abort(); }); test('should call abort on the xhr object', function() { assert.equal(aborted, true); }); }); suite('when there is no xhr object', function() { test('should not fail', function() { subject.xhr = null; subject.abort(); }); }); }); suite('.send', function() { var data = '', url = 'http://foo', xhr, responseXhr; function callback(done, data, xhr) { responseXhr = xhr; done(); } function request(options) { options.xhrClass = FakeXhr; subject = new Xhr(options); } function opensXHR() { test('should create xhr', function() { assert.instanceOf(subject.xhr, FakeXhr); }); test('should set headers', function() { assert.deepEqual(subject.xhr.headers, subject.headers); }); test('should parse and send data', function() { assert.deepEqual(subject.xhr.sendArgs[0], data); }); test('should open xhr', function() { assert.deepEqual(subject.xhr.openArgs, [ subject.method, subject.url, subject.async, subject.user, subject.password ]); }); } setup(function() { responseXhr = null; }); test('with mozSystem', function() { if (typeof(window) === 'undefined') return; var user = 'user'; var password = 'pass'; var url = '/foo'; request({ globalXhrOptions: { mozSystem: true }, user: user, password: password, method: 'GET', url: url }); subject.send(function() {}); var args = subject.xhr.openArgs; assert.deepEqual( args, ['GET', url, true] ); assert.equal( subject.xhr.headers['Authorization'], subject._credentials(user, password) ); }); suite('when xhr is a success and responds /w data', function() { var response = '', cb; setup(function(done) { var xhr; request({ data: data, url: url, method: 'PUT' }); cb = callback.bind(this, done); subject.send(cb); //should be waiting inbetween requests assert.equal(subject.waiting, true); xhr = subject.xhr; xhr.readyState = 4; xhr.responseText = response; xhr.onreadystatechange(); }); test('should not be waiting after response', function() { assert.equal(subject.waiting, false); }); test('should send callback parsed data and xhr', function() { assert.equal(responseXhr, subject.xhr); }); opensXHR(); }); }); });