145 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| import createEventHub from '~/helpers/event_hub_factory';
 | |
| 
 | |
| const TEST_EVENT = 'foobar';
 | |
| const TEST_EVENT_2 = 'testevent';
 | |
| 
 | |
| describe('event bus factory', () => {
 | |
|   let eventBus;
 | |
|   let handler;
 | |
|   let otherHandlers;
 | |
| 
 | |
|   beforeEach(() => {
 | |
|     eventBus = createEventHub();
 | |
|     handler = jest.fn();
 | |
|     otherHandlers = [jest.fn(), jest.fn()];
 | |
|   });
 | |
| 
 | |
|   afterEach(() => {
 | |
|     eventBus.dispose();
 | |
|     eventBus = null;
 | |
|   });
 | |
| 
 | |
|   describe('instance', () => {
 | |
|     it.each`
 | |
|       method
 | |
|       ${'$on'}
 | |
|       ${'$once'}
 | |
|       ${'$off'}
 | |
|       ${'$emit'}
 | |
|     `('has $method method', ({ method }) => {
 | |
|       expect(eventBus[method]).toEqual(expect.any(Function));
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('$on', () => {
 | |
|     beforeEach(() => {
 | |
|       eventBus.$on(TEST_EVENT, handler);
 | |
|     });
 | |
| 
 | |
|     it('calls handler when event is emitted', () => {
 | |
|       eventBus.$emit(TEST_EVENT);
 | |
|       expect(handler).toHaveBeenCalledWith();
 | |
|     });
 | |
| 
 | |
|     it('calls handler with multiple args', () => {
 | |
|       eventBus.$emit(TEST_EVENT, 'arg1', 'arg2', 'arg3');
 | |
|       expect(handler).toHaveBeenCalledWith('arg1', 'arg2', 'arg3');
 | |
|     });
 | |
| 
 | |
|     it('calls handler multiple times', () => {
 | |
|       eventBus.$emit(TEST_EVENT, 'arg1', 'arg2', 'arg3');
 | |
|       eventBus.$emit(TEST_EVENT, 'arg1', 'arg2', 'arg3');
 | |
| 
 | |
|       expect(handler).toHaveBeenCalledTimes(2);
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('$once', () => {
 | |
|     beforeEach(() => {
 | |
|       eventBus.$once(TEST_EVENT, handler);
 | |
|     });
 | |
| 
 | |
|     it('calls handler when event is emitted', () => {
 | |
|       eventBus.$emit(TEST_EVENT);
 | |
|       expect(handler).toHaveBeenCalled();
 | |
|     });
 | |
| 
 | |
|     it('calls the handler only once when event is emitted multiple times', () => {
 | |
|       eventBus.$emit(TEST_EVENT);
 | |
|       eventBus.$emit(TEST_EVENT);
 | |
|       expect(handler).toHaveBeenCalledTimes(1);
 | |
|     });
 | |
| 
 | |
|     describe('when the handler thows an error', () => {
 | |
|       beforeEach(() => {
 | |
|         handler = jest.fn().mockImplementation(() => {
 | |
|           throw new Error();
 | |
|         });
 | |
|         eventBus.$once(TEST_EVENT, handler);
 | |
|       });
 | |
| 
 | |
|       it('calls off when event is emitted', () => {
 | |
|         expect(() => {
 | |
|           eventBus.$emit(TEST_EVENT);
 | |
|         }).toThrow();
 | |
|         expect(() => {
 | |
|           eventBus.$emit(TEST_EVENT);
 | |
|         }).not.toThrow();
 | |
| 
 | |
|         expect(handler).toHaveBeenCalledTimes(1);
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('$off', () => {
 | |
|     beforeEach(() => {
 | |
|       otherHandlers.forEach((x) => eventBus.$on(TEST_EVENT, x));
 | |
|       eventBus.$on(TEST_EVENT, handler);
 | |
|     });
 | |
| 
 | |
|     it('can be called on event with no handlers', () => {
 | |
|       expect(() => {
 | |
|         eventBus.$off(TEST_EVENT_2);
 | |
|       }).not.toThrow();
 | |
|     });
 | |
| 
 | |
|     it('can be called on event with no handlers, with a handler', () => {
 | |
|       expect(() => {
 | |
|         eventBus.$off(TEST_EVENT_2, handler);
 | |
|       }).not.toThrow();
 | |
|     });
 | |
| 
 | |
|     it('with a handler, will no longer call that handler', () => {
 | |
|       eventBus.$off(TEST_EVENT, handler);
 | |
| 
 | |
|       eventBus.$emit(TEST_EVENT);
 | |
| 
 | |
|       expect(handler).not.toHaveBeenCalled();
 | |
|       expect(otherHandlers.map((x) => x.mock.calls.length)).toEqual(otherHandlers.map(() => 1));
 | |
|     });
 | |
| 
 | |
|     it('without a handler, will no longer call any handlers', () => {
 | |
|       eventBus.$off(TEST_EVENT);
 | |
| 
 | |
|       eventBus.$emit(TEST_EVENT);
 | |
| 
 | |
|       expect(handler).not.toHaveBeenCalled();
 | |
|       expect(otherHandlers.map((x) => x.mock.calls.length)).toEqual(otherHandlers.map(() => 0));
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('$emit', () => {
 | |
|     beforeEach(() => {
 | |
|       otherHandlers.forEach((x) => eventBus.$on(TEST_EVENT_2, x));
 | |
|       eventBus.$on(TEST_EVENT, handler);
 | |
|     });
 | |
| 
 | |
|     it('only calls handlers for given type', () => {
 | |
|       eventBus.$emit(TEST_EVENT, 'arg1');
 | |
| 
 | |
|       expect(handler).toHaveBeenCalledWith('arg1');
 | |
|       expect(otherHandlers.map((x) => x.mock.calls.length)).toEqual(otherHandlers.map(() => 0));
 | |
|     });
 | |
|   });
 | |
| });
 |