Skip to content

Commit 864fdcc

Browse files
authored
refactor: Return ReactSDKClient interface from createInstance instead of implementation class (#148)
### Summary Return type of createInstance was OptimizelyReactSDKClient which is the implementation class. Changed it to the ReactSDKClient interface instead. ### Test Plan - Manually tested thoroughly. - All existing unit tests pass. ### Issues #49
1 parent 5e5e459 commit 864fdcc

File tree

3 files changed

+13
-4
lines changed

3 files changed

+13
-4
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
77

88
## [Unreleased]
99

10+
### Enhancements
11+
- fixed issue [#49](https://github.com/optimizely/react-sdk/issues/49): Return type of `createInstance` was `OptimizelyReactSDKClient` which is the implementation class. Changed it to the `ReactSDKClient` interface instead ([#148](https://github.com/optimizely/react-sdk/pull/148)).
12+
1013
## [2.8.0] - January 26, 2022
1114

1215
### New Features

src/client.spec.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ jest.mock('@optimizely/optimizely-sdk');
1818
import * as optimizely from '@optimizely/optimizely-sdk';
1919

2020
import { createInstance, OnReadyResult, ReactSDKClient } from './client';
21+
interface MockedReactSDKClient extends ReactSDKClient {
22+
client: optimizely.Client;
23+
initialConfig: optimizely.Config;
24+
}
2125

2226
describe('ReactSDKClient', () => {
2327
const config: optimizely.Config = {
@@ -79,7 +83,7 @@ describe('ReactSDKClient', () => {
7983

8084
it('provides the initial config object via the initialConfig property', () => {
8185
const instance = createInstance(config);
82-
expect(instance.initialConfig).toEqual(config);
86+
expect((instance as MockedReactSDKClient).initialConfig).toEqual(config);
8387
});
8488

8589
it('provides a default user object', () => {
@@ -94,7 +98,7 @@ describe('ReactSDKClient', () => {
9498
const instance = createInstance(config);
9599
expect(createInstanceSpy).toBeCalledTimes(1);
96100
expect(createInstanceSpy.mock.results[0].type).toBe('return');
97-
expect(createInstanceSpy.mock.results[0].value).toBe(instance.client);
101+
expect(createInstanceSpy.mock.results[0].value).toBe((instance as MockedReactSDKClient).client);
98102
});
99103

100104
it('adds react-sdk clientEngine and clientVersion to the config, and passed the config to createInstance', () => {
@@ -109,7 +113,7 @@ describe('ReactSDKClient', () => {
109113

110114
it('provides access to the underlying client notificationCenter', () => {
111115
const instance = createInstance(config);
112-
expect(instance.notificationCenter).toBe(instance.client.notificationCenter);
116+
expect(instance.notificationCenter).toBe((instance as MockedReactSDKClient).client.notificationCenter);
113117
});
114118

115119
describe('onReady', () => {

src/client.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ export interface ReactSDKClient extends Omit<optimizely.Client, 'createUserConte
168168
removeAllForcedDecisions(): boolean;
169169

170170
removeForcedDecision(decisionContext: optimizely.OptimizelyDecisionContext): boolean;
171+
172+
getForcedDecision(decisionContext: optimizely.OptimizelyDecisionContext): optimizely.OptimizelyForcedDecision | null;
171173
}
172174

173175
export const DEFAULT_ON_READY_TIMEOUT = 5000;
@@ -921,6 +923,6 @@ class OptimizelyReactSDKClient implements ReactSDKClient {
921923
}
922924
}
923925

924-
export function createInstance(config: optimizely.Config): OptimizelyReactSDKClient {
926+
export function createInstance(config: optimizely.Config): ReactSDKClient {
925927
return new OptimizelyReactSDKClient(config);
926928
}

0 commit comments

Comments
 (0)