collapsed_sidebar_todo_spec.js 4.7 KB
Newer Older
1 2
/* eslint-disable no-new */
import _ from 'underscore';
3 4
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
5
import Sidebar from '~/right_sidebar';
6
import timeoutPromise from './helpers/set_timeout_promise_helper';
7 8 9 10

describe('Issuable right sidebar collapsed todo toggle', () => {
  const fixtureName = 'issues/open-issue.html.raw';
  const jsonFixtureName = 'todos/todos.json';
11
  let mock;
12 13 14 15 16 17 18 19 20

  preloadFixtures(fixtureName);
  preloadFixtures(jsonFixtureName);

  beforeEach(() => {
    const todoData = getJSONFixture(jsonFixtureName);
    new Sidebar();
    loadFixtures(fixtureName);

Mike Greiling's avatar
Mike Greiling committed
21 22
    document.querySelector('.js-right-sidebar').classList.toggle('right-sidebar-expanded');
    document.querySelector('.js-right-sidebar').classList.toggle('right-sidebar-collapsed');
23

24 25 26
    mock = new MockAdapter(axios);

    mock.onPost(`${gl.TEST_HOST}/frontend-fixtures/issues-project/todos`).reply(() => {
27 28
      const response = _.clone(todoData);

29 30
      return [200, response];
    });
31

32 33 34 35 36
    mock.onDelete(/(.*)\/dashboard\/todos\/\d+$/).reply(() => {
      const response = _.clone(todoData);
      delete response.delete_path;

      return [200, response];
37 38 39
    });
  });

40 41 42 43
  afterEach(() => {
    mock.restore();
  });

44
  it('shows add todo button', () => {
Mike Greiling's avatar
Mike Greiling committed
45
    expect(document.querySelector('.js-issuable-todo.sidebar-collapsed-icon')).not.toBeNull();
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

    expect(
      document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .fa-plus-square'),
    ).not.toBeNull();

    expect(
      document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
    ).toBeNull();
  });

  it('sets default tooltip title', () => {
    expect(
      document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').getAttribute('title'),
    ).toBe('Add todo');
  });

Mike Greiling's avatar
Mike Greiling committed
62
  it('toggle todo state', done => {
63 64
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();

65 66 67 68
    setTimeout(() => {
      expect(
        document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
      ).not.toBeNull();
69

70 71 72
      expect(
        document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .fa-check-square'),
      ).not.toBeNull();
73

74 75
      done();
    });
76 77
  });

Mike Greiling's avatar
Mike Greiling committed
78
  it('toggle todo state of expanded todo toggle', done => {
79 80
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();

81 82 83
    setTimeout(() => {
      expect(
        document.querySelector('.issuable-sidebar-header .js-issuable-todo').textContent.trim(),
84
      ).toBe('Mark todo as done');
85

86 87 88
      done();
    });
  });
89

Mike Greiling's avatar
Mike Greiling committed
90
  it('toggles todo button tooltip', done => {
91 92
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();

93 94
    setTimeout(() => {
      expect(
Mike Greiling's avatar
Mike Greiling committed
95 96 97
        document
          .querySelector('.js-issuable-todo.sidebar-collapsed-icon')
          .getAttribute('data-original-title'),
98
      ).toBe('Mark todo as done');
99

100 101
      done();
    });
102 103
  });

Mike Greiling's avatar
Mike Greiling committed
104
  it('marks todo as done', done => {
105 106
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();

107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
    timeoutPromise()
      .then(() => {
        expect(
          document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
        ).not.toBeNull();

        document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
      })
      .then(timeoutPromise)
      .then(() => {
        expect(
          document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
        ).toBeNull();

        expect(
          document.querySelector('.issuable-sidebar-header .js-issuable-todo').textContent.trim(),
        ).toBe('Add todo');
      })
      .then(done)
      .catch(done.fail);
127 128
  });

Mike Greiling's avatar
Mike Greiling committed
129
  it('updates aria-label to mark todo as done', done => {
130 131
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();

132 133
    setTimeout(() => {
      expect(
Mike Greiling's avatar
Mike Greiling committed
134 135 136
        document
          .querySelector('.js-issuable-todo.sidebar-collapsed-icon')
          .getAttribute('aria-label'),
137
      ).toBe('Mark todo as done');
138

139 140 141 142
      done();
    });
  });

Mike Greiling's avatar
Mike Greiling committed
143
  it('updates aria-label to add todo', done => {
144 145
    document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();

146 147 148
    timeoutPromise()
      .then(() => {
        expect(
Mike Greiling's avatar
Mike Greiling committed
149 150 151
          document
            .querySelector('.js-issuable-todo.sidebar-collapsed-icon')
            .getAttribute('aria-label'),
152
        ).toBe('Mark todo as done');
153 154 155 156 157 158

        document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
      })
      .then(timeoutPromise)
      .then(() => {
        expect(
Mike Greiling's avatar
Mike Greiling committed
159 160 161
          document
            .querySelector('.js-issuable-todo.sidebar-collapsed-icon')
            .getAttribute('aria-label'),
162 163 164 165
        ).toBe('Add todo');
      })
      .then(done)
      .catch(done.fail);
166 167
  });
});