@@ -24,16 +24,13 @@ import { FirebaseError } from '@firebase/util';
24
24
25
25
import { testUser } from '../../../test/mock_auth' ;
26
26
import { Auth } from '../../model/auth' ;
27
+ import { User } from '../../model/user' ;
27
28
import { Persistence } from '../persistence' ;
28
29
import { browserLocalPersistence } from '../persistence/browser' ;
29
30
import { inMemoryPersistence } from '../persistence/in_memory' ;
30
31
import { PersistenceUserManager } from '../persistence/persistence_user_manager' ;
31
32
import { ClientPlatform , getClientVersion } from '../util/version' ;
32
- import {
33
- DEFAULT_API_HOST ,
34
- DEFAULT_API_SCHEME ,
35
- initializeAuth
36
- } from './auth_impl' ;
33
+ import { DEFAULT_API_HOST , DEFAULT_API_SCHEME , initializeAuth } from './auth_impl' ;
37
34
38
35
use ( sinonChai ) ;
39
36
@@ -117,6 +114,102 @@ describe('AuthImpl', () => {
117
114
) ;
118
115
} ) ;
119
116
} ) ;
117
+
118
+ describe ( 'change listeners' , ( ) => {
119
+ // // Helpers to convert auth state change results to promise
120
+ // function onAuthStateChange(callback: NextFn<User|null>)
121
+
122
+ it ( 'immediately calls authStateChange if initialization finished' , ( done ) => {
123
+ const user = testUser ( 'uid' ) ;
124
+ auth . currentUser = user ;
125
+ auth . _isInitialized = true ;
126
+ auth . onAuthStateChanged ( user => {
127
+ expect ( user ) . to . eq ( user ) ;
128
+ done ( ) ;
129
+ } ) ;
130
+ } ) ;
131
+
132
+ it ( 'immediately calls idTokenChange if initialization finished' , ( done ) => {
133
+ const user = testUser ( 'uid' ) ;
134
+ auth . currentUser = user ;
135
+ auth . _isInitialized = true ;
136
+ auth . onIdTokenChange ( user => {
137
+ expect ( user ) . to . eq ( user ) ;
138
+ done ( ) ;
139
+ } ) ;
140
+ } ) ;
141
+
142
+ it ( 'immediate callback is done async' , ( ) => {
143
+ auth . _isInitialized = true ;
144
+ let callbackCalled = false ;
145
+ auth . onIdTokenChange ( ( ) => {
146
+ callbackCalled = true ;
147
+ } ) ;
148
+
149
+ expect ( callbackCalled ) . to . be . false ;
150
+ } ) ;
151
+
152
+ describe ( 'user logs in/out, tokens refresh' , ( ) => {
153
+ let user : User ;
154
+ let callback : sinon . SinonSpy ;
155
+
156
+ beforeEach ( ( ) => {
157
+ user = testUser ( 'uid' ) ;
158
+ callback = sinon . spy ( ) ;
159
+ } ) ;
160
+
161
+ it ( 'onAuthStateChange triggers on log in' , async ( ) => {
162
+ await auth . updateCurrentUser ( null ) ;
163
+ auth . onAuthStateChanged ( callback ) ;
164
+ await auth . updateCurrentUser ( user ) ;
165
+ expect ( callback ) . to . have . been . calledTwice ;
166
+ } ) ;
167
+
168
+ it ( 'onAuthStateChange triggers on log out' , async ( ) => {
169
+ await auth . updateCurrentUser ( user ) ;
170
+ auth . onAuthStateChanged ( callback ) ;
171
+ await auth . updateCurrentUser ( null ) ;
172
+ expect ( callback ) . to . have . been . calledTwice ;
173
+ } ) ;
174
+
175
+ it ( 'onIdTokenChange triggers on log in' , async ( ) => {
176
+ await auth . updateCurrentUser ( null ) ;
177
+ auth . onIdTokenChange ( callback ) ;
178
+ await auth . updateCurrentUser ( user ) ;
179
+ expect ( callback ) . to . have . been . calledTwice ;
180
+ } ) ;
181
+
182
+ it ( 'onIdTokenChange triggers on log out' , async ( ) => {
183
+ await auth . updateCurrentUser ( user ) ;
184
+ auth . onIdTokenChange ( callback ) ;
185
+ await auth . updateCurrentUser ( null ) ;
186
+ expect ( callback ) . to . have . been . calledTwice ;
187
+ } ) ;
188
+
189
+ it ( 'onAuthStateChange does not trigger for user props change' , async ( ) => {
190
+ await auth . updateCurrentUser ( user ) ;
191
+ auth . onAuthStateChanged ( callback ) ;
192
+ user . refreshToken = 'hey look I changed' ;
193
+ await auth . updateCurrentUser ( user ) ;
194
+ expect ( callback ) . to . have . been . calledOnce ;
195
+ } ) ;
196
+
197
+ it ( 'onIdTokenChange triggers for user props change' , async ( ) => {
198
+ await auth . updateCurrentUser ( user ) ;
199
+ auth . onIdTokenChange ( callback ) ;
200
+ user . refreshToken = 'hey look I changed' ;
201
+ await auth . updateCurrentUser ( user ) ;
202
+ expect ( callback ) . to . have . been . calledTwice ;
203
+ } ) ;
204
+
205
+ it ( 'onAuthStateChange triggers if uid changes' , async ( ) => {
206
+ await auth . updateCurrentUser ( user ) ;
207
+ auth . onAuthStateChanged ( callback ) ;
208
+ await auth . updateCurrentUser ( testUser ( 'different-uid' ) ) ;
209
+ expect ( callback ) . to . have . been . calledTwice ;
210
+ } ) ;
211
+ } ) ;
212
+ } ) ;
120
213
} ) ;
121
214
122
215
describe ( 'initializeAuth' , ( ) => {
0 commit comments