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

event_hub_factory_spec.js « helpers « frontend « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: dcfec6b836a340f2b10bc4e5d809c583f24e5060 (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
import createEventHub from '~/helpers/event_hub_factory';

describe('event bus factory', () => {
  let eventBus;

  beforeEach(() => {
    eventBus = createEventHub();
  });

  afterEach(() => {
    eventBus = null;
  });

  describe('underlying module', () => {
    let mitt;

    beforeEach(() => {
      jest.resetModules();
      jest.mock('mitt');

      // eslint-disable-next-line global-require
      mitt = require('mitt');
      mitt.mockReturnValue(() => ({}));

      const createEventHubActual = jest.requireActual('~/helpers/event_hub_factory').default;
      eventBus = createEventHubActual();
    });

    it('creates an emitter', () => {
      expect(mitt).toHaveBeenCalled();
    });
  });

  describe('instance', () => {
    it.each`
      method
      ${'on'}
      ${'once'}
      ${'off'}
      ${'emit'}
    `('binds $$method to $method ', ({ method }) => {
      expect(typeof eventBus[method]).toBe('function');
      expect(eventBus[method]).toBe(eventBus[`$${method}`]);
    });
  });

  describe('once', () => {
    const event = 'foobar';
    let handler;

    beforeEach(() => {
      jest.spyOn(eventBus, 'on');
      jest.spyOn(eventBus, 'off');
      handler = jest.fn();
      eventBus.once(event, handler);
    });

    it('calls on internally', () => {
      expect(eventBus.on).toHaveBeenCalled();
    });

    it('calls handler when event is emitted', () => {
      eventBus.emit(event);
      expect(handler).toHaveBeenCalled();
    });

    it('calls off when event is emitted', () => {
      eventBus.emit(event);
      expect(eventBus.off).toHaveBeenCalled();
    });

    it('calls the handler only once when event is emitted multiple times', () => {
      eventBus.emit(event);
      eventBus.emit(event);
      expect(handler).toHaveBeenCalledTimes(1);
    });

    describe('when the handler thows an error', () => {
      beforeEach(() => {
        handler = jest.fn().mockImplementation(() => {
          throw new Error();
        });
        eventBus.once(event, handler);
      });

      it('calls off when event is emitted', () => {
        expect(() => {
          eventBus.emit(event);
        }).toThrow();
        expect(eventBus.off).toHaveBeenCalled();
      });
    });
  });
});