Welcome to mirror list, hosted at ThFree Co, Russian Federation.

todos_spec.js « index « todos « dashboard « pages « frontend « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 03aed7454e3f0cdcdc96435c1b6c5a9a4daf9503 (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
127
128
import MockAdapter from 'axios-mock-adapter';
import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import waitForPromises from 'helpers/wait_for_promises';
import '~/lib/utils/common_utils';
import axios from '~/lib/utils/axios_utils';
import { addDelimiter } from '~/lib/utils/text_utility';
import { visitUrl } from '~/lib/utils/url_utility';
import Todos from '~/pages/dashboard/todos/index/todos';

jest.mock('~/lib/utils/url_utility', () => ({
  visitUrl: jest.fn().mockName('visitUrl'),
}));

const TEST_COUNT_BIG = 2000;
const TEST_DONE_COUNT_BIG = 7300;

describe('Todos', () => {
  let todoItem;
  let mock;

  beforeEach(() => {
    loadHTMLFixture('todos/todos.html');
    todoItem = document.querySelector('.todos-list .todo');
    mock = new MockAdapter(axios);

    return new Todos();
  });

  afterEach(() => {
    resetHTMLFixture();
  });

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

  describe('goToTodoUrl', () => {
    it('opens the todo url', () => {
      const todoLink = todoItem.dataset.url;

      let expectedUrl = null;
      visitUrl.mockImplementation((url) => {
        expectedUrl = url;
      });

      todoItem.click();

      expect(expectedUrl).toEqual(todoLink);
    });

    describe('meta click', () => {
      let windowOpenSpy;
      let metakeyEvent;

      beforeEach(() => {
        metakeyEvent = new MouseEvent('click', { ctrlKey: true });
        windowOpenSpy = jest.spyOn(window, 'open').mockImplementation(() => {});
      });

      it('opens the todo url in another tab', () => {
        const todoLink = todoItem.dataset.url;

        document.querySelectorAll('.todos-list .todo').forEach((el) => {
          el.dispatchEvent(metakeyEvent);
        });

        expect(visitUrl).not.toHaveBeenCalled();
        expect(windowOpenSpy).toHaveBeenCalledWith(todoLink, '_blank');
      });

      it('run native funcionality when avatar is clicked', () => {
        document.querySelectorAll('.todos-list a').forEach((el) => {
          el.addEventListener('click', (e) => e.preventDefault());
        });
        document.querySelectorAll('.todos-list img').forEach((el) => {
          el.dispatchEvent(metakeyEvent);
        });

        expect(visitUrl).not.toHaveBeenCalled();
        expect(windowOpenSpy).not.toHaveBeenCalled();
      });
    });

    describe('on done todo click', () => {
      let onToggleSpy;

      beforeEach(() => {
        const el = document.querySelector('.js-done-todo');
        const path = el.dataset.href;

        // Arrange
        mock
          .onDelete(path)
          .replyOnce(200, { count: TEST_COUNT_BIG, done_count: TEST_DONE_COUNT_BIG });
        onToggleSpy = jest.fn();
        document.addEventListener('todo:toggle', onToggleSpy);

        // Act
        el.click();

        // Wait for axios and HTML to udpate
        return waitForPromises();
      });

      it('dispatches todo:toggle', () => {
        expect(onToggleSpy).toHaveBeenCalledWith(
          expect.objectContaining({
            detail: {
              count: TEST_COUNT_BIG,
            },
          }),
        );
      });

      it('updates pending text', () => {
        expect(document.querySelector('.js-todos-pending .js-todos-badge').innerHTML).toEqual(
          addDelimiter(TEST_COUNT_BIG),
        );
      });

      it('updates done text', () => {
        expect(document.querySelector('.js-todos-done .js-todos-badge').innerHTML).toEqual(
          addDelimiter(TEST_DONE_COUNT_BIG),
        );
      });
    });
  });
});