Skip to content

Commit eee3ef1

Browse files
[FSSDK-10439] provider coverage increased
1 parent a0e1b57 commit eee3ef1

File tree

2 files changed

+89
-19
lines changed

2 files changed

+89
-19
lines changed

src/Provider.spec.tsx

Lines changed: 89 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,37 +17,67 @@
1717
/// <reference types="jest" />
1818

1919
import React from 'react';
20-
import { render } from '@testing-library/react';
20+
import { render, waitFor } from '@testing-library/react';
2121
import { OptimizelyProvider } from './Provider';
2222
import { DefaultUser, ReactSDKClient } from './client';
23+
import { getLogger } from '@optimizely/optimizely-sdk';
24+
25+
jest.mock('@optimizely/optimizely-sdk', () => {
26+
const originalModule = jest.requireActual('@optimizely/optimizely-sdk');
27+
return {
28+
...originalModule,
29+
getLogger: jest.fn().mockReturnValue({
30+
error: jest.fn(),
31+
warn: jest.fn(),
32+
info: jest.fn(),
33+
debug: jest.fn(),
34+
}),
35+
};
36+
});
37+
38+
const logger = getLogger('<OptimizelyProvider>');
2339

2440
describe('OptimizelyProvider', () => {
2541
let mockReactClient: ReactSDKClient;
26-
42+
const user1 = {
43+
id: 'user1',
44+
attributes: { attr1: 'value1' },
45+
};
2746
beforeEach(() => {
2847
mockReactClient = {
29-
user: {
30-
id: 'test-id',
31-
attributes: {},
32-
},
48+
user: user1,
3349
setUser: jest.fn().mockResolvedValue(undefined),
3450
} as unknown as ReactSDKClient;
3551
});
3652

53+
it('should log error if optimizely is not provided', async () => {
54+
// @ts-ignore
55+
render(<OptimizelyProvider optimizely={null} />);
56+
expect(logger.error).toHaveBeenCalled();
57+
});
58+
59+
it('should resolve user promise and set user in optimizely', async () => {
60+
render(<OptimizelyProvider optimizely={mockReactClient} user={Promise.resolve(user1)} />);
61+
await waitFor(() => expect(mockReactClient.setUser).toHaveBeenCalledWith(user1));
62+
});
63+
3764
it('should render successfully with user provided', () => {
38-
render(<OptimizelyProvider optimizely={mockReactClient} user={{ id: 'user1' }} />);
65+
render(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);
3966

40-
expect(mockReactClient.setUser).toHaveBeenCalledWith({
41-
id: 'user1',
42-
attributes: {},
43-
});
67+
expect(mockReactClient.setUser).toHaveBeenCalledWith(user1);
68+
});
69+
70+
it('should throw error, if setUser throws error', () => {
71+
mockReactClient.setUser = jest.fn().mockRejectedValue(new Error('error'));
72+
render(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);
73+
expect(logger.error).toHaveBeenCalled();
4474
});
4575

4676
it('should render successfully with userId provided', () => {
47-
render(<OptimizelyProvider optimizely={mockReactClient} userId="user1" />);
77+
render(<OptimizelyProvider optimizely={mockReactClient} userId={user1.id} />);
4878

4979
expect(mockReactClient.setUser).toHaveBeenCalledWith({
50-
id: 'user1',
80+
id: user1.id,
5181
attributes: {},
5282
});
5383
});
@@ -59,12 +89,9 @@ describe('OptimizelyProvider', () => {
5989
});
6090

6191
it('should render successfully with user id & attributes provided', () => {
62-
render(<OptimizelyProvider optimizely={mockReactClient} user={{ id: 'user1', attributes: { attr1: 'value1' } }} />);
92+
render(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);
6393

64-
expect(mockReactClient.setUser).toHaveBeenCalledWith({
65-
id: 'user1',
66-
attributes: { attr1: 'value1' },
67-
});
94+
expect(mockReactClient.setUser).toHaveBeenCalledWith(user1);
6895
});
6996

7097
it('should succeed just userAttributes provided', () => {
@@ -75,4 +102,48 @@ describe('OptimizelyProvider', () => {
75102
attributes: { attr1: 'value1' },
76103
});
77104
});
105+
106+
it('should not update when isServerSide is true', () => {
107+
// Initial render
108+
const { rerender } = render(<OptimizelyProvider optimizely={mockReactClient} isServerSide={true} user={user1} />);
109+
110+
// Reset mock to clear the initial constructor call
111+
(mockReactClient.setUser as jest.Mock).mockClear();
112+
113+
// Re-render with same `isServerSide` value
114+
rerender(<OptimizelyProvider optimizely={mockReactClient} isServerSide={true} user={user1} />);
115+
116+
expect(mockReactClient.setUser).not.toHaveBeenCalled();
117+
});
118+
119+
it('should set user if optimizely.user.id is not set', () => {
120+
mockReactClient.user = { id: '', attributes: {} };
121+
const { rerender } = render(<OptimizelyProvider optimizely={mockReactClient} />);
122+
123+
// Change props to trigger componentDidUpdate
124+
rerender(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);
125+
126+
expect(mockReactClient.setUser).toHaveBeenCalledWith(user1);
127+
});
128+
129+
it('should update user if users are not equal', () => {
130+
const user2 = { id: 'user-2', attributes: {} };
131+
132+
const { rerender } = render(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);
133+
134+
// Change props to a different user to trigger componentDidUpdate
135+
rerender(<OptimizelyProvider optimizely={mockReactClient} user={user2} />);
136+
137+
expect(mockReactClient.setUser).toHaveBeenCalledWith(user2);
138+
});
139+
140+
it('should not update user if users are equal', () => {
141+
const { rerender } = render(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);
142+
// Reset mock to clear the initial constructor call
143+
(mockReactClient.setUser as jest.Mock).mockClear();
144+
// Change props with the same user to trigger componentDidUpdate
145+
rerender(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);
146+
147+
expect(mockReactClient.setUser).not.toHaveBeenCalled();
148+
});
78149
});

src/client.spec.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ describe('ReactSDKClient', () => {
5252
let createInstanceSpy: jest.Mock<optimizely.Client, [optimizely.Config]>;
5353
let instance: ReactSDKClient;
5454
const setupUserContext = async () => {
55-
// const userId = 'user1';
5655
jest.spyOn(mockOptimizelyUserContext, 'getUserId').mockReturnValue(userId);
5756
instance = createInstance(config);
5857
await instance.setUser({

0 commit comments

Comments
 (0)