Skip to content

Commit 637934a

Browse files
update unit tests for useSplitTreatments
1 parent d98568f commit 637934a

3 files changed

Lines changed: 23 additions & 12 deletions

File tree

src/SplitClient.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export class SplitComponent extends React.Component<IUpdateProps & { factory: Sp
8383
}
8484
}
8585

86-
// NOTE: assuming that SDK events are scatered enough in time, so that Date.now() result is unique per event and triggers an update
86+
// NOTE: assuming that SDK events are scattered in time so that Date.now() timestamps are unique per event and trigger an update
8787
setReady = () => {
8888
if (this.props.updateOnSdkReady) this.setState({ lastUpdate: Date.now() });
8989
}

src/__tests__/useSplitTreatments.test.tsx

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { SplitTreatments } from '../SplitTreatments';
1616
import { SplitContext } from '../SplitContext';
1717
import { ISplitTreatmentsChildProps } from '../types';
1818

19-
function validateTreatments({ treatments, isReady, isReadyFromCache}: ISplitTreatmentsChildProps) {
19+
function validateTreatments({ treatments, isReady, isReadyFromCache }: ISplitTreatmentsChildProps) {
2020
if (isReady || isReadyFromCache) {
2121
expect(treatments).toEqual({
2222
split_test: {
@@ -34,12 +34,12 @@ function validateTreatments({ treatments, isReady, isReadyFromCache}: ISplitTrea
3434
}
3535
}
3636

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

42-
let countSplitContext = 0, countSplitTreatments = 0, countUseSplitTreatments = 0, countUseSplitTreatmentsUser2 = 0;
42+
let countSplitContext = 0, countSplitTreatments = 0, countUseSplitTreatments = 0, countUseSplitTreatmentsUser2 = 0, countUseSplitTreatmentsUser2WithUpdate = 0;
4343

4444
render(
4545
<SplitFactory factory={outerFactory} >
@@ -51,7 +51,7 @@ test('useSplitTreatments', () => {
5151
{() => { countSplitTreatments++; return null }}
5252
</SplitTreatments>
5353
{React.createElement(() => {
54-
const context = useSplitTreatments(['split_test'], { att1: 'att1' } );
54+
const context = useSplitTreatments(['split_test'], { att1: 'att1' });
5555
expect(context.client).toBe(mainClient); // Assert that the main client was retrieved.
5656
validateTreatments(context);
5757
countUseSplitTreatments++;
@@ -64,16 +64,24 @@ test('useSplitTreatments', () => {
6464
countUseSplitTreatmentsUser2++;
6565
return null;
6666
})}
67+
{React.createElement(() => {
68+
const context = useSplitTreatments(['split_test'], undefined, 'user_2', { updateOnSdkUpdate: true });
69+
expect(context.client).toBe(user2Client);
70+
validateTreatments(context);
71+
countUseSplitTreatmentsUser2WithUpdate++;
72+
return null;
73+
})}
6774
</>
6875
</SplitFactory>
6976
);
7077

71-
act(() => mainClient.__emitter__.emit(Event.SDK_READY_FROM_CACHE));
72-
act(() => mainClient.__emitter__.emit(Event.SDK_READY));
73-
act(() => mainClient.__emitter__.emit(Event.SDK_UPDATE));
74-
act(() => user2Client.__emitter__.emit(Event.SDK_READY_FROM_CACHE));
75-
act(() => user2Client.__emitter__.emit(Event.SDK_READY));
76-
act(() => user2Client.__emitter__.emit(Event.SDK_UPDATE));
78+
// Awaiting to make sure each event is processed with a different lastUpdate timestamp.
79+
await act(() => mainClient.__emitter__.emit(Event.SDK_READY_FROM_CACHE));
80+
await act(() => mainClient.__emitter__.emit(Event.SDK_READY));
81+
await act(() => mainClient.__emitter__.emit(Event.SDK_UPDATE));
82+
await act(() => user2Client.__emitter__.emit(Event.SDK_READY_FROM_CACHE));
83+
await act(() => user2Client.__emitter__.emit(Event.SDK_READY));
84+
await act(() => user2Client.__emitter__.emit(Event.SDK_UPDATE));
7785

7886
// SplitContext renders 3 times: initially, when ready from cache, and when ready.
7987
expect(countSplitContext).toEqual(3);
@@ -86,6 +94,8 @@ test('useSplitTreatments', () => {
8694

8795
// 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.
8896
expect(countUseSplitTreatmentsUser2).toEqual(countSplitContext + 2);
89-
expect(user2Client.getTreatmentsWithConfig).toHaveBeenCalledTimes(2);
97+
// If it is used with `updateOnSdkUpdate: true`, it also renders when the client emits an SDK_UPDATE event.
98+
expect(countUseSplitTreatmentsUser2WithUpdate).toEqual(countSplitContext + 3);
99+
expect(user2Client.getTreatmentsWithConfig).toHaveBeenCalledTimes(5);
90100
expect(user2Client.getTreatmentsWithConfig).toHaveBeenLastCalledWith(['split_test'], undefined);
91101
});

src/useSplitClient.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export function useSplitClient(key?: SplitIO.SplitKey, trafficType?: string, att
3737
const [lastUpdate, setLastUpdate] = React.useState(client === contextClient ? context.lastUpdate : 0);
3838

3939
// Handle client events
40+
// NOTE: assuming that SDK events are scattered in time so that Date.now() timestamps are unique per event and trigger an update
4041
React.useEffect(() => {
4142
const setReady = () => {
4243
if (options.updateOnSdkReady) setLastUpdate(Date.now());

0 commit comments

Comments
 (0)