@@ -46,8 +46,12 @@ import { mockEndpointWithParams } from '../../../test/helpers/api/helper';
4646import { Endpoint , RecaptchaClientType , RecaptchaVersion } from '../../api' ;
4747import * as mockFetch from '../../../test/helpers/mock_fetch' ;
4848import { AuthErrorCode } from '../errors' ;
49- import { PasswordValidationStatus } from '../../model/public_types' ;
49+ import {
50+ FirebaseToken ,
51+ PasswordValidationStatus
52+ } from '../../model/public_types' ;
5053import { PasswordPolicyImpl } from './password_policy_impl' ;
54+ import { PersistenceUserManager } from '../persistence/persistence_user_manager' ;
5155
5256use ( sinonChai ) ;
5357use ( chaiAsPromised ) ;
@@ -150,6 +154,153 @@ describe('core/auth/auth_impl', () => {
150154 } ) ;
151155 } ) ;
152156
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+
153304 describe ( '#signOut' , ( ) => {
154305 it ( 'sets currentUser to null, calls remove' , async ( ) => {
155306 await auth . _updateCurrentUser ( testUser ( auth , 'test' ) ) ;
0 commit comments