summaryrefslogtreecommitdiff
path: root/web-ui/test/spec/helpers/monitored_ajax_call.spec.js
blob: 972ca3ae48e5545e9acc4c5160d8fb7984c2a47f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
define(['helpers/monitored_ajax'], function (monitoredAjax) {
  'use strict';
  describe('monitoredAjaxCall', function () {
    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 });
        });
      });

      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' });
      });
    });

    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);
      });

    });
  });
});