@@ -35,7 +35,8 @@ import { KeyName, PersistenceUserManager } from './persistence_user_manager';
35
35
chai . use ( sinonChai ) ;
36
36
37
37
function makePersistence (
38
- type = PersistenceType . NONE
38
+ type = PersistenceType . NONE ,
39
+ shouldAllowMigration = false
39
40
) : {
40
41
persistence : PersistenceInternal ;
41
42
stub : sinon . SinonStubbedInstance < PersistenceInternal > ;
@@ -49,7 +50,8 @@ function makePersistence(
49
50
} ,
50
51
_remove : async ( ) => { } ,
51
52
_addListener ( _key : string , _listener : StorageEventListener ) { } ,
52
- _removeListener ( _key : string , _listener : StorageEventListener ) { }
53
+ _removeListener ( _key : string , _listener : StorageEventListener ) { } ,
54
+ _shouldAllowMigration : shouldAllowMigration
53
55
} ;
54
56
55
57
const stub = sinon . stub ( persistence ) ;
@@ -69,7 +71,7 @@ describe('core/persistence/persistence_user_manager', () => {
69
71
expect ( manager . persistence ) . to . eq ( _getInstance ( inMemoryPersistence ) ) ;
70
72
} ) ;
71
73
72
- it ( 'chooses the first one available ' , async ( ) => {
74
+ it ( 'chooses the first one with a user ' , async ( ) => {
73
75
const a = makePersistence ( ) ;
74
76
const b = makePersistence ( ) ;
75
77
const c = makePersistence ( ) ;
@@ -78,11 +80,31 @@ describe('core/persistence/persistence_user_manager', () => {
78
80
a . stub . _isAvailable . resolves ( false ) ;
79
81
a . stub . _get . onFirstCall ( ) . resolves ( testUser ( auth , 'uid' ) . toJSON ( ) ) ;
80
82
b . stub . _isAvailable . resolves ( true ) ;
83
+ a . stub . _get . onFirstCall ( ) . resolves ( testUser ( auth , 'uid-b' ) . toJSON ( ) ) ;
81
84
82
85
const out = await PersistenceUserManager . create ( auth , search ) ;
83
86
expect ( a . stub . _isAvailable ) . to . have . been . calledOnce ;
84
87
expect ( b . stub . _isAvailable ) . to . have . been . calledOnce ;
85
- expect ( c . stub . _isAvailable ) . to . not . have . been . called ;
88
+ expect ( c . stub . _isAvailable ) . to . have . been . calledOnce ;
89
+
90
+ // a should not be chosen since it is not available (despite having a user).
91
+ expect ( out . persistence ) . to . eq ( a . persistence ) ;
92
+ } ) ;
93
+
94
+ it ( 'defaults to first available persistence if no user' , async ( ) => {
95
+ const a = makePersistence ( ) ;
96
+ const b = makePersistence ( ) ;
97
+ const c = makePersistence ( ) ;
98
+ const search = [ a . persistence , b . persistence , c . persistence ] ;
99
+ const auth = await testAuth ( ) ;
100
+ a . stub . _isAvailable . resolves ( false ) ;
101
+ b . stub . _isAvailable . resolves ( true ) ;
102
+ c . stub . _isAvailable . resolves ( true ) ;
103
+
104
+ const out = await PersistenceUserManager . create ( auth , search ) ;
105
+ expect ( a . stub . _isAvailable ) . to . have . been . calledOnce ;
106
+ expect ( b . stub . _isAvailable ) . to . have . been . calledOnce ;
107
+ expect ( c . stub . _isAvailable ) . to . have . been . calledOnce ;
86
108
87
109
// a should not be chosen since it is not available (despite having a user).
88
110
expect ( out . persistence ) . to . eq ( b . persistence ) ;
@@ -108,14 +130,16 @@ describe('core/persistence/persistence_user_manager', () => {
108
130
expect ( ( await out . getCurrentUser ( ) ) ! . uid ) . to . eq ( user . uid ) ;
109
131
} ) ;
110
132
111
- it ( 'migrate found user to the selected persistence and clear others ' , async ( ) => {
112
- const a = makePersistence ( ) ;
113
- const b = makePersistence ( ) ;
114
- const c = makePersistence ( ) ;
133
+ it ( 'migrate found user to higher order persistence, if applicable ' , async ( ) => {
134
+ const a = makePersistence ( PersistenceType . NONE , true ) ;
135
+ const b = makePersistence ( PersistenceType . NONE , true ) ;
136
+ const c = makePersistence ( PersistenceType . NONE , true ) ;
115
137
const search = [ a . persistence , b . persistence , c . persistence ] ;
116
138
const auth = await testAuth ( ) ;
117
139
const user = testUser ( auth , 'uid' ) ;
118
140
a . stub . _isAvailable . resolves ( true ) ;
141
+ b . stub . _isAvailable . resolves ( true ) ;
142
+ c . stub . _isAvailable . resolves ( true ) ;
119
143
b . stub . _get . resolves ( user . toJSON ( ) ) ;
120
144
c . stub . _get . resolves ( testUser ( auth , 'wrong-uid' ) . toJSON ( ) ) ;
121
145
@@ -143,8 +167,46 @@ describe('core/persistence/persistence_user_manager', () => {
143
167
expect ( ( await out . getCurrentUser ( ) ) ! . uid ) . to . eq ( user . uid ) ;
144
168
} ) ;
145
169
170
+ it ( 'migrate found user to available persistence, if applicable' , async ( ) => {
171
+ const a = makePersistence ( PersistenceType . NONE , true ) ;
172
+ const b = makePersistence ( PersistenceType . NONE , true ) ;
173
+ const c = makePersistence ( PersistenceType . NONE , true ) ;
174
+ const search = [ a . persistence , b . persistence , c . persistence ] ;
175
+ const auth = await testAuth ( ) ;
176
+ const user = testUser ( auth , 'uid' ) ;
177
+ a . stub . _isAvailable . resolves ( false ) ; // Important
178
+ b . stub . _isAvailable . resolves ( true ) ;
179
+ c . stub . _isAvailable . resolves ( true ) ;
180
+ a . stub . _get . resolves ( user . toJSON ( ) ) ;
181
+ c . stub . _get . resolves ( testUser ( auth , 'wrong-uid' ) . toJSON ( ) ) ;
182
+
183
+ let persistedUserInB : PersistenceValue | null = null ;
184
+ b . stub . _set . callsFake ( async ( _ , value ) => {
185
+ persistedUserInB = value ;
186
+ } ) ;
187
+ b . stub . _get . callsFake ( async ( ) => persistedUserInB ) ;
188
+
189
+ const out = await PersistenceUserManager . create ( auth , search ) ;
190
+ expect ( b . stub . _set ) . to . have . been . calledOnceWith (
191
+ 'firebase:authUser:test-api-key:test-app' ,
192
+ user . toJSON ( )
193
+ ) ;
194
+ expect ( a . stub . _set ) . to . not . have . been . called ;
195
+ expect ( c . stub . _set ) . to . not . have . been . called ;
196
+ expect ( a . stub . _remove ) . to . have . been . calledOnceWith (
197
+ 'firebase:authUser:test-api-key:test-app'
198
+ ) ;
199
+ expect ( c . stub . _remove ) . to . have . been . calledOnceWith (
200
+ 'firebase:authUser:test-api-key:test-app'
201
+ ) ;
202
+
203
+ expect ( out . persistence ) . to . eq ( b . persistence ) ;
204
+ expect ( ( await out . getCurrentUser ( ) ) ! . uid ) . to . eq ( user . uid ) ;
205
+ } ) ;
206
+
146
207
it ( 'uses default user key if none provided' , async ( ) => {
147
208
const { stub, persistence } = makePersistence ( ) ;
209
+ stub . _isAvailable . resolves ( true ) ;
148
210
await PersistenceUserManager . create ( auth , [ persistence ] ) ;
149
211
expect ( stub . _get ) . to . have . been . calledWith (
150
212
'firebase:authUser:test-api-key:test-app'
@@ -153,6 +215,7 @@ describe('core/persistence/persistence_user_manager', () => {
153
215
154
216
it ( 'uses user key if provided' , async ( ) => {
155
217
const { stub, persistence } = makePersistence ( ) ;
218
+ stub . _isAvailable . resolves ( true ) ;
156
219
await PersistenceUserManager . create (
157
220
auth ,
158
221
[ persistence ] ,
@@ -176,7 +239,7 @@ describe('core/persistence/persistence_user_manager', () => {
176
239
expect ( out . persistence ) . to . eq ( _getInstance ( inMemoryPersistence ) ) ;
177
240
expect ( a . stub . _get ) . to . have . been . calledOnce ;
178
241
expect ( b . stub . _get ) . to . have . been . calledOnce ;
179
- expect ( c . stub . _get ) . to . have . been . called ;
242
+ expect ( c . stub . _get ) . to . have . been . calledOnce ;
180
243
} ) ;
181
244
} ) ;
182
245
@@ -235,10 +298,8 @@ describe('core/persistence/persistence_user_manager', () => {
235
298
} ) ;
236
299
237
300
it ( 'removes current user & sets it in the new persistene' , async ( ) => {
238
- const {
239
- persistence : nextPersistence ,
240
- stub : nextStub
241
- } = makePersistence ( ) ;
301
+ const { persistence : nextPersistence , stub : nextStub } =
302
+ makePersistence ( ) ;
242
303
const auth = await testAuth ( ) ;
243
304
const user = testUser ( auth , 'uid' ) ;
244
305
persistenceStub . _get . returns ( Promise . resolve ( user . toJSON ( ) ) ) ;
@@ -259,10 +320,8 @@ describe('core/persistence/persistence_user_manager', () => {
259
320
const user = testUser ( auth , 'uid' ) ;
260
321
stub . _get . returns ( Promise . resolve ( user . toJSON ( ) ) ) ;
261
322
262
- const {
263
- persistence : nextPersistence ,
264
- stub : nextStub
265
- } = makePersistence ( PersistenceType . LOCAL ) ;
323
+ const { persistence : nextPersistence , stub : nextStub } =
324
+ makePersistence ( PersistenceType . LOCAL ) ;
266
325
267
326
// This should migrate the user even if both has type LOCAL. For example, developer may want
268
327
// to switch from localStorage to indexedDB (both type LOCAL) and we should honor that.
0 commit comments