Skip to content

Commit a71fdd9

Browse files
committed
add more tests
1 parent 5758a9b commit a71fdd9

File tree

3 files changed

+99
-1
lines changed

3 files changed

+99
-1
lines changed
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import { describe, it, expect, beforeEach, vi } from 'vitest';
2+
3+
vi.mock('./project_config_manager', () => {
4+
const MockConfigManager = vi.fn();
5+
return { ProjectConfigManagerImpl: MockConfigManager };
6+
});
7+
8+
vi.mock('./polling_datafile_manager', () => {
9+
const MockDatafileManager = vi.fn();
10+
return { PollingDatafileManager: MockDatafileManager };
11+
});
12+
13+
vi.mock('../utils/repeater/repeater', () => {
14+
const MockIntervalRepeater = vi.fn();
15+
const MockExponentialBackoff = vi.fn();
16+
return { IntervalRepeater: MockIntervalRepeater, ExponentialBackoff: MockExponentialBackoff };
17+
});
18+
19+
import { ProjectConfigManagerImpl } from './project_config_manager';
20+
import { PollingDatafileManager } from './polling_datafile_manager';
21+
import { ExponentialBackoff, IntervalRepeater } from '../utils/repeater/repeater';
22+
import { getPollingConfigManager } from './config_manager_factory';
23+
import { DEFAULT_UPDATE_INTERVAL } from './config';
24+
import exp from 'constants';
25+
26+
describe('getPollingConfigManager', () => {
27+
const MockProjectConfigManagerImpl = vi.mocked(ProjectConfigManagerImpl);
28+
const MockPollingDatafileManager = vi.mocked(PollingDatafileManager);
29+
const MockIntervalRepeater = vi.mocked(IntervalRepeater);
30+
const MockExponentialBackoff = vi.mocked(ExponentialBackoff);
31+
32+
beforeEach(() => {
33+
MockProjectConfigManagerImpl.mockClear();
34+
MockPollingDatafileManager.mockClear();
35+
MockIntervalRepeater.mockClear();
36+
MockExponentialBackoff.mockClear();
37+
});
38+
39+
it('uses a repeater with exponential backoff for the datafileManager', () => {
40+
const config = {
41+
sdkKey: 'sdkKey',
42+
requestHandler: { makeRequest: vi.fn() },
43+
};
44+
const projectConfigManager = getPollingConfigManager(config);
45+
expect(Object.is(projectConfigManager, MockProjectConfigManagerImpl.mock.instances[0])).toBe(true);
46+
const usedDatafileManager = MockProjectConfigManagerImpl.mock.calls[0][0].datafileManager;
47+
expect(Object.is(usedDatafileManager, MockPollingDatafileManager.mock.instances[0])).toBe(true);
48+
const usedRepeater = MockPollingDatafileManager.mock.calls[0][0].repeater;
49+
expect(Object.is(usedRepeater, MockIntervalRepeater.mock.instances[0])).toBe(true);
50+
const usedBackoff = MockIntervalRepeater.mock.calls[0][1];
51+
expect(Object.is(usedBackoff, MockExponentialBackoff.mock.instances[0])).toBe(true);
52+
});
53+
54+
it('uses the default update interval if not provided', () => {
55+
const config = {
56+
sdkKey: 'sdkKey',
57+
requestHandler: { makeRequest: vi.fn() },
58+
};
59+
getPollingConfigManager(config);
60+
expect(MockIntervalRepeater.mock.calls[0][0]).toBe(DEFAULT_UPDATE_INTERVAL);
61+
expect(MockPollingDatafileManager.mock.calls[0][0].updateInterval).toBe(DEFAULT_UPDATE_INTERVAL);
62+
});
63+
64+
it('uses the provided options', () => {
65+
const config = {
66+
datafile: '{}',
67+
jsonSchemaValidator: vi.fn(),
68+
sdkKey: 'sdkKey',
69+
requestHandler: { makeRequest: vi.fn() },
70+
updateInterval: 50000,
71+
autoUpdate: true,
72+
urlTemplate: 'urlTemplate',
73+
datafileAccessToken: 'datafileAccessToken',
74+
cache: { get: vi.fn(), set: vi.fn(), contains: vi.fn(), remove: vi.fn() },
75+
};
76+
77+
getPollingConfigManager(config);
78+
expect(MockIntervalRepeater.mock.calls[0][0]).toBe(config.updateInterval);
79+
expect(MockExponentialBackoff).toHaveBeenNthCalledWith(1, 1000, config.updateInterval, 500);
80+
81+
expect(MockPollingDatafileManager).toHaveBeenNthCalledWith(1, expect.objectContaining({
82+
sdkKey: config.sdkKey,
83+
autoUpdate: config.autoUpdate,
84+
updateInterval: config.updateInterval,
85+
urlTemplate: config.urlTemplate,
86+
datafileAccessToken: config.datafileAccessToken,
87+
requestHandler: config.requestHandler,
88+
repeater: MockIntervalRepeater.mock.instances[0],
89+
cache: config.cache,
90+
}));
91+
92+
expect(MockProjectConfigManagerImpl).toHaveBeenNthCalledWith(1, expect.objectContaining({
93+
datafile: config.datafile,
94+
jsonSchemaValidator: config.jsonSchemaValidator,
95+
}));
96+
});
97+
});

lib/project_config/config_manager_factory.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export const getPollingConfigManager = (
4646
urlTemplate: opt.urlTemplate,
4747
datafileAccessToken: opt.datafileAccessToken,
4848
requestHandler: opt.requestHandler,
49+
cache: opt.cache,
4950
repeater,
5051
};
5152

vitest.config.mts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export default defineConfig({
44
test: {
55
onConsoleLog: () => true,
66
environment: 'happy-dom',
7-
include: ["**/project_config_manager.spec.ts"],
7+
include: ["**/config_manager_factory.spec.ts"],
88
typecheck: {
99
tsconfig: 'tsconfig.spec.json',
1010
exclude: ['**/index.react_native.spec.ts'],

0 commit comments

Comments
 (0)