summaryrefslogtreecommitdiff
path: root/spec/javascripts/right_sidebar_spec.js
blob: 936e8f16c52f8eb6f6d7f296bb14a0b92f4ef3b1 (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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/* eslint-disable no-var, one-var, no-return-assign, vars-on-top, jasmine/no-unsafe-spy */

import $ from 'jquery';
import MockAdapter from 'axios-mock-adapter';
import '~/commons/bootstrap';
import axios from '~/lib/utils/axios_utils';
import Sidebar from '~/right_sidebar';

(function() {
  var $aside, $icon, $labelsIcon, $page, $toggle, assertSidebarState;

  $aside = null;

  $toggle = null;

  $icon = null;

  $page = null;

  $labelsIcon = null;

  assertSidebarState = function(state) {
    var shouldBeCollapsed, shouldBeExpanded;
    shouldBeExpanded = state === 'expanded';
    shouldBeCollapsed = state === 'collapsed';
    expect($aside.hasClass('right-sidebar-expanded')).toBe(shouldBeExpanded);
    expect($page.hasClass('right-sidebar-expanded')).toBe(shouldBeExpanded);
    expect($icon.hasClass('fa-angle-double-right')).toBe(shouldBeExpanded);
    expect($aside.hasClass('right-sidebar-collapsed')).toBe(shouldBeCollapsed);
    expect($page.hasClass('right-sidebar-collapsed')).toBe(shouldBeCollapsed);
    return expect($icon.hasClass('fa-angle-double-left')).toBe(shouldBeCollapsed);
  };

  describe('RightSidebar', function() {
    describe('fixture tests', () => {
      var fixtureName = 'issues/open-issue.html.raw';
      preloadFixtures(fixtureName);
      loadJSONFixtures('todos/todos.json');
      let mock;

      beforeEach(function() {
        loadFixtures(fixtureName);
        mock = new MockAdapter(axios);
        new Sidebar(); // eslint-disable-line no-new
        $aside = $('.right-sidebar');
        $page = $('.layout-page');
        $icon = $aside.find('i');
        $toggle = $aside.find('.js-sidebar-toggle');
        return $labelsIcon = $aside.find('.sidebar-collapsed-icon');
      });

      afterEach(() => {
        mock.restore();
      });

      it('should expand/collapse the sidebar when arrow is clicked', function() {
        assertSidebarState('expanded');
        $toggle.click();
        assertSidebarState('collapsed');
        $toggle.click();
        assertSidebarState('expanded');
      });

      it('should float over the page and when sidebar icons clicked', function() {
        $labelsIcon.click();
        return assertSidebarState('expanded');
      });

      it('should collapse when the icon arrow clicked while it is floating on page', function() {
        $labelsIcon.click();
        assertSidebarState('expanded');
        $toggle.click();
        return assertSidebarState('collapsed');
      });

      it('should broadcast todo:toggle event when add todo clicked', function(done) {
        var todos = getJSONFixture('todos/todos.json');
        mock.onPost(/(.*)\/todos$/).reply(200, todos);

        var todoToggleSpy = spyOnEvent(document, 'todo:toggle');

        $('.issuable-sidebar-header .js-issuable-todo').click();

        setTimeout(() => {
          expect(todoToggleSpy.calls.count()).toEqual(1);

          done();
        });
      });

      it('should not hide collapsed icons', () => {
        [].forEach.call(document.querySelectorAll('.sidebar-collapsed-icon'), (el) => {
          expect(el.querySelector('.fa, svg').classList.contains('hidden')).toBeFalsy();
        });
      });
    });

    describe('sidebarToggleClicked', () => {
      const event = jasmine.createSpyObj('event', ['preventDefault']);

      beforeEach(() => {
        spyOn($.fn, 'hasClass').and.returnValue(false);
      });

      afterEach(() => {
        gl.lazyLoader = undefined;
      });

      it('calls loadCheck if lazyLoader is set', () => {
        gl.lazyLoader = jasmine.createSpyObj('lazyLoader', ['loadCheck']);

        Sidebar.prototype.sidebarToggleClicked(event);

        expect(gl.lazyLoader.loadCheck).toHaveBeenCalled();
      });

      it('does not throw if lazyLoader is not defined', () => {
        gl.lazyLoader = undefined;

        const toggle = Sidebar.prototype.sidebarToggleClicked.bind(null, event);

        expect(toggle).not.toThrow();
      });
    });
  });
}).call(window);