issue_spec.js 4.7 KB
Newer Older
1
/* eslint-disable space-before-function-paren, no-var, one-var, one-var-declaration-per-line, no-use-before-define, comma-dangle, max-len */
2
/* global Issue */
F
Fatih Acet 已提交
3 4 5 6 7

/*= require lib/utils/text_utility */
/*= require issue */

(function() {
W
winniehell 已提交
8 9 10
  var INVALID_URL = 'http://goesnowhere.nothing/whereami';
  var $boxClosed, $boxOpen, $btnClose, $btnReopen;

11 12 13
  preloadFixtures('issues/closed-issue.html.raw');
  preloadFixtures('issues/issue-with-task-list.html.raw');
  preloadFixtures('issues/open-issue.html.raw');
14

W
winniehell 已提交
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
  function expectErrorMessage() {
    var $flashMessage = $('div.flash-alert');
    expect($flashMessage).toExist();
    expect($flashMessage).toBeVisible();
    expect($flashMessage).toHaveText('Unable to update this issue at this time.');
  }

  function expectIssueState(isIssueOpen) {
    expectVisibility($boxClosed, !isIssueOpen);
    expectVisibility($boxOpen, isIssueOpen);

    expectVisibility($btnClose, isIssueOpen);
    expectVisibility($btnReopen, !isIssueOpen);
  }

  function expectPendingRequest(req, $triggeredButton) {
    expect(req.type).toBe('PUT');
    expect(req.url).toBe($triggeredButton.attr('href'));
    expect($triggeredButton).toHaveProp('disabled', true);
  }

  function expectVisibility($element, shouldBeVisible) {
    if (shouldBeVisible) {
      expect($element).not.toHaveClass('hidden');
    } else {
      expect($element).toHaveClass('hidden');
    }
  }

  function findElements() {
45 46 47
    $boxClosed = $('div.status-box-closed');
    expect($boxClosed).toExist();
    expect($boxClosed).toHaveText('Closed');
W
winniehell 已提交
48

49 50 51
    $boxOpen = $('div.status-box-open');
    expect($boxOpen).toExist();
    expect($boxOpen).toHaveText('Open');
W
winniehell 已提交
52

53 54 55
    $btnClose = $('.btn-close.btn-grouped');
    expect($btnClose).toExist();
    expect($btnClose).toHaveText('Close issue');
W
winniehell 已提交
56

57 58 59
    $btnReopen = $('.btn-reopen.btn-grouped');
    expect($btnReopen).toExist();
    expect($btnReopen).toHaveText('Reopen issue');
W
winniehell 已提交
60 61
  }

F
Fatih Acet 已提交
62
  describe('Issue', function() {
63
    describe('task lists', function() {
F
Fatih Acet 已提交
64
      beforeEach(function() {
65
        loadFixtures('issues/issue-with-task-list.html.raw');
66
        this.issue = new Issue();
F
Fatih Acet 已提交
67
      });
68

F
Fatih Acet 已提交
69 70 71
      it('modifies the Markdown field', function() {
        spyOn(jQuery, 'ajax').and.stub();
        $('input[type=checkbox]').attr('checked', true).trigger('change');
72
        expect($('.js-task-list-field').val()).toBe('- [x] Task List Item');
F
Fatih Acet 已提交
73
      });
74

75
      it('submits an ajax request on tasklist:changed', function() {
F
Fatih Acet 已提交
76 77
        spyOn(jQuery, 'ajax').and.callFake(function(req) {
          expect(req.type).toBe('PATCH');
78
          expect(req.url).toBe(gl.TEST_HOST + '/frontend-fixtures/issues-project/issues/1.json'); // eslint-disable-line prefer-template
79
          expect(req.data.issue.description).not.toBe(null);
F
Fatih Acet 已提交
80
        });
81 82

        $('.js-task-list-field').trigger('tasklist:changed');
F
Fatih Acet 已提交
83 84 85 86
      });
    });
  });

W
winniehell 已提交
87
  describe('close issue', function() {
F
Fatih Acet 已提交
88
    beforeEach(function() {
89
      loadFixtures('issues/open-issue.html.raw');
W
winniehell 已提交
90 91 92 93
      findElements();
      this.issue = new Issue();

      expectIssueState(true);
F
Fatih Acet 已提交
94
    });
W
winniehell 已提交
95

F
Fatih Acet 已提交
96 97
    it('closes an issue', function() {
      spyOn(jQuery, 'ajax').and.callFake(function(req) {
W
winniehell 已提交
98 99
        expectPendingRequest(req, $btnClose);
        req.success({
F
Fatih Acet 已提交
100 101 102
          id: 34
        });
      });
W
winniehell 已提交
103

F
Fatih Acet 已提交
104
      $btnClose.trigger('click');
W
winniehell 已提交
105 106 107

      expectIssueState(false);
      expect($btnClose).toHaveProp('disabled', false);
F
Fatih Acet 已提交
108
    });
W
winniehell 已提交
109

F
Fatih Acet 已提交
110 111
    it('fails to close an issue with success:false', function() {
      spyOn(jQuery, 'ajax').and.callFake(function(req) {
W
winniehell 已提交
112 113
        expectPendingRequest(req, $btnClose);
        req.success({
F
Fatih Acet 已提交
114 115 116
          saved: false
        });
      });
W
winniehell 已提交
117 118

      $btnClose.attr('href', INVALID_URL);
F
Fatih Acet 已提交
119
      $btnClose.trigger('click');
W
winniehell 已提交
120 121 122 123

      expectIssueState(true);
      expect($btnClose).toHaveProp('disabled', false);
      expectErrorMessage();
F
Fatih Acet 已提交
124
    });
W
winniehell 已提交
125

F
Fatih Acet 已提交
126 127
    it('fails to closes an issue with HTTP error', function() {
      spyOn(jQuery, 'ajax').and.callFake(function(req) {
W
winniehell 已提交
128 129
        expectPendingRequest(req, $btnClose);
        req.error();
F
Fatih Acet 已提交
130
      });
W
winniehell 已提交
131 132

      $btnClose.attr('href', INVALID_URL);
F
Fatih Acet 已提交
133
      $btnClose.trigger('click');
W
winniehell 已提交
134 135 136 137 138 139 140 141 142

      expectIssueState(true);
      expect($btnClose).toHaveProp('disabled', true);
      expectErrorMessage();
    });
  });

  describe('reopen issue', function() {
    beforeEach(function() {
143
      loadFixtures('issues/closed-issue.html.raw');
W
winniehell 已提交
144 145 146
      findElements();
      this.issue = new Issue();

147
      expectIssueState(false);
F
Fatih Acet 已提交
148
    });
W
winniehell 已提交
149 150

    it('reopens an issue', function() {
F
Fatih Acet 已提交
151
      spyOn(jQuery, 'ajax').and.callFake(function(req) {
W
winniehell 已提交
152 153
        expectPendingRequest(req, $btnReopen);
        req.success({
F
Fatih Acet 已提交
154 155 156
          id: 34
        });
      });
W
winniehell 已提交
157

F
Fatih Acet 已提交
158
      $btnReopen.trigger('click');
W
winniehell 已提交
159 160 161

      expectIssueState(true);
      expect($btnReopen).toHaveProp('disabled', false);
F
Fatih Acet 已提交
162 163 164
    });
  });
}).call(this);