aboutsummaryrefslogtreecommitdiffstats
path: root/src/base-pubsub.spec.ts
blob: 5737b1805a5e0d3a2101ab937a5bb617bcb845ce (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
declare const window: Window;

import {BasePubSub} from './base-pubsub';

describe('BasePubSub Tests', () => {
    let basePubSub: BasePubSub;

    let testSub: string = 'testSub';
    let testWindow = window;
    let testSubUrl: string = 'http://127.0.0.1';

    beforeEach(() => {
        basePubSub = new BasePubSub('testId');
    });

    describe('constructor tests', () => {
        it('should init class property', () => {
            expect(basePubSub.subscribers.size).toBe(0);
            expect(basePubSub.eventsCallbacks.length).toBe(0);
            expect(basePubSub.eventsToWait.size).toBe(0);
            expect(basePubSub.clientId).toBe('testId');
            expect(basePubSub.lastEventNotified).toBe('');
        });
    });

    describe('register function tests', () => {

        it('Should add new subscriber with the sent url to subscribers array ' +
            'when calling register function with url', () => {
            basePubSub.register(testSub, testWindow, testSubUrl);

            let actualSub = basePubSub.subscribers.get(testSub);

            expect(basePubSub.subscribers.size).toBe(1);
            expect(actualSub.window).toBe(testWindow);
            expect(actualSub.locationUrl).toBe(testSubUrl);
        });

        it('Should add new subscriber with the window location.href to subscribers array ' +
            'when calling register function without url', () => {
            basePubSub.register(testSub, testWindow, undefined);

            let actualSub = basePubSub.subscribers.get(testSub);

            expect(basePubSub.subscribers.size).toBe(1);
            expect(actualSub.window).toBe(testWindow);
            expect(actualSub.locationUrl).toBe(window.location.href);
        });
    });

    describe('unregister function tests', () => {

        it('Should remove subscriber from subscribers list', () => {
            basePubSub.register(testSub, testWindow, testSubUrl);

            expect(basePubSub.subscribers.size).toBe(1);

            basePubSub.unregister(testSub);

            expect(basePubSub.subscribers.size).toBe(0);
        });
    });

    describe('on function tests', () => {
        let callback = () => {return true};

        it('Should add new callback to events callback array', () => {
            basePubSub.on(callback);

            expect(basePubSub.eventsCallbacks.length).toBe(1);

            let actualCallback = basePubSub.eventsCallbacks[0];

            expect(actualCallback).toBe(callback);
        });

        it('Should not add callback to events callback array if it already exists', () => {
            basePubSub.on(callback);

            expect(basePubSub.eventsCallbacks.length).toBe(1);

            basePubSub.on(callback);

            expect(basePubSub.eventsCallbacks.length).toBe(1);
        });
    });

    describe('off function tests', () => {
        let callback = () => {return true};

        it('Should remove callback from events callback array', () => {
            basePubSub.on(callback);

            expect(basePubSub.eventsCallbacks.length).toBe(1);

            basePubSub.off(callback);

            expect(basePubSub.eventsCallbacks.length).toBe(0);
        });
    });

    describe('isWaitingForEvent function tests', () => {
        let eventsMap = new Map<string, Array<string>>();
        eventsMap.set('eventsKey', ['WINDOW_OUT']);

        beforeEach(() => {
            basePubSub.eventsToWait = eventsMap;
        });

        it('Should return true when the event is found in the events to wait array', () => {
            let isWaiting = basePubSub.isWaitingForEvent('WINDOW_OUT');

            expect(isWaiting).toBeTruthy();
        });

        it('Should return false when the event is not found in the events to wait array', () => {
            let isWaiting = basePubSub.isWaitingForEvent('CHECK_IN');

            expect(isWaiting).toBeFalsy();
        });
    });

    describe('notify function tests', () => {
        let eventType: string = 'CHECK_IN';
        let callback;
        beforeEach(() => {
             callback = jest.fn();
        });

        it('should only update the last event notified property when no subscribers registered', () => {
            basePubSub.notify(eventType);

            expect(basePubSub.lastEventNotified).toBe(eventType);
        });

        it('should call post message with the right parameters when there are subscribers registered', () => {
            testWindow.postMessage = jest.fn();
            basePubSub.register(testSub, testWindow, testSubUrl);
            basePubSub.notify(eventType);

            let sub = basePubSub.subscribers.get(testSub);

            let eventObj = {
                type: eventType,
                data: undefined,
                originId: basePubSub.clientId
            };

            expect(sub.window.postMessage).toHaveBeenCalledWith(eventObj, sub.locationUrl);
        });

        it('should execute the callback function when calling notify with subscription function with no subscribers', () => {
            let callback = jest.fn();

            basePubSub.notify(eventType).subscribe(callback);

            expect(callback).toHaveBeenCalled();
        });

        it('should execute the callback function when calling notify with subscription function ' +
            'with connected subscribers after all been notified', () => {
            basePubSub.register(testSub, testWindow, testSubUrl);

            basePubSub.notify(eventType).subscribe(callback);

            expect(callback).toHaveBeenCalled();
        });

        it('should register an action completed function to pub sub when an event that is in the events to wait list ' +
            'is being fired', () => {
            let eventsMap = new Map<string, Array<string>>();
            eventsMap.set(testSub, ['CHECK_IN']);
            basePubSub.on = jest.fn();

            basePubSub.register(testSub, testWindow, testSubUrl);
            basePubSub.eventsToWait = eventsMap;

            basePubSub.notify(eventType).subscribe(callback);

            expect(basePubSub.on).toHaveBeenCalled();
        });
    })
});