Skip to content

Commit 2fdf2f0

Browse files
added optimization tests
1 parent 8345e49 commit 2fdf2f0

3 files changed

Lines changed: 36 additions & 39 deletions

File tree

src/__tests__/SplitTreatments.test.tsx

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ jest.mock('../constants', () => {
2525
import { getControlTreatmentsWithConfig, WARN_ST_NO_CLIENT } from '../constants';
2626
import { getStatus } from '../utils';
2727
import { newSplitFactoryLocalhostInstance } from './testUtils/utils';
28+
import { useSplitTreatments } from '../useSplitTreatments';
2829

2930
describe('SplitTreatments', () => {
3031

@@ -143,13 +144,26 @@ describe('SplitTreatments', () => {
143144

144145
});
145146

147+
let renderTimes = 0;
148+
146149
/**
147-
* Tests for asserting that client.getTreatmentsWithConfig is not called unnecessarely
150+
* Tests for asserting that client.getTreatmentsWithConfig is not called unnecessarily when using SplitTreatments and useSplitTreatments.
148151
*/
149-
describe('SplitTreatments optimization', () => {
150-
151-
let renderTimes = 0;
152-
152+
describe.each([
153+
({ names, attributes }) => (
154+
<SplitTreatments names={names} attributes={attributes} >
155+
{() => {
156+
renderTimes++;
157+
return null;
158+
}}
159+
</SplitTreatments>
160+
),
161+
({ names, attributes }) => {
162+
useSplitTreatments(names, attributes);
163+
renderTimes++;
164+
return null;
165+
}
166+
])('SplitTreatments & useSplitTreatments optimization', (InnerComponent) => {
153167
let outerFactory = SplitSdk(sdkBrowser);
154168
(outerFactory as any).client().__emitter__.emit(Event.SDK_READY);
155169

@@ -162,12 +176,7 @@ describe('SplitTreatments optimization', () => {
162176
return (
163177
<SplitFactory factory={outerFactory} >
164178
<SplitClient splitKey={splitKey} updateOnSdkUpdate={true} attributes={clientAttributes} >
165-
<SplitTreatments names={names} attributes={attributes} >
166-
{() => {
167-
renderTimes++;
168-
return null;
169-
}}
170-
</SplitTreatments>
179+
<InnerComponent names={names} attributes={attributes} />
171180
</SplitClient>
172181
</SplitFactory>
173182
);
@@ -224,7 +233,7 @@ describe('SplitTreatments optimization', () => {
224233
expect(outerFactory.client().getTreatmentsWithConfig).toBeCalledTimes(2);
225234
});
226235

227-
it('rerenders and re-evaluates feature flags if lastUpdate timestamp changes (e.g., SDK_UPDATE event).', (done) => {
236+
it('rerenders and re-evaluates feature flags if lastUpdate timestamp changes (e.g., SDK_UPDATE event).', () => {
228237
expect(renderTimes).toBe(1);
229238

230239
// State update and split evaluation
@@ -234,16 +243,13 @@ describe('SplitTreatments optimization', () => {
234243
(outerFactory as any).client().destroy();
235244
wrapper.rerender(<Component names={names} attributes={attributes} splitKey={splitKey} />);
236245

237-
setTimeout(() => {
238-
// Updates were batched as a single render, due to automatic batching https://reactjs.org/blog/2022/03/29/react-v18.html#new-feature-automatic-batching
239-
expect(renderTimes).toBe(3);
240-
expect(outerFactory.client().getTreatmentsWithConfig).toBeCalledTimes(2);
246+
// Updates were batched as a single render, due to automatic batching https://reactjs.org/blog/2022/03/29/react-v18.html#new-feature-automatic-batching
247+
expect(renderTimes).toBe(3);
248+
expect(outerFactory.client().getTreatmentsWithConfig).toBeCalledTimes(2);
241249

242-
// Restore the client to be READY
243-
(outerFactory as any).client().__restore();
244-
(outerFactory as any).client().__emitter__.emit(Event.SDK_READY);
245-
done();
246-
})
250+
// Restore the client to be READY
251+
(outerFactory as any).client().__restore();
252+
(outerFactory as any).client().__emitter__.emit(Event.SDK_READY);
247253
});
248254

249255
it('rerenders and re-evaluates feature flags if client changes.', () => {

src/__tests__/useSplitClient.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@ test('useSplitClient must update on SDK events', () => {
9797
);
9898

9999
act(() => mainClient.__emitter__.emit(Event.SDK_READY_FROM_CACHE));
100-
act(() => user2Client.__emitter__.emit(Event.SDK_READY_FROM_CACHE));
101100
act(() => mainClient.__emitter__.emit(Event.SDK_READY));
102-
act(() => user2Client.__emitter__.emit(Event.SDK_READY));
103101
act(() => mainClient.__emitter__.emit(Event.SDK_UPDATE));
102+
act(() => user2Client.__emitter__.emit(Event.SDK_READY_FROM_CACHE));
103+
act(() => user2Client.__emitter__.emit(Event.SDK_READY));
104104
act(() => user2Client.__emitter__.emit(Event.SDK_UPDATE));
105105

106106
// SplitContext renders 3 times: initially, when ready from cache, and when ready.

src/__tests__/useSplitTreatments.test.tsx

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,12 @@ function validateTreatments({ treatments, isReady, isReadyFromCache }: ISplitTre
3434
}
3535
}
3636

37-
test('useSplitTreatments', async () => {
37+
test('useSplitTreatments must update on SDK events', async () => {
3838
const outerFactory = SplitSdk(sdkBrowser);
3939
const mainClient = outerFactory.client() as any;
4040
const user2Client = outerFactory.client('user_2') as any;
4141

4242
let countSplitContext = 0, countSplitTreatments = 0, countUseSplitTreatments = 0, countUseSplitTreatmentsUser2 = 0, countUseSplitTreatmentsUser2WithUpdate = 0;
43-
const lastUpdateSetUser2 = new Set<number>();
44-
const lastUpdateSetUser2WithUpdate = new Set<number>();
4543

4644
render(
4745
<SplitFactory factory={outerFactory} >
@@ -63,31 +61,26 @@ test('useSplitTreatments', async () => {
6361
const context = useSplitTreatments(['split_test'], undefined, 'user_2');
6462
expect(context.client).toBe(user2Client);
6563
validateTreatments(context);
66-
lastUpdateSetUser2.add(context.lastUpdate);
6764
countUseSplitTreatmentsUser2++;
6865
return null;
6966
})}
7067
{React.createElement(() => {
7168
const context = useSplitTreatments(['split_test'], undefined, 'user_2', { updateOnSdkUpdate: true });
7269
expect(context.client).toBe(user2Client);
7370
validateTreatments(context);
74-
lastUpdateSetUser2WithUpdate.add(context.lastUpdate);
7571
countUseSplitTreatmentsUser2WithUpdate++;
7672
return null;
7773
})}
7874
</>
7975
</SplitFactory>
8076
);
8177

82-
// Adding a delay between events to make sure they are processed with a different lastUpdate timestamp.
83-
act(() => mainClient.__emitter__.emit(Event.SDK_READY_FROM_CACHE));
84-
act(() => user2Client.__emitter__.emit(Event.SDK_READY_FROM_CACHE));
85-
await new Promise(resolve => setTimeout(resolve, 10));
86-
act(() => mainClient.__emitter__.emit(Event.SDK_READY));
87-
act(() => user2Client.__emitter__.emit(Event.SDK_READY));
88-
await new Promise(resolve => setTimeout(resolve, 10));
89-
act(() => mainClient.__emitter__.emit(Event.SDK_UPDATE));
90-
act(() => user2Client.__emitter__.emit(Event.SDK_UPDATE));
78+
await act(() => mainClient.__emitter__.emit(Event.SDK_READY_FROM_CACHE));
79+
await act(() => mainClient.__emitter__.emit(Event.SDK_READY));
80+
await act(() => mainClient.__emitter__.emit(Event.SDK_UPDATE));
81+
await act(() => user2Client.__emitter__.emit(Event.SDK_READY_FROM_CACHE));
82+
await act(() => user2Client.__emitter__.emit(Event.SDK_READY));
83+
await act(() => user2Client.__emitter__.emit(Event.SDK_UPDATE));
9184

9285
// SplitContext renders 3 times: initially, when ready from cache, and when ready.
9386
expect(countSplitContext).toEqual(3);
@@ -100,10 +93,8 @@ test('useSplitTreatments', async () => {
10093

10194
// If useSplitTreatments uses a different client than the context one, it renders when the context renders and when the new client is ready and ready from cache.
10295
expect(countUseSplitTreatmentsUser2).toEqual(countSplitContext + 2);
103-
expect(lastUpdateSetUser2.size).toEqual(3);
10496
// If it is used with `updateOnSdkUpdate: true`, it also renders when the client emits an SDK_UPDATE event.
10597
expect(countUseSplitTreatmentsUser2WithUpdate).toEqual(countSplitContext + 3);
106-
expect(lastUpdateSetUser2WithUpdate.size).toEqual(4);
10798
expect(user2Client.getTreatmentsWithConfig).toHaveBeenCalledTimes(5);
10899
expect(user2Client.getTreatmentsWithConfig).toHaveBeenLastCalledWith(['split_test'], undefined);
109100
});

0 commit comments

Comments
 (0)