Skip to content

Commit 510cf2c

Browse files
committed
PR feedback
1 parent c9959d4 commit 510cf2c

File tree

3 files changed

+90
-38
lines changed

3 files changed

+90
-38
lines changed

packages-exp/auth-exp/src/core/auth/auth_impl.test.ts

+52-20
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,7 @@ import { browserLocalPersistence } from '../persistence/browser';
3030
import { inMemoryPersistence } from '../persistence/in_memory';
3131
import { PersistenceUserManager } from '../persistence/persistence_user_manager';
3232
import { ClientPlatform, getClientVersion } from '../util/version';
33-
import {
34-
DEFAULT_API_HOST,
35-
DEFAULT_API_SCHEME,
36-
initializeAuth
37-
} from './auth_impl';
33+
import { DEFAULT_API_HOST, DEFAULT_API_SCHEME, initializeAuth } from './auth_impl';
3834

3935
use(sinonChai);
4036

@@ -163,54 +159,90 @@ describe('AuthImpl', () => {
163159
});
164160

165161
it('onAuthStateChange triggers on log in', async () => {
166-
await auth.updateCurrentUser(null);
167162
auth.onAuthStateChanged(callback);
163+
await auth.updateCurrentUser(null);
164+
callback.resetHistory();
168165
await auth.updateCurrentUser(user);
169-
expect(callback).to.have.been.calledTwice;
166+
expect(callback).to.have.been.calledWith(user);
170167
});
171168

172169
it('onAuthStateChange triggers on log out', async () => {
173-
await auth.updateCurrentUser(user);
174170
auth.onAuthStateChanged(callback);
171+
await auth.updateCurrentUser(user);
172+
callback.resetHistory();
175173
await auth.updateCurrentUser(null);
176-
expect(callback).to.have.been.calledTwice;
174+
expect(callback).to.have.been.calledWith(null);
177175
});
178176

179177
it('onIdTokenChange triggers on log in', async () => {
180-
await auth.updateCurrentUser(null);
181178
auth.onIdTokenChange(callback);
179+
await auth.updateCurrentUser(null);
180+
callback.resetHistory();
182181
await auth.updateCurrentUser(user);
183-
expect(callback).to.have.been.calledTwice;
182+
expect(callback).to.have.been.calledWith(user);
184183
});
185184

186185
it('onIdTokenChange triggers on log out', async () => {
187-
await auth.updateCurrentUser(user);
188186
auth.onIdTokenChange(callback);
187+
await auth.updateCurrentUser(user);
188+
callback.resetHistory();
189189
await auth.updateCurrentUser(null);
190-
expect(callback).to.have.been.calledTwice;
190+
expect(callback).to.have.been.calledWith(null);
191191
});
192192

193193
it('onAuthStateChange does not trigger for user props change', async () => {
194-
await auth.updateCurrentUser(user);
195194
auth.onAuthStateChanged(callback);
195+
await auth.updateCurrentUser(user);
196+
callback.resetHistory();
196197
user.refreshToken = 'hey look I changed';
197198
await auth.updateCurrentUser(user);
198-
expect(callback).to.have.been.calledOnce;
199+
expect(callback).not.to.have.been.called;
199200
});
200201

201202
it('onIdTokenChange triggers for user props change', async () => {
202-
await auth.updateCurrentUser(user);
203203
auth.onIdTokenChange(callback);
204+
await auth.updateCurrentUser(user);
205+
callback.resetHistory();
204206
user.refreshToken = 'hey look I changed';
205207
await auth.updateCurrentUser(user);
206-
expect(callback).to.have.been.calledTwice;
208+
expect(callback).to.have.been.calledWith(user);
207209
});
208210

209211
it('onAuthStateChange triggers if uid changes', async () => {
210-
await auth.updateCurrentUser(user);
211212
auth.onAuthStateChanged(callback);
212-
await auth.updateCurrentUser(testUser('different-uid'));
213-
expect(callback).to.have.been.calledTwice;
213+
await auth.updateCurrentUser(user);
214+
callback.resetHistory();
215+
const newUser = testUser('different-uid');
216+
await auth.updateCurrentUser(newUser);
217+
expect(callback).to.have.been.calledWith(newUser);
218+
});
219+
220+
it('onAuthStateChange works for multiple listeners', async () => {
221+
const cb1 = sinon.spy();
222+
const cb2 = sinon.spy();
223+
auth.onAuthStateChanged(cb1);
224+
auth.onAuthStateChanged(cb2);
225+
await auth.updateCurrentUser(null);
226+
cb1.resetHistory();
227+
cb2.resetHistory();
228+
229+
await auth.updateCurrentUser(user);
230+
expect(cb1).to.have.been.calledWith(user);
231+
expect(cb2).to.have.been.calledWith(user);
232+
});
233+
234+
it('onIdTokenChange works for multiple listeners', async () => {
235+
const cb1 = sinon.spy();
236+
const cb2 = sinon.spy();
237+
auth.onIdTokenChange(cb1);
238+
auth.onIdTokenChange(cb2);
239+
await auth.updateCurrentUser(null);
240+
cb1.resetHistory();
241+
cb2.resetHistory();
242+
243+
await auth.updateCurrentUser(user);
244+
expect(cb1).to.have.been.calledWith(user);
245+
expect(cb2).to.have.been.calledWith(user);
214246
});
215247
});
216248
});

packages-exp/auth-exp/src/core/user/reload.test.ts

+24-4
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,13 @@ import * as chaiAsPromised from 'chai-as-promised';
2020
import * as sinon from 'sinon';
2121
import * as sinonChai from 'sinon-chai';
2222

23+
import { FirebaseError } from '@firebase/util';
24+
2325
import { mockEndpoint } from '../../../test/api/helper';
2426
import { testUser } from '../../../test/mock_auth';
2527
import * as fetch from '../../../test/mock_fetch';
2628
import { Endpoint } from '../../api';
27-
import {
28-
APIUserInfo,
29-
ProviderUserInfo
30-
} from '../../api/account_management/account';
29+
import { APIUserInfo, ProviderUserInfo } from '../../api/account_management/account';
3130
import { UserInfo } from '../../model/user';
3231
import { ProviderId } from '../providers';
3332
import { _reloadWithoutSaving, reload } from './reload';
@@ -145,6 +144,27 @@ describe('reload()', () => {
145144
]);
146145
});
147146

147+
it('throws an error if the providerData providerId is invalid', async () => {
148+
const user = testUser('abc', '', true);
149+
mockEndpoint(Endpoint.GET_ACCOUNT_INFO, {
150+
users: [
151+
{
152+
providerUserInfo: [
153+
{
154+
...BASIC_USER_INFO,
155+
providerId: 'naaaah',
156+
}
157+
]
158+
}
159+
]
160+
});
161+
162+
await expect(_reloadWithoutSaving(user)).to.be.rejectedWith(
163+
FirebaseError,
164+
'Firebase: An internal AuthError has occurred. (auth/internal-error).'
165+
);
166+
});
167+
148168
it('reload calls auth.updateCurrentUser after completion', async () => {
149169
mockEndpoint(Endpoint.GET_ACCOUNT_INFO, {
150170
users: [{}]

packages-exp/auth-exp/src/core/user/reload.ts

+14-14
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@
1515
* limitations under the License.
1616
*/
1717

18-
import {
19-
getAccountInfo,
20-
ProviderUserInfo
21-
} from '../../api/account_management/account';
18+
import { getAccountInfo, ProviderUserInfo } from '../../api/account_management/account';
2219
import { User, UserInfo } from '../../model/user';
2320
import { ProviderId } from '../providers';
2421
import { assert } from '../util/assert';
@@ -32,7 +29,7 @@ export async function _reloadWithoutSaving(user: User): Promise<void> {
3229

3330
const coreAccount = response.users[0];
3431
const newProviderData = coreAccount.providerUserInfo?.length
35-
? extractProviderData(coreAccount.providerUserInfo)
32+
? extractProviderData(coreAccount.providerUserInfo, auth.name)
3633
: [];
3734
const updates: Partial<User> = {
3835
uid: coreAccount.localId,
@@ -71,13 +68,16 @@ function mergeProviderData(
7168
return [...deduped, ...newData];
7269
}
7370

74-
function extractProviderData(providers: ProviderUserInfo[]): UserInfo[] {
75-
return providers.map(provider => ({
76-
uid: provider.rawId || '',
77-
displayName: provider.displayName || null,
78-
email: provider.email || null,
79-
phoneNumber: provider.phoneNumber || null,
80-
providerId: provider.providerId as ProviderId,
81-
photoURL: provider.photoUrl || null
82-
}));
71+
function extractProviderData(providers: ProviderUserInfo[], appName: string): UserInfo[] {
72+
return providers.map(({providerId, ...provider}) => {
73+
assert(providerId && Object.values<string>(ProviderId).includes(providerId), appName);
74+
return {
75+
uid: provider.rawId || '',
76+
displayName: provider.displayName || null,
77+
email: provider.email || null,
78+
phoneNumber: provider.phoneNumber || null,
79+
providerId: providerId as ProviderId,
80+
photoURL: provider.photoUrl || null
81+
};
82+
});
8383
}

0 commit comments

Comments
 (0)