Skip to content

Commit 2a5eefc

Browse files
committed
feat!: SDK version 6 (#3409)
BREAKING CHANGE: - cache now returning plain objects instead of maps - renamed and updated getRequiredRecords - onNsUpdate removed in favor of update event - useSuspense in rect TolgeeProvider is now off by default - TolgeeProvider for vue has now standardized API
1 parent b33f6c8 commit 2a5eefc

File tree

94 files changed

+1902
-2207
lines changed

Some content is hidden

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

94 files changed

+1902
-2207
lines changed

.prettierignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
**/build
22
**/dist
3-
**/lib
3+
./*/*/lib
44

55
**/*.json
66

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
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+
fetchingObserver,
67+
loadingObserver
68+
);
69+
});
70+
71+
it('fetches language with default namespace', async () => {
72+
const result = await cache.loadRecords([{ language: 'en' }]);
73+
expect(result[0].data).toEqual({
74+
language: 'en',
75+
namespace: '',
76+
data: 'Dev',
77+
});
78+
});
79+
80+
it('fetches language with specified namespace', async () => {
81+
const result = await cache.loadRecords([
82+
{ language: 'en', namespace: 'test' },
83+
]);
84+
expect(result[0].data).toEqual({
85+
language: 'en',
86+
namespace: 'test',
87+
data: 'Dev',
88+
});
89+
});
90+
91+
it('fetches language with specified namespace', async () => {
92+
const result = await cache.loadRecords([
93+
{ language: 'en', namespace: 'test' },
94+
]);
95+
expect(result[0].data).toEqual({
96+
language: 'en',
97+
namespace: 'test',
98+
data: 'Dev',
99+
});
100+
});
101+
102+
it('uses cache when fetching twice the same thing', async () => {
103+
await cache.loadRecords([{ language: 'en' }]);
104+
expect(mockedBackendGetDevRecord).toBeCalledTimes(1);
105+
const result = await cache.loadRecords([{ language: 'en' }], {
106+
useCache: true,
107+
});
108+
expect(mockedBackendGetDevRecord).toBeCalledTimes(1);
109+
expect(result[0].data).toEqual({
110+
language: 'en',
111+
namespace: '',
112+
data: 'Dev',
113+
});
114+
});
115+
116+
it('uses cache when fetching twice production data', async () => {
117+
await cache.loadRecords([{ language: 'en' }], { noDev: true });
118+
expect(mockedBackendGetRecord).toBeCalledTimes(1);
119+
const result = await cache.loadRecords([{ language: 'en' }], {
120+
noDev: true,
121+
useCache: true,
122+
});
123+
expect(mockedBackendGetRecord).toBeCalledTimes(1);
124+
expect(result[0].data).toEqual({
125+
language: 'en',
126+
namespace: '',
127+
data: 'Prod',
128+
});
129+
});
130+
131+
it('does not use cache when `noCache` is on', async () => {
132+
await cache.loadRecords([{ language: 'en' }]);
133+
expect(mockedBackendGetDevRecord).toBeCalledTimes(1);
134+
await cache.loadRecords([{ language: 'en' }]);
135+
expect(mockedBackendGetDevRecord).toBeCalledTimes(2);
136+
});
137+
138+
it('correctly returns combination of non-cached and cached', async () => {
139+
await cache.loadRecords([{ language: 'en' }]);
140+
expect(mockedBackendGetDevRecord).toBeCalledTimes(1);
141+
const result = await cache.loadRecords(
142+
[{ language: 'en' }, { language: 'en', namespace: 'new' }],
143+
{ useCache: true }
144+
);
145+
expect(mockedBackendGetDevRecord).toBeCalledTimes(2);
146+
expect(result).toEqual([
147+
{
148+
cacheKey: 'en',
149+
data: { data: 'Dev', language: 'en', namespace: '' },
150+
language: 'en',
151+
namespace: '',
152+
},
153+
{
154+
cacheKey: 'en:new',
155+
data: { data: 'Dev', language: 'en', namespace: 'new' },
156+
language: 'en',
157+
namespace: 'new',
158+
},
159+
]);
160+
});
161+
162+
it('correctly refetches dev data', async () => {
163+
await cache.loadRecords([{ language: 'en' }], { noDev: true });
164+
expect(mockedBackendGetRecord).toBeCalledTimes(1);
165+
expect(mockedBackendGetDevRecord).toBeCalledTimes(0);
166+
cache.invalidate();
167+
const result = await cache.loadRecords([{ language: 'en' }]);
168+
expect(mockedBackendGetRecord).toBeCalledTimes(1);
169+
expect(mockedBackendGetDevRecord).toBeCalledTimes(1);
170+
expect(result[0].data).toEqual({
171+
language: 'en',
172+
namespace: '',
173+
data: 'Dev',
174+
});
175+
});
176+
177+
it('correctly notifies about fetching and loading', async () => {
178+
expect(onLoadingChange).toBeCalledTimes(0);
179+
expect(onFetchingChange).toBeCalledTimes(0);
180+
await cache.loadRecords([{ language: 'en' }]);
181+
expect(onLoadingChange).toBeCalledTimes(2);
182+
expect(onFetchingChange).toBeCalledTimes(2);
183+
cache.invalidate();
184+
await cache.loadRecords([{ language: 'en' }]);
185+
expect(onFetchingChange).toBeCalledTimes(4);
186+
expect(onLoadingChange).toBeCalledTimes(2);
187+
});
188+
});

0 commit comments

Comments
 (0)