Passed
Push — develop ( 5e54f0...8faf31 )
by Endre
05:14
created

Application.test.ts ➔ onMenu   A

Complexity

Conditions 1

Size

Total Lines 1
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
dl 0
loc 1
rs 10
c 0
b 0
f 0
1
import React from 'react';
2
import ListenerAdapter from '../Observer/ListenerAdapter';
3
import {IObserverAdapter} from '../Observer/Observer';
4
import Application, {IAdapter} from './Application';
5
import ApplicationView, {IAdapter as IViewAdapter} from './View/Application';
6
import Model from './View/Application/Model';
7
8
jest.mock('./View/Application');
9
10
describe('Application', () => {
11
  let presentSpy: jest.Mock,
12
    languageListener: ListenerAdapter<string>,
13
    moduleListener: ListenerAdapter<typeof React.Component | null>,
14
    menuOpenStateListener: IObserverAdapter<boolean>,
15
    renderSpy: jest.Mock,
16
    model: Model,
17
    applicationAdapter: IAdapter,
18
    application: Application;
19
20
  beforeEach(() => {
21
22
    languageListener = new ListenerAdapter<string>();
23
    moduleListener = new ListenerAdapter<typeof React.Component | null>();
24
    menuOpenStateListener = new class implements IObserverAdapter<boolean> {
25
      public onChange(newValue: boolean): void {
26
      }
27
    };
28
29
    model = new Model();
30
    presentSpy = jest.fn();
31
    presentSpy.mockReturnValue(model);
32
33
    renderSpy = jest.fn();
34
    applicationAdapter = {
35
      onPageChanged: jest.fn(),
36
      onClose(): void {},
37
      onGithubClick(): void {},
38
      onMenu(name: string): void {},
39
      onMenuClick(): void {}
40
    };
41
42
    (ApplicationView as jest.Mock).mockImplementation(
43
      (containerNode: Element | DocumentFragment | null, adapter: IViewAdapter) => {
44
        expect(containerNode).toBe(document.body);
45
        expect(adapter).toBe(applicationAdapter);
46
47
        return {
48
          render: renderSpy
49
        };
50
      }
51
    );
52
    application = new Application(applicationAdapter, {present: presentSpy});
53
    application.attachToModuleState(moduleListener);
54
    application.attachToLanguage(languageListener);
55
    application.attachToMenuOpenState(menuOpenStateListener);
56
  });
57
58
  it('Can render', () => {
59
    application.render();
60
    expect(presentSpy).not.toHaveBeenCalled();
61
    expect(renderSpy).not.toHaveBeenCalled();
62
63
    application.attachToContainerNode(document.body);
64
    application.render();
65
    expect(presentSpy).toHaveBeenCalled();
66
    expect(renderSpy).toBeCalledWith(model);
67
  });
68
69
  it('Rerender on loaded language', (done) => {
70
    application.attachToContainerNode(document.body);
71
    languageListener.onChange('de-de');
72
    setTimeout(
73
      () => {
74
        expect(presentSpy).toHaveBeenCalled();
75
        expect(renderSpy).toBeCalledWith(model);
76
        done();
77
      },
78
      1
79
    );
80
  });
81
82
  it('Rerender on loaded module', (done) => {
83
    application.attachToContainerNode(document.body);
84
    moduleListener.onChange(null);
85
    setTimeout(
86
      () => {
87
        expect(presentSpy).toHaveBeenCalled();
88
        expect(renderSpy).toBeCalledWith(model);
89
        done();
90
      },
91
      1
92
    );
93
  });
94
95
  it('Rerender on menu change', () => {
96
    application.attachToContainerNode(document.body);
97
    menuOpenStateListener.onChange(true);
98
    expect(presentSpy).toHaveBeenCalled();
99
    expect(renderSpy).toBeCalledWith(model);
100
  });
101
})
102
;
103