From 9a5206dda3c8738668cba87a49cccf870457e649 Mon Sep 17 00:00:00 2001 From: Sam Olsen Date: Fri, 15 May 2020 10:26:26 -0700 Subject: [PATCH 1/4] user.delete() implementation --- .../auth-exp/src/core/user/user_impl.test.ts | 29 +++++++++++++++++-- .../auth-exp/src/core/user/user_impl.ts | 12 ++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/packages-exp/auth-exp/src/core/user/user_impl.test.ts b/packages-exp/auth-exp/src/core/user/user_impl.test.ts index c9b80711684..cbd4c46232b 100644 --- a/packages-exp/auth-exp/src/core/user/user_impl.test.ts +++ b/packages-exp/auth-exp/src/core/user/user_impl.test.ts @@ -17,15 +17,21 @@ import { expect, use } from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; +import * as sinon from 'sinon'; +import * as sinonChai from 'sinon-chai'; import { FirebaseError } from '@firebase/util'; +import { mockEndpoint } from '../../../test/api/helper'; import { makeJWT } from '../../../test/jwt'; import { mockAuth } from '../../../test/mock_auth'; +import * as fetch from '../../../test/mock_fetch'; +import { Endpoint } from '../../api'; import { IdTokenResponse } from '../../model/id_token'; import { StsTokenManager } from './token_manager'; import { UserImpl } from './user_impl'; +use(sinonChai); use(chaiAsPromised); describe('core/user/user_impl', () => { @@ -33,9 +39,15 @@ describe('core/user/user_impl', () => { let stsTokenManager: StsTokenManager; beforeEach(() => { + fetch.setUp(); stsTokenManager = new StsTokenManager(); }); + afterEach(() => { + sinon.restore(); + fetch.tearDown(); + }); + describe('.constructor', () => { it('attaches required fields', () => { const user = new UserImpl({ uid: 'uid', auth, stsTokenManager }); @@ -116,9 +128,22 @@ describe('core/user/user_impl', () => { }); describe('#delete', () => { - it('throws', () => { + it('calls delete endpoint', async () => { + stsTokenManager.updateFromServerResponse({ + idToken: 'id-token', + refreshToken: 'refresh-token-string', + expiresIn: '100000' + } as IdTokenResponse); const user = new UserImpl({ uid: 'uid', auth, stsTokenManager }); - expect(() => user.delete()).to.throw(); + const endpoint = mockEndpoint(Endpoint.DELETE_ACCOUNT, {}); + const signOut = sinon.stub(auth, 'signOut'); + + await user.delete(); + expect(endpoint.calls[0].request).to.eql({ + idToken: 'id-token', + }); + + expect(signOut).to.have.been.called; }); }); diff --git a/packages-exp/auth-exp/src/core/user/user_impl.ts b/packages-exp/auth-exp/src/core/user/user_impl.ts index 75112d1d4d1..36480a0e223 100644 --- a/packages-exp/auth-exp/src/core/user/user_impl.ts +++ b/packages-exp/auth-exp/src/core/user/user_impl.ts @@ -17,6 +17,7 @@ import { IdTokenResult } from '@firebase/auth-types-exp'; +import { deleteAccount } from '../../api/account_management/account'; import { Auth } from '../../model/auth'; import { User } from '../../model/user'; import { PersistedBlob } from '../persistence'; @@ -99,8 +100,15 @@ export class UserImpl implements User { return reload(this); } - delete(): Promise { - throw new Error('Method not implemented.'); + async delete(): Promise { + const idToken = await this.getIdToken(); + await deleteAccount(this.auth, {idToken}); + this.stsTokenManager.refreshToken = null; + + // TODO: Determine if cancellable-promises are necessary to use in this class so that delete() + // cancels pending actions... + + return this.auth.signOut(); } toPlainObject(): PersistedBlob { From af674ac0c4700721cfbcbe0f9b343b63122e864c Mon Sep 17 00:00:00 2001 From: Sam Olsen Date: Fri, 15 May 2020 10:27:07 -0700 Subject: [PATCH 2/4] [AUTOMATED]: Prettier Code Styling --- packages-exp/auth-exp/src/core/user/user_impl.test.ts | 2 +- packages-exp/auth-exp/src/core/user/user_impl.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages-exp/auth-exp/src/core/user/user_impl.test.ts b/packages-exp/auth-exp/src/core/user/user_impl.test.ts index cbd4c46232b..5dcd546494c 100644 --- a/packages-exp/auth-exp/src/core/user/user_impl.test.ts +++ b/packages-exp/auth-exp/src/core/user/user_impl.test.ts @@ -140,7 +140,7 @@ describe('core/user/user_impl', () => { await user.delete(); expect(endpoint.calls[0].request).to.eql({ - idToken: 'id-token', + idToken: 'id-token' }); expect(signOut).to.have.been.called; diff --git a/packages-exp/auth-exp/src/core/user/user_impl.ts b/packages-exp/auth-exp/src/core/user/user_impl.ts index 36480a0e223..c24c24c4a76 100644 --- a/packages-exp/auth-exp/src/core/user/user_impl.ts +++ b/packages-exp/auth-exp/src/core/user/user_impl.ts @@ -102,12 +102,12 @@ export class UserImpl implements User { async delete(): Promise { const idToken = await this.getIdToken(); - await deleteAccount(this.auth, {idToken}); + await deleteAccount(this.auth, { idToken }); this.stsTokenManager.refreshToken = null; // TODO: Determine if cancellable-promises are necessary to use in this class so that delete() // cancels pending actions... - + return this.auth.signOut(); } From 211a7907863fa6394b453a18e65f935c38703b9b Mon Sep 17 00:00:00 2001 From: Sam Olsen Date: Fri, 15 May 2020 12:11:54 -0700 Subject: [PATCH 3/4] PR feedback --- packages-exp/auth-exp/src/core/user/token_manager.test.ts | 8 ++++++++ packages-exp/auth-exp/src/core/user/token_manager.ts | 4 ++++ packages-exp/auth-exp/src/core/user/user_impl.ts | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages-exp/auth-exp/src/core/user/token_manager.test.ts b/packages-exp/auth-exp/src/core/user/token_manager.test.ts index e5fcaf8031c..ae8a6700def 100644 --- a/packages-exp/auth-exp/src/core/user/token_manager.test.ts +++ b/packages-exp/auth-exp/src/core/user/token_manager.test.ts @@ -74,6 +74,14 @@ describe('core/user/token_manager', () => { }); }); + describe('#clearRefreshToken', () => { + it('sets refresh token to null', () => { + stsTokenManager.refreshToken = 'refresh-token'; + stsTokenManager.clearRefreshToken(); + expect(stsTokenManager.refreshToken).to.be.null; + }); + }); + describe('#getToken', () => { context('with endpoint setup', () => { let mock: fetch.Route; diff --git a/packages-exp/auth-exp/src/core/user/token_manager.ts b/packages-exp/auth-exp/src/core/user/token_manager.ts index ce07e417e4b..34840bba934 100644 --- a/packages-exp/auth-exp/src/core/user/token_manager.ts +++ b/packages-exp/auth-exp/src/core/user/token_manager.ts @@ -81,6 +81,10 @@ export class StsTokenManager { }; } + clearRefreshToken(): void { + this.refreshToken = null; + } + toPlainObject(): object { return { refreshToken: this.refreshToken, diff --git a/packages-exp/auth-exp/src/core/user/user_impl.ts b/packages-exp/auth-exp/src/core/user/user_impl.ts index c24c24c4a76..ea20466020c 100644 --- a/packages-exp/auth-exp/src/core/user/user_impl.ts +++ b/packages-exp/auth-exp/src/core/user/user_impl.ts @@ -103,7 +103,7 @@ export class UserImpl implements User { async delete(): Promise { const idToken = await this.getIdToken(); await deleteAccount(this.auth, { idToken }); - this.stsTokenManager.refreshToken = null; + this.stsTokenManager.clearRefreshToken(); // TODO: Determine if cancellable-promises are necessary to use in this class so that delete() // cancels pending actions... From 2973aea2a4b67ead972881d453a27d5945c31405 Mon Sep 17 00:00:00 2001 From: Sam Olsen Date: Fri, 15 May 2020 12:14:32 -0700 Subject: [PATCH 4/4] PR feedback --- packages-exp/auth-exp/src/core/user/user_impl.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages-exp/auth-exp/src/core/user/user_impl.test.ts b/packages-exp/auth-exp/src/core/user/user_impl.test.ts index 5dcd546494c..255f06df5a1 100644 --- a/packages-exp/auth-exp/src/core/user/user_impl.test.ts +++ b/packages-exp/auth-exp/src/core/user/user_impl.test.ts @@ -142,8 +142,8 @@ describe('core/user/user_impl', () => { expect(endpoint.calls[0].request).to.eql({ idToken: 'id-token' }); - expect(signOut).to.have.been.called; + expect(stsTokenManager.refreshToken).to.be.null; }); });