define(['helpers/monitored_ajax'], function (monitoredAjax) {
  'use strict';
  describe('monitoredAjaxCall', function () {

    describe('default configs', function () {

     it('should always attach the xsrf token in the header', function () {
       var component = { trigger: function () {}};
       var d = $.Deferred();
       spyOn($, 'ajax').and.returnValue(d);
       document.cookie = 'XSRF-TOKEN=ff895ffc45a4ce140bfc5dda6c61d232; i18next=en-us';
       var anyUrl = '/';

       monitoredAjax(component, anyUrl, {});

       expect($.ajax.calls.mostRecent().args[1].headers).toEqual({ 'X-XSRF-TOKEN' : 'ff895ffc45a4ce140bfc5dda6c61d232' });

     });

     });

    describe('when dealing with errors', function () {

      _.each(
        {
         timeout: 'A timeout occurred',
         error: 'Problems talking to server',
         parseerror: 'Got invalid response from server'
        }, function (errorMessage, errorType) {
        it('shows message for a server ' + errorType, function () {
          var component = { trigger: function () {}};
          spyOn(component, 'trigger');
          var d = $.Deferred();
          spyOn($, 'ajax').and.returnValue(d);

          monitoredAjax(component, '/', {});
          d.reject({ responseJSON: {}}, errorType, '');

          expect(component.trigger).toHaveBeenCalledWith(document, Pixelated.events.ui.userAlerts.displayMessage,
              { message: errorMessage, class: 'error' });
        });
      });

      it('shows the error message sent by the server if it exists', function () {
        var component = { trigger: function () {}};
        spyOn(component, 'trigger');
        var d = $.Deferred();
        spyOn($, 'ajax').and.returnValue(d);

        monitoredAjax(component, '/', {});
        d.reject({ responseJSON: { message: 'Server Message'}}, 'error', '');

        expect(component.trigger).toHaveBeenCalledWith(document, Pixelated.events.ui.userAlerts.displayMessage,
            { message: 'Server Message', class: 'error' });
      });
    });

    describe('when user seems to be logged out', function () {
      var component, browser;

      beforeEach(function () {
        component = { trigger: function () {}};
        browser = require('helpers/browser');

      });

      it('will redirect the browser to the location specified', function () {
        var redirectUrl = '/some/redirect/url';
        var deferred = $.Deferred();
        spyOn($, 'ajax').and.returnValue(deferred);
        var spyRedirect = spyOn(browser, 'redirect').and.returnValue($.Deferred());

        monitoredAjax(component, '/some/url', {});

        deferred.reject({status: 302, getResponseHeader: function (_) {return redirectUrl;}}, '', '');

        expect(spyRedirect).toHaveBeenCalled();
        expect(spyRedirect.calls.mostRecent().args[0]).toEqual(redirectUrl);
      });

      it ('will redirect the browser to root if authentication is required', function () {
        var redirectUrl = '/';
        var deferred = $.Deferred();
        spyOn($, 'ajax').and.returnValue(deferred);
        var spyRedirect = spyOn(browser, 'redirect').and.returnValue($.Deferred());

        monitoredAjax(component, '/some/url', {});

        deferred.reject({status: 401}, '', '');

        expect(spyRedirect).toHaveBeenCalled();
        expect(spyRedirect.calls.mostRecent().args[0]).toEqual(redirectUrl);
      });

    });
  });
});