diff --git a/src/client.spec.ts b/src/client.spec.ts index 8fe0b6a..ccf6aaa 100644 --- a/src/client.spec.ts +++ b/src/client.spec.ts @@ -148,12 +148,14 @@ describe('ReactSDKClient', () => { it('fulfills the returned promise with success: true when a user is set', async () => { jest.spyOn(mockInnerClient, 'onReady').mockResolvedValue({ success: true }); const instance = createInstance(config); + jest.spyOn(instance, 'fetchQualifiedSegments').mockResolvedValue(true); + await instance.setUser({ id: 'user12345', }); const result = await instance.onReady(); - + expect(result.success).toBe(true); }); @@ -194,18 +196,18 @@ describe('ReactSDKClient', () => { it('waits for the inner client onReady to fulfill with success = false before fulfilling the returned promise', async () => { const mockInnerClientOnReady = jest.spyOn(mockInnerClient, 'onReady'); - let resolveInnerClientOnReady: (result: OnReadyResult) => void; + let resolveInnerClientOnReady: (result: OnReadyResult) => void = () => {}; const mockReadyPromise: Promise = new Promise(res => { resolveInnerClientOnReady = res; }); mockInnerClientOnReady.mockReturnValueOnce(mockReadyPromise); const userId = 'user999'; jest.spyOn(mockOptimizelyUserContext, 'getUserId').mockReturnValue(userId); + resolveInnerClientOnReady({ success: true }); await instance.setUser({ id: userId, }); - resolveInnerClientOnReady!({ success: true }); const result = await instance.onReady(); expect(result.success).toBe(false); @@ -285,7 +287,7 @@ describe('ReactSDKClient', () => { expect(onUserUpdateListener).toBeCalledTimes(1); }); - it('does not call fetchqualifiedsegements on setUser if onready is not called initially', async () => { + it('implicitly calls fetchqualifiedsegements', async () => { const instance = createInstance(config); jest.spyOn(instance, 'fetchQualifiedSegments').mockResolvedValue(true); @@ -293,7 +295,7 @@ describe('ReactSDKClient', () => { id: 'xxfueaojfe8&86', }); - expect(instance.fetchQualifiedSegments).toBeCalledTimes(0); + expect(instance.fetchQualifiedSegments).toBeCalledTimes(1); }); it('calls fetchqualifiedsegements internally on each setuser call after onready', async () => { diff --git a/src/client.ts b/src/client.ts index a9c3e43..dfa2845 100644 --- a/src/client.ts +++ b/src/client.ts @@ -372,8 +372,8 @@ class OptimizelyReactSDKClient implements ReactSDKClient { attributes: userInfo.attributes || DefaultUser.attributes, }; - // if user is anonymous... - if (userInfo.id === DefaultUser.id) { + let fetchQualifedSegmentsSucceed = false; + if (userInfo.id === DefaultUser.id) { // if user is anonymous... // wait for the SDK client to be ready before await this._client?.onReady(); // setting the user context @@ -381,25 +381,18 @@ class OptimizelyReactSDKClient implements ReactSDKClient { this.user.id = this.userContext?.getUserId() || DefaultUser.id; - if (this.isClientReady) { - this.fetchQualifiedSegments(); - } + fetchQualifedSegmentsSucceed = await this.fetchQualifiedSegments(); } else { - // otherwise if we have the user info, we can... - // create the user context this.setCurrentUserContext(userInfo); this.user.id = this.userContext?.getUserId() || DefaultUser.id; - // but we still have to wait for the client SDK to be ready - this._client?.onReady().then(() => { - // before we can fetch segments - this.fetchQualifiedSegments(); - }); + await this._client?.onReady(); + fetchQualifedSegmentsSucceed = await this.fetchQualifiedSegments(); } if (!this.isUserPromiseResolved) { - this.userPromiseResolver({ success: true }); + this.userPromiseResolver({ success: fetchQualifedSegmentsSucceed }); this.isUserPromiseResolved = true; }