16
16
import { describe , beforeEach , afterEach , beforeAll , it , expect , vi , MockInstance } from 'vitest' ;
17
17
18
18
import { PollingDatafileManager } from './polling_datafile_manager' ; ;
19
- import { getMockTicker } from '../tests/mock/mockTicker ' ;
20
- import { getMockRequestHandler } from '../tests/mock/mockRequestHandler' ;
19
+ import { getMockRepeater } from '../tests/mock/mockRepeater ' ;
20
+ import { getMockAbortableRequest , getMockRequestHandler } from '../tests/mock/mockRequestHandler' ;
21
21
import { Headers , AbortableRequest , Response , RequestHandler } from '../utils/http_request_handler/http' ;
22
22
// import { DatafileManagerConfig } from '../lib/modules/datafile-manager/datafileManager';
23
23
// import { advanceTimersByTime, getTimerCount } from './testUtils';
24
24
import PersistentKeyValueCache from '../../lib/plugins/key_value_cache/persistentKeyValueCache' ;
25
-
25
+ import { getMockLogger } from '../tests/mock/mockLogger' ;
26
+ import { DEFAULT_URL_TEMPLATE , MIN_UPDATE_INTERVAL , UPDATE_INTERVAL_BELOW_MINIMUM_MESSAGE } from './config' ;
26
27
27
28
const testCache : PersistentKeyValueCache = {
28
29
get ( key : string ) : Promise < string | undefined > {
@@ -49,17 +50,152 @@ const testCache: PersistentKeyValueCache = {
49
50
} ;
50
51
51
52
describe ( 'PollingDatafileManager' , ( ) => {
52
- it ( 'starts the ticker with immediateTick on start' , ( ) => {
53
- const ticker = getMockTicker ( ) ;
53
+ it ( 'should log polling interval below 30 seconds' , ( ) => {
54
+ const repeater = getMockRepeater ( ) ;
55
+ const requestHandler = getMockRequestHandler ( ) ;
56
+ const logger = getMockLogger ( ) ;
57
+ const manager = new PollingDatafileManager ( {
58
+ repeater,
59
+ requestHandler,
60
+ sdkKey : '123' ,
61
+ logger,
62
+ updateInterval : 29000 ,
63
+ } ) ;
64
+ manager . start ( ) ;
65
+ expect ( logger . warn ) . toHaveBeenCalledWith ( UPDATE_INTERVAL_BELOW_MINIMUM_MESSAGE ) ;
66
+ } ) ;
67
+
68
+ it ( 'should not log polling interval above 30 seconds' , ( ) => {
69
+ const repeater = getMockRepeater ( ) ;
70
+ const requestHandler = getMockRequestHandler ( ) ;
71
+ const logger = getMockLogger ( ) ;
72
+ const manager = new PollingDatafileManager ( {
73
+ repeater,
74
+ requestHandler,
75
+ sdkKey : '123' ,
76
+ logger,
77
+ updateInterval : 31000 ,
78
+ } ) ;
79
+ manager . start ( ) ;
80
+ expect ( logger . warn ) . not . toHaveBeenCalled ( ) ;
81
+ } ) ;
82
+
83
+ it ( 'starts the repeater with immediateExecution on start' , ( ) => {
84
+ const repeater = getMockRepeater ( ) ;
54
85
const requestHandler = getMockRequestHandler ( ) ;
55
86
const manager = new PollingDatafileManager ( {
87
+ repeater,
88
+ requestHandler,
56
89
sdkKey : '123' ,
90
+ } ) ;
91
+ manager . start ( ) ;
92
+ expect ( repeater . start ) . toHaveBeenCalledWith ( true ) ;
93
+ } ) ;
94
+
95
+ it ( 'uses cached version of datafile, resolves onRunning() and calls onUpdate handlers while datafile fetch request waits' , async ( ) => {
96
+ const repeater = getMockRepeater ( ) ;
97
+ const requestHandler = getMockRequestHandler ( ) ; // response promise is pending
98
+ const manager = new PollingDatafileManager ( {
99
+ repeater,
100
+ requestHandler,
101
+ sdkKey : 'keyThatExists' ,
102
+ cache : testCache ,
103
+ } ) ;
104
+
105
+ manager . start ( ) ;
106
+ repeater . execute ( 0 ) ;
107
+ const listener = vi . fn ( ) ;
108
+
109
+ manager . onUpdate ( listener ) ;
110
+ await expect ( manager . onRunning ( ) ) . resolves . toBeUndefined ( ) ;
111
+ expect ( listener ) . toHaveBeenCalledWith ( JSON . stringify ( { name : 'keyThatExists' } ) ) ;
112
+ } ) ;
113
+
114
+ it ( 'uses cached version of datafile, resolves onRunning() and calls onUpdate handlers even if fetch request fails' , async ( ) => {
115
+ const repeater = getMockRepeater ( ) ;
116
+ const requestHandler = getMockRequestHandler ( ) ;
117
+ const mockResponse = getMockAbortableRequest ( Promise . reject ( 'test error' ) ) ;
118
+ requestHandler . makeRequest . mockReturnValueOnce ( mockResponse ) ;
119
+
120
+ const manager = new PollingDatafileManager ( {
121
+ repeater,
57
122
requestHandler,
58
- ticker,
123
+ sdkKey : 'keyThatExists' ,
124
+ cache : testCache ,
59
125
} ) ;
126
+
60
127
manager . start ( ) ;
61
- expect ( ticker . start ) . toHaveBeenCalledWith ( true ) ;
128
+ repeater . execute ( 0 ) ;
129
+
130
+ const listener = vi . fn ( ) ;
131
+
132
+ manager . onUpdate ( listener ) ;
133
+ await expect ( manager . onRunning ( ) ) . resolves . toBeUndefined ( ) ;
134
+ expect ( requestHandler . makeRequest ) . toHaveBeenCalledOnce ( ) ;
135
+ expect ( listener ) . toHaveBeenCalledWith ( JSON . stringify ( { name : 'keyThatExists' } ) ) ;
62
136
} ) ;
137
+
138
+ // it('uses cached datafile, resolves ready promise, fetches new datafile from network and triggers update event', async () => {
139
+ // manager.queuedResponses.push({
140
+ // statusCode: 200,
141
+ // body: '{"foo": "bar"}',
142
+ // headers: {},
143
+ // });
144
+
145
+ // const updateFn = vi.fn();
146
+ // manager.on('update', updateFn);
147
+ // manager.start();
148
+ // await manager.onReady();
149
+ // expect(JSON.parse(manager.get())).toEqual({ name: 'keyThatExists' });
150
+ // expect(updateFn).toBeCalledTimes(0);
151
+ // await advanceTimersByTime(50);
152
+ // expect(JSON.parse(manager.get())).toEqual({ foo: 'bar' });
153
+ // expect(updateFn).toBeCalledTimes(1);
154
+ // });
155
+
156
+ // it('sets newly recieved datafile in to cache', async () => {
157
+ // const cacheSetSpy = vi.spyOn(testCache, 'set');
158
+ // manager.queuedResponses.push({
159
+ // statusCode: 200,
160
+ // body: '{"foo": "bar"}',
161
+ // headers: {},
162
+ // });
163
+ // manager.start();
164
+ // await manager.onReady();
165
+ // await advanceTimersByTime(50);
166
+ // expect(JSON.parse(manager.get())).toEqual({ foo: 'bar' });
167
+ // expect(cacheSetSpy.mock.calls[0][0]).toEqual('opt-datafile-keyThatExists');
168
+ // expect(JSON.parse(cacheSetSpy.mock.calls[0][1])).toEqual({ foo: 'bar' });
169
+ // });
170
+ // });
171
+
172
+ // describe('when constructed with a cache implementation without an already cached datafile', () => {
173
+ // beforeEach(() => {
174
+ // manager = new TestDatafileManager({
175
+ // sdkKey: 'keyThatDoesExists',
176
+ // updateInterval: 500,
177
+ // autoUpdate: true,
178
+ // cache: testCache,
179
+ // });
180
+ // manager.simulateResponseDelay = true;
181
+ // });
182
+
183
+ // it('does not find cached datafile, fetches new datafile from network, resolves promise and does not trigger update event', async () => {
184
+ // manager.queuedResponses.push({
185
+ // statusCode: 200,
186
+ // body: '{"foo": "bar"}',
187
+ // headers: {},
188
+ // });
189
+
190
+ // const updateFn = vi.fn();
191
+ // manager.on('update', updateFn);
192
+ // manager.start();
193
+ // await advanceTimersByTime(50);
194
+ // await manager.onReady();
195
+ // expect(JSON.parse(manager.get())).toEqual({ foo: 'bar' });
196
+ // expect(updateFn).toBeCalledTimes(0);
197
+ // });
198
+ // });
63
199
// describe('when constructed with sdkKey and datafile and autoUpdate: true,', () => {
64
200
65
201
@@ -672,4 +808,5 @@ describe('PollingDatafileManager', () => {
672
808
// expect(updateFn).toBeCalledTimes(0);
673
809
// });
674
810
// });
675
- } ) ;
811
+
812
+ } ) ;
0 commit comments