From 5a0f4f6495e600aa190eec9c8034d2f4b202107d Mon Sep 17 00:00:00 2001 From: Rich Gowman Date: Tue, 16 Jun 2020 15:10:53 -0400 Subject: [PATCH 1/2] Fixed a flaky auth integration test by retrying the GetUser() API call --- test/integration/auth.spec.ts | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/test/integration/auth.spec.ts b/test/integration/auth.spec.ts index b2d3c7ebdf..7d1649c1df 100755 --- a/test/integration/auth.spec.ts +++ b/test/integration/auth.spec.ts @@ -332,12 +332,29 @@ describe('admin.auth', () => { // Login to set the lastRefreshTime. await firebase.auth!().signInWithEmailAndPassword('lastRefreshTimeUser@example.com', 'p4ssword') - .then(() => admin.auth().getUser('lastRefreshTimeUser')) - .then((userRecord) => { - expect(userRecord.metadata.lastRefreshTime).to.exist; - expect(isUTCString(userRecord.metadata.lastRefreshTime!)); - const creationTime = new Date(userRecord.metadata.creationTime).getTime(); - const lastRefreshTime = new Date(userRecord.metadata.lastRefreshTime!).getTime(); + .then(async () => { + // Attempt to retrieve the user 3 times (with a small delay between + // each attempt). Occassionally, this call retrieves the user data + // without the lastLoginTime/lastRefreshTime set; possibly because + // it's hitting a different server than the login request uses. + let userRecord = null; + + for (let i = 0; i < 3; i++) { + userRecord = await admin.auth().getUser('lastRefreshTimeUser'); + + if (userRecord.metadata.lastRefreshTime) { + break; + } + + await new Promise((resolve) => { + setTimeout(resolve, 1000 * Math.pow(2, i)); + }); + } + + expect(userRecord!.metadata.lastRefreshTime).to.exist; + expect(isUTCString(userRecord!.metadata.lastRefreshTime!)); + const creationTime = new Date(userRecord!.metadata.creationTime).getTime(); + const lastRefreshTime = new Date(userRecord!.metadata.lastRefreshTime!).getTime(); expect(creationTime).lte(lastRefreshTime); expect(lastRefreshTime).lte(creationTime + 3600 * 1000); }); From 7d45443566339e11c73d1478ebcd59c99022369a Mon Sep 17 00:00:00 2001 From: Rich Gowman Date: Tue, 16 Jun 2020 15:37:32 -0400 Subject: [PATCH 2/2] review feedback --- test/integration/auth.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/integration/auth.spec.ts b/test/integration/auth.spec.ts index 7d1649c1df..2797965e9b 100755 --- a/test/integration/auth.spec.ts +++ b/test/integration/auth.spec.ts @@ -341,7 +341,6 @@ describe('admin.auth', () => { for (let i = 0; i < 3; i++) { userRecord = await admin.auth().getUser('lastRefreshTimeUser'); - if (userRecord.metadata.lastRefreshTime) { break; } @@ -351,10 +350,11 @@ describe('admin.auth', () => { }); } - expect(userRecord!.metadata.lastRefreshTime).to.exist; - expect(isUTCString(userRecord!.metadata.lastRefreshTime!)); - const creationTime = new Date(userRecord!.metadata.creationTime).getTime(); - const lastRefreshTime = new Date(userRecord!.metadata.lastRefreshTime!).getTime(); + const metadata = userRecord!.metadata; + expect(metadata.lastRefreshTime).to.exist; + expect(isUTCString(metadata.lastRefreshTime!)); + const creationTime = new Date(metadata.creationTime).getTime(); + const lastRefreshTime = new Date(metadata.lastRefreshTime!).getTime(); expect(creationTime).lte(lastRefreshTime); expect(lastRefreshTime).lte(creationTime + 3600 * 1000); });