Skip to content

Commit 542a5cd

Browse files
authored
Merge 2973aea into b278cea
2 parents b278cea + 2973aea commit 542a5cd

File tree

4 files changed

+49
-4
lines changed

4 files changed

+49
-4
lines changed

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

+8
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,14 @@ describe('core/user/token_manager', () => {
7474
});
7575
});
7676

77+
describe('#clearRefreshToken', () => {
78+
it('sets refresh token to null', () => {
79+
stsTokenManager.refreshToken = 'refresh-token';
80+
stsTokenManager.clearRefreshToken();
81+
expect(stsTokenManager.refreshToken).to.be.null;
82+
});
83+
});
84+
7785
describe('#getToken', () => {
7886
context('with endpoint setup', () => {
7987
let mock: fetch.Route;

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

+4
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ export class StsTokenManager {
8181
};
8282
}
8383

84+
clearRefreshToken(): void {
85+
this.refreshToken = null;
86+
}
87+
8488
toPlainObject(): object {
8589
return {
8690
refreshToken: this.refreshToken,

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

+27-2
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,37 @@
1717

1818
import { expect, use } from 'chai';
1919
import * as chaiAsPromised from 'chai-as-promised';
20+
import * as sinon from 'sinon';
21+
import * as sinonChai from 'sinon-chai';
2022

2123
import { FirebaseError } from '@firebase/util';
2224

25+
import { mockEndpoint } from '../../../test/api/helper';
2326
import { makeJWT } from '../../../test/jwt';
2427
import { mockAuth } from '../../../test/mock_auth';
28+
import * as fetch from '../../../test/mock_fetch';
29+
import { Endpoint } from '../../api';
2530
import { IdTokenResponse } from '../../model/id_token';
2631
import { StsTokenManager } from './token_manager';
2732
import { UserImpl } from './user_impl';
2833

34+
use(sinonChai);
2935
use(chaiAsPromised);
3036

3137
describe('core/user/user_impl', () => {
3238
const auth = mockAuth;
3339
let stsTokenManager: StsTokenManager;
3440

3541
beforeEach(() => {
42+
fetch.setUp();
3643
stsTokenManager = new StsTokenManager();
3744
});
3845

46+
afterEach(() => {
47+
sinon.restore();
48+
fetch.tearDown();
49+
});
50+
3951
describe('.constructor', () => {
4052
it('attaches required fields', () => {
4153
const user = new UserImpl({ uid: 'uid', auth, stsTokenManager });
@@ -116,9 +128,22 @@ describe('core/user/user_impl', () => {
116128
});
117129

118130
describe('#delete', () => {
119-
it('throws', () => {
131+
it('calls delete endpoint', async () => {
132+
stsTokenManager.updateFromServerResponse({
133+
idToken: 'id-token',
134+
refreshToken: 'refresh-token-string',
135+
expiresIn: '100000'
136+
} as IdTokenResponse);
120137
const user = new UserImpl({ uid: 'uid', auth, stsTokenManager });
121-
expect(() => user.delete()).to.throw();
138+
const endpoint = mockEndpoint(Endpoint.DELETE_ACCOUNT, {});
139+
const signOut = sinon.stub(auth, 'signOut');
140+
141+
await user.delete();
142+
expect(endpoint.calls[0].request).to.eql({
143+
idToken: 'id-token'
144+
});
145+
expect(signOut).to.have.been.called;
146+
expect(stsTokenManager.refreshToken).to.be.null;
122147
});
123148
});
124149

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

+10-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import { IdTokenResult } from '@firebase/auth-types-exp';
1919

20+
import { deleteAccount } from '../../api/account_management/account';
2021
import { Auth } from '../../model/auth';
2122
import { User } from '../../model/user';
2223
import { PersistedBlob } from '../persistence';
@@ -99,8 +100,15 @@ export class UserImpl implements User {
99100
return reload(this);
100101
}
101102

102-
delete(): Promise<void> {
103-
throw new Error('Method not implemented.');
103+
async delete(): Promise<void> {
104+
const idToken = await this.getIdToken();
105+
await deleteAccount(this.auth, { idToken });
106+
this.stsTokenManager.clearRefreshToken();
107+
108+
// TODO: Determine if cancellable-promises are necessary to use in this class so that delete()
109+
// cancels pending actions...
110+
111+
return this.auth.signOut();
104112
}
105113

106114
toPlainObject(): PersistedBlob {

0 commit comments

Comments
 (0)