17
17
/// <reference types="jest" />
18
18
19
19
import React from 'react' ;
20
- import { render } from '@testing-library/react' ;
20
+ import { render , waitFor } from '@testing-library/react' ;
21
21
import { OptimizelyProvider } from './Provider' ;
22
22
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>' ) ;
23
39
24
40
describe ( 'OptimizelyProvider' , ( ) => {
25
41
let mockReactClient : ReactSDKClient ;
26
-
42
+ const user1 = {
43
+ id : 'user1' ,
44
+ attributes : { attr1 : 'value1' } ,
45
+ } ;
27
46
beforeEach ( ( ) => {
28
47
mockReactClient = {
29
- user : {
30
- id : 'test-id' ,
31
- attributes : { } ,
32
- } ,
48
+ user : user1 ,
33
49
setUser : jest . fn ( ) . mockResolvedValue ( undefined ) ,
34
50
} as unknown as ReactSDKClient ;
35
51
} ) ;
36
52
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
+
37
64
it ( 'should render successfully with user provided' , ( ) => {
38
- render ( < OptimizelyProvider optimizely = { mockReactClient } user = { { id : ' user1' } } /> ) ;
65
+ render ( < OptimizelyProvider optimizely = { mockReactClient } user = { user1 } /> ) ;
39
66
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 ( ) ;
44
74
} ) ;
45
75
46
76
it ( 'should render successfully with userId provided' , ( ) => {
47
- render ( < OptimizelyProvider optimizely = { mockReactClient } userId = " user1" /> ) ;
77
+ render ( < OptimizelyProvider optimizely = { mockReactClient } userId = { user1 . id } /> ) ;
48
78
49
79
expect ( mockReactClient . setUser ) . toHaveBeenCalledWith ( {
50
- id : ' user1' ,
80
+ id : user1 . id ,
51
81
attributes : { } ,
52
82
} ) ;
53
83
} ) ;
@@ -59,12 +89,9 @@ describe('OptimizelyProvider', () => {
59
89
} ) ;
60
90
61
91
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 } /> ) ;
63
93
64
- expect ( mockReactClient . setUser ) . toHaveBeenCalledWith ( {
65
- id : 'user1' ,
66
- attributes : { attr1 : 'value1' } ,
67
- } ) ;
94
+ expect ( mockReactClient . setUser ) . toHaveBeenCalledWith ( user1 ) ;
68
95
} ) ;
69
96
70
97
it ( 'should succeed just userAttributes provided' , ( ) => {
@@ -75,4 +102,48 @@ describe('OptimizelyProvider', () => {
75
102
attributes : { attr1 : 'value1' } ,
76
103
} ) ;
77
104
} ) ;
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
+ } ) ;
78
149
} ) ;
0 commit comments