aboutsummaryrefslogblamecommitdiffstats
path: root/test/webcals/xhr_test.js
blob: 33f692d3c0f56f84a07f11fe9be139771624ab2c (plain) (tree)



























































                                                              



                                        

































                                                               

       
                                                                    


























                                                                   









                 
requireLib('xhr');
requireSupport('fake_xhr');

suite('webacls/xhr', function() {
  var subject,
      Xhr,
      FakeXhr;


  suiteSetup(function() {
    Xhr = Webcals.require('xhr');
    FakeXhr = Webcals.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('.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 = '<html></html>',
        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;
    });

    suite('when xhr is a success and responds /w data', function() {
      var response = '<html></html>', 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();
    });

  });

});