@@ -46,8 +46,12 @@ import { mockEndpointWithParams } from '../../../test/helpers/api/helper';
46
46
import { Endpoint , RecaptchaClientType , RecaptchaVersion } from '../../api' ;
47
47
import * as mockFetch from '../../../test/helpers/mock_fetch' ;
48
48
import { AuthErrorCode } from '../errors' ;
49
- import { PasswordValidationStatus } from '../../model/public_types' ;
49
+ import {
50
+ FirebaseToken ,
51
+ PasswordValidationStatus
52
+ } from '../../model/public_types' ;
50
53
import { PasswordPolicyImpl } from './password_policy_impl' ;
54
+ import { PersistenceUserManager } from '../persistence/persistence_user_manager' ;
51
55
52
56
use ( sinonChai ) ;
53
57
use ( chaiAsPromised ) ;
@@ -150,6 +154,153 @@ describe('core/auth/auth_impl', () => {
150
154
} ) ;
151
155
} ) ;
152
156
157
+ describe ( '#updateFirebaseToken' , ( ) => {
158
+ const token : FirebaseToken = {
159
+ token : 'test-token' ,
160
+ expirationTime : 123456789
161
+ } ;
162
+
163
+ it ( 'sets the field on the auth object' , async ( ) => {
164
+ await auth . _updateFirebaseToken ( token ) ;
165
+ expect ( ( auth as any ) . firebaseToken ) . to . eql ( token ) ;
166
+ } ) ;
167
+
168
+ it ( 'calls persistence._set with correct values' , async ( ) => {
169
+ await auth . _updateFirebaseToken ( token ) ;
170
+ expect ( persistenceStub . _set ) . to . have . been . calledWith (
171
+ 'firebase:persistence-token:api-key:test-app' , // key
172
+ {
173
+ token : token . token ,
174
+ expirationTime : token . expirationTime
175
+ }
176
+ ) ;
177
+ } ) ;
178
+
179
+ it ( 'setting to null triggers persistence._remove' , async ( ) => {
180
+ await auth . _updateFirebaseToken ( null ) ;
181
+ expect ( persistenceStub . _remove ) . to . have . been . calledWith (
182
+ 'firebase:persistence-token:api-key:test-app'
183
+ ) ;
184
+ } ) ;
185
+
186
+ it ( 'orders async updates correctly' , async ( ) => {
187
+ const tokens : FirebaseToken [ ] = Array . from ( { length : 5 } , ( _ , i ) => ( {
188
+ token : `token-${ i } ` ,
189
+ expirationTime : Date . now ( ) + i
190
+ } ) ) ;
191
+
192
+ persistenceStub . _set . callsFake ( ( ) => {
193
+ return new Promise ( resolve => {
194
+ setTimeout ( ( ) => resolve ( ) , 1 ) ;
195
+ } ) ;
196
+ } ) ;
197
+
198
+ await Promise . all ( tokens . map ( t => auth . _updateFirebaseToken ( t ) ) ) ;
199
+
200
+ for ( let i = 0 ; i < tokens . length ; i ++ ) {
201
+ expect ( persistenceStub . _set . getCall ( i ) ) . to . have . been . calledWith (
202
+ 'firebase:persistence-token:api-key:test-app' ,
203
+ {
204
+ token : tokens [ i ] . token ,
205
+ expirationTime : tokens [ i ] . expirationTime
206
+ }
207
+ ) ;
208
+ }
209
+ } ) ;
210
+
211
+ it ( 'throws if persistence._set fails' , async ( ) => {
212
+ persistenceStub . _set . rejects ( new Error ( 'fail' ) ) ;
213
+ await expect ( auth . _updateFirebaseToken ( token ) ) . to . be . rejectedWith ( 'fail' ) ;
214
+ } ) ;
215
+
216
+ it ( 'throws if persistence._remove fails' , async ( ) => {
217
+ persistenceStub . _remove . rejects ( new Error ( 'remove fail' ) ) ;
218
+ await expect ( auth . _updateFirebaseToken ( null ) ) . to . be . rejectedWith (
219
+ 'remove fail'
220
+ ) ;
221
+ } ) ;
222
+ } ) ;
223
+
224
+ describe ( '#_initializeWithPersistence' , ( ) => {
225
+ let mockToken : FirebaseToken ;
226
+ let persistenceManager : any ;
227
+ let subscription : any ;
228
+ let authImpl : AuthImpl ;
229
+
230
+ beforeEach ( ( ) => {
231
+ mockToken = {
232
+ token : 'test-token' ,
233
+ expirationTime : 123456789
234
+ } ;
235
+
236
+ persistenceManager = {
237
+ getFirebaseToken : sinon . stub ( ) . resolves ( mockToken ) ,
238
+ getCurrentUser : sinon . stub ( ) . resolves ( null ) ,
239
+ setCurrentUser : sinon . stub ( ) . resolves ( ) ,
240
+ removeCurrentUser : sinon . stub ( ) . resolves ( ) ,
241
+ getPersistence : sinon . stub ( ) . returns ( 'LOCAL' )
242
+ } ;
243
+
244
+ subscription = {
245
+ next : sinon . spy ( )
246
+ } ;
247
+
248
+ sinon . stub ( PersistenceUserManager , 'create' ) . resolves ( persistenceManager ) ;
249
+
250
+ authImpl = new AuthImpl (
251
+ FAKE_APP ,
252
+ FAKE_HEARTBEAT_CONTROLLER_PROVIDER ,
253
+ FAKE_APP_CHECK_CONTROLLER_PROVIDER ,
254
+ {
255
+ apiKey : FAKE_APP . options . apiKey ! ,
256
+ apiHost : DefaultConfig . API_HOST ,
257
+ apiScheme : DefaultConfig . API_SCHEME ,
258
+ tokenApiHost : DefaultConfig . TOKEN_API_HOST ,
259
+ clientPlatform : ClientPlatform . BROWSER ,
260
+ sdkClientVersion : 'v'
261
+ }
262
+ ) ;
263
+
264
+ ( authImpl as any ) . firebaseTokenSubscription = subscription ;
265
+ } ) ;
266
+
267
+ afterEach ( ( ) => {
268
+ sinon . restore ( ) ;
269
+ } ) ;
270
+
271
+ it ( 'should load the firebaseToken from persistence and set it' , async ( ) => {
272
+ await authImpl . _initializeWithPersistence ( [
273
+ persistenceStub as PersistenceInternal
274
+ ] ) ;
275
+
276
+ expect ( persistenceManager . getFirebaseToken ) . to . have . been . called ;
277
+ expect ( ( authImpl as any ) . firebaseToken ) . to . eql ( mockToken ) ;
278
+ expect ( subscription . next ) . to . have . been . calledWith ( mockToken ) ;
279
+ } ) ;
280
+
281
+ it ( 'should set firebaseToken to null if getFirebaseToken returns undefined' , async ( ) => {
282
+ persistenceManager . getFirebaseToken . resolves ( undefined ) ;
283
+
284
+ await authImpl . _initializeWithPersistence ( [
285
+ persistenceStub as PersistenceInternal
286
+ ] ) ;
287
+
288
+ expect ( ( authImpl as any ) . firebaseToken ) . to . be . null ;
289
+ expect ( subscription . next ) . to . have . been . calledWith ( null ) ;
290
+ } ) ;
291
+
292
+ it ( 'should set firebaseToken to null if getFirebaseToken returns null' , async ( ) => {
293
+ persistenceManager . getFirebaseToken . resolves ( null ) ;
294
+
295
+ await authImpl . _initializeWithPersistence ( [
296
+ persistenceStub as PersistenceInternal
297
+ ] ) ;
298
+
299
+ expect ( ( authImpl as any ) . firebaseToken ) . to . be . null ;
300
+ expect ( subscription . next ) . to . have . been . calledWith ( null ) ;
301
+ } ) ;
302
+ } ) ;
303
+
153
304
describe ( '#signOut' , ( ) => {
154
305
it ( 'sets currentUser to null, calls remove' , async ( ) => {
155
306
await auth . _updateCurrentUser ( testUser ( auth , 'test' ) ) ;
0 commit comments