Skip to content

Commit ad692fc

Browse files
stepan662Štěpán Granát
authored and
Štěpán Granát
committed
perf: sdk version 6
1 parent b33f6c8 commit ad692fc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+1435
-1058
lines changed

Diff for: packages/core/src/Controller/Cache/Cache.test.ts

+189
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
import { ListenerEvent } from '../../types';
2+
import { EventEmitterInstance } from '../Events/EventEmitter';
3+
import { ValueObserver } from '../ValueObserver';
4+
import { Cache, CacheInstance } from './Cache';
5+
6+
describe('cache', () => {
7+
function createEventMock(): EventEmitterInstance<ListenerEvent<any, any>> {
8+
return {
9+
emit: jest.fn(),
10+
listen: jest.fn(),
11+
};
12+
}
13+
14+
let mockedBackendGetRecord: jest.Mock<any, any>;
15+
let mockedBackendGetDevRecord: jest.Mock<any, any>;
16+
17+
let onFetchingChange: jest.Mock<any, any>;
18+
let onLoadingChange: jest.Mock<any, any>;
19+
20+
let cache: CacheInstance;
21+
22+
beforeEach(() => {
23+
const mockedEvents = {
24+
on: jest.fn(),
25+
onCacheChange: createEventMock(),
26+
onError: createEventMock(),
27+
onFetchingChange: createEventMock(),
28+
onInitialLoaded: createEventMock(),
29+
onLanguageChange: createEventMock(),
30+
onLoadingChange: createEventMock(),
31+
onPendingLanguageChange: createEventMock(),
32+
onPermanentChange: createEventMock(),
33+
onRunningChange: createEventMock(),
34+
onUpdate: createEventMock() as any,
35+
setEmitterActive: jest.fn(),
36+
};
37+
38+
mockedBackendGetRecord = jest.fn((args) => {
39+
return Promise.resolve({ data: 'Prod', ...args });
40+
});
41+
mockedBackendGetDevRecord = jest.fn((args) => {
42+
return Promise.resolve({ data: 'Dev', ...args });
43+
});
44+
45+
onFetchingChange = jest.fn();
46+
onLoadingChange = jest.fn();
47+
48+
const fetchingObserver = ValueObserver(
49+
false,
50+
() => cache.isFetching(),
51+
onFetchingChange
52+
);
53+
54+
const loadingObserver = ValueObserver(
55+
false,
56+
() => cache.isLoading('en'),
57+
onLoadingChange
58+
);
59+
60+
cache = Cache(
61+
mockedEvents,
62+
mockedBackendGetRecord,
63+
mockedBackendGetDevRecord,
64+
(descriptor) => ({ namespace: '', ...descriptor }),
65+
() => false,
66+
() => false,
67+
fetchingObserver,
68+
loadingObserver
69+
);
70+
});
71+
72+
it('fetches language with default namespace', async () => {
73+
const result = await cache.loadRecords([{ language: 'en' }]);
74+
expect(result[0].data).toEqual({
75+
language: 'en',
76+
namespace: '',
77+
data: 'Dev',
78+
});
79+
});
80+
81+
it('fetches language with specified namespace', async () => {
82+
const result = await cache.loadRecords([
83+
{ language: 'en', namespace: 'test' },
84+
]);
85+
expect(result[0].data).toEqual({
86+
language: 'en',
87+
namespace: 'test',
88+
data: 'Dev',
89+
});
90+
});
91+
92+
it('fetches language with specified namespace', async () => {
93+
const result = await cache.loadRecords([
94+
{ language: 'en', namespace: 'test' },
95+
]);
96+
expect(result[0].data).toEqual({
97+
language: 'en',
98+
namespace: 'test',
99+
data: 'Dev',
100+
});
101+
});
102+
103+
it('uses cache when fetching twice the same thing', async () => {
104+
await cache.loadRecords([{ language: 'en' }]);
105+
expect(mockedBackendGetDevRecord).toBeCalledTimes(1);
106+
const result = await cache.loadRecords([{ language: 'en' }], {
107+
useCache: true,
108+
});
109+
expect(mockedBackendGetDevRecord).toBeCalledTimes(1);
110+
expect(result[0].data).toEqual({
111+
language: 'en',
112+
namespace: '',
113+
data: 'Dev',
114+
});
115+
});
116+
117+
it('uses cache when fetching twice production data', async () => {
118+
await cache.loadRecords([{ language: 'en' }], { noDev: true });
119+
expect(mockedBackendGetRecord).toBeCalledTimes(1);
120+
const result = await cache.loadRecords([{ language: 'en' }], {
121+
noDev: true,
122+
useCache: true,
123+
});
124+
expect(mockedBackendGetRecord).toBeCalledTimes(1);
125+
expect(result[0].data).toEqual({
126+
language: 'en',
127+
namespace: '',
128+
data: 'Prod',
129+
});
130+
});
131+
132+
it('does not use cache when `noCache` is on', async () => {
133+
await cache.loadRecords([{ language: 'en' }]);
134+
expect(mockedBackendGetDevRecord).toBeCalledTimes(1);
135+
await cache.loadRecords([{ language: 'en' }]);
136+
expect(mockedBackendGetDevRecord).toBeCalledTimes(2);
137+
});
138+
139+
it('correctly returns combination of non-cached and cached', async () => {
140+
await cache.loadRecords([{ language: 'en' }]);
141+
expect(mockedBackendGetDevRecord).toBeCalledTimes(1);
142+
const result = await cache.loadRecords(
143+
[{ language: 'en' }, { language: 'en', namespace: 'new' }],
144+
{ useCache: true }
145+
);
146+
expect(mockedBackendGetDevRecord).toBeCalledTimes(2);
147+
expect(result).toEqual([
148+
{
149+
cacheKey: 'en',
150+
data: { data: 'Dev', language: 'en', namespace: '' },
151+
language: 'en',
152+
namespace: '',
153+
},
154+
{
155+
cacheKey: 'en:new',
156+
data: { data: 'Dev', language: 'en', namespace: 'new' },
157+
language: 'en',
158+
namespace: 'new',
159+
},
160+
]);
161+
});
162+
163+
it('correctly refetches dev data', async () => {
164+
await cache.loadRecords([{ language: 'en' }], { noDev: true });
165+
expect(mockedBackendGetRecord).toBeCalledTimes(1);
166+
expect(mockedBackendGetDevRecord).toBeCalledTimes(0);
167+
cache.invalidate();
168+
const result = await cache.loadRecords([{ language: 'en' }]);
169+
expect(mockedBackendGetRecord).toBeCalledTimes(1);
170+
expect(mockedBackendGetDevRecord).toBeCalledTimes(1);
171+
expect(result[0].data).toEqual({
172+
language: 'en',
173+
namespace: '',
174+
data: 'Dev',
175+
});
176+
});
177+
178+
it('correctly notifies about fetching and loading', async () => {
179+
expect(onLoadingChange).toBeCalledTimes(0);
180+
expect(onFetchingChange).toBeCalledTimes(0);
181+
await cache.loadRecords([{ language: 'en' }]);
182+
expect(onLoadingChange).toBeCalledTimes(2);
183+
expect(onFetchingChange).toBeCalledTimes(2);
184+
cache.invalidate();
185+
await cache.loadRecords([{ language: 'en' }]);
186+
expect(onFetchingChange).toBeCalledTimes(4);
187+
expect(onLoadingChange).toBeCalledTimes(2);
188+
});
189+
});

0 commit comments

Comments
 (0)