Skip to content

Commit

Permalink
[FSSDK-10439] provider coverage increased
Browse files Browse the repository at this point in the history
  • Loading branch information
junaed-optimizely committed Sep 2, 2024
1 parent a0e1b57 commit eee3ef1
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 19 deletions.
107 changes: 89 additions & 18 deletions src/Provider.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,37 +17,67 @@
/// <reference types="jest" />

import React from 'react';
import { render } from '@testing-library/react';
import { render, waitFor } from '@testing-library/react';
import { OptimizelyProvider } from './Provider';
import { DefaultUser, ReactSDKClient } from './client';
import { getLogger } from '@optimizely/optimizely-sdk';

jest.mock('@optimizely/optimizely-sdk', () => {
const originalModule = jest.requireActual('@optimizely/optimizely-sdk');
return {
...originalModule,
getLogger: jest.fn().mockReturnValue({
error: jest.fn(),
warn: jest.fn(),
info: jest.fn(),
debug: jest.fn(),
}),
};
});

const logger = getLogger('<OptimizelyProvider>');

describe('OptimizelyProvider', () => {
let mockReactClient: ReactSDKClient;

const user1 = {
id: 'user1',
attributes: { attr1: 'value1' },
};
beforeEach(() => {
mockReactClient = {
user: {
id: 'test-id',
attributes: {},
},
user: user1,
setUser: jest.fn().mockResolvedValue(undefined),
} as unknown as ReactSDKClient;
});

it('should log error if optimizely is not provided', async () => {
// @ts-ignore
render(<OptimizelyProvider optimizely={null} />);
expect(logger.error).toHaveBeenCalled();
});

it('should resolve user promise and set user in optimizely', async () => {
render(<OptimizelyProvider optimizely={mockReactClient} user={Promise.resolve(user1)} />);
await waitFor(() => expect(mockReactClient.setUser).toHaveBeenCalledWith(user1));
});

it('should render successfully with user provided', () => {
render(<OptimizelyProvider optimizely={mockReactClient} user={{ id: 'user1' }} />);
render(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);

expect(mockReactClient.setUser).toHaveBeenCalledWith({
id: 'user1',
attributes: {},
});
expect(mockReactClient.setUser).toHaveBeenCalledWith(user1);
});

it('should throw error, if setUser throws error', () => {
mockReactClient.setUser = jest.fn().mockRejectedValue(new Error('error'));
render(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);
expect(logger.error).toHaveBeenCalled();
});

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

expect(mockReactClient.setUser).toHaveBeenCalledWith({
id: 'user1',
id: user1.id,
attributes: {},
});
});
Expand All @@ -59,12 +89,9 @@ describe('OptimizelyProvider', () => {
});

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

expect(mockReactClient.setUser).toHaveBeenCalledWith({
id: 'user1',
attributes: { attr1: 'value1' },
});
expect(mockReactClient.setUser).toHaveBeenCalledWith(user1);
});

it('should succeed just userAttributes provided', () => {
Expand All @@ -75,4 +102,48 @@ describe('OptimizelyProvider', () => {
attributes: { attr1: 'value1' },
});
});

it('should not update when isServerSide is true', () => {
// Initial render
const { rerender } = render(<OptimizelyProvider optimizely={mockReactClient} isServerSide={true} user={user1} />);

// Reset mock to clear the initial constructor call
(mockReactClient.setUser as jest.Mock).mockClear();

// Re-render with same `isServerSide` value
rerender(<OptimizelyProvider optimizely={mockReactClient} isServerSide={true} user={user1} />);

expect(mockReactClient.setUser).not.toHaveBeenCalled();
});

it('should set user if optimizely.user.id is not set', () => {
mockReactClient.user = { id: '', attributes: {} };
const { rerender } = render(<OptimizelyProvider optimizely={mockReactClient} />);

// Change props to trigger componentDidUpdate
rerender(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);

expect(mockReactClient.setUser).toHaveBeenCalledWith(user1);
});

it('should update user if users are not equal', () => {
const user2 = { id: 'user-2', attributes: {} };

const { rerender } = render(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);

// Change props to a different user to trigger componentDidUpdate
rerender(<OptimizelyProvider optimizely={mockReactClient} user={user2} />);

expect(mockReactClient.setUser).toHaveBeenCalledWith(user2);
});

it('should not update user if users are equal', () => {
const { rerender } = render(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);
// Reset mock to clear the initial constructor call
(mockReactClient.setUser as jest.Mock).mockClear();
// Change props with the same user to trigger componentDidUpdate
rerender(<OptimizelyProvider optimizely={mockReactClient} user={user1} />);

expect(mockReactClient.setUser).not.toHaveBeenCalled();
});
});
1 change: 0 additions & 1 deletion src/client.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ describe('ReactSDKClient', () => {
let createInstanceSpy: jest.Mock<optimizely.Client, [optimizely.Config]>;
let instance: ReactSDKClient;
const setupUserContext = async () => {
// const userId = 'user1';
jest.spyOn(mockOptimizelyUserContext, 'getUserId').mockReturnValue(userId);
instance = createInstance(config);
await instance.setUser({
Expand Down

0 comments on commit eee3ef1

Please sign in to comment.