From af966bdf7b289b3f746e1066f44c4ee971549643 Mon Sep 17 00:00:00 2001 From: gianantoniopini <63844628+gianantoniopini@users.noreply.github.com> Date: Thu, 21 Jan 2021 16:45:33 +0100 Subject: [PATCH] Firebase Stub: introduced a delay in all async functions to better mimic real Firebase --- __mocks__/gatsby-plugin-firebase/auth/auth.js | 3 +++ .../gatsby-plugin-firebase/constants/auth.js | 6 +++++ .../database/reference.js | 17 +++++++++----- .../gatsby-plugin-firebase/utils/index.js | 5 +++++ src/pages/app/__tests__/builder.test.js | 22 +++++++++++++------ src/pages/app/__tests__/dashboard.test.js | 7 ++---- 6 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 __mocks__/gatsby-plugin-firebase/utils/index.js diff --git a/__mocks__/gatsby-plugin-firebase/auth/auth.js b/__mocks__/gatsby-plugin-firebase/auth/auth.js index 3d1183d4..b27aaf10 100644 --- a/__mocks__/gatsby-plugin-firebase/auth/auth.js +++ b/__mocks__/gatsby-plugin-firebase/auth/auth.js @@ -2,6 +2,7 @@ import { v4 as uuidv4 } from 'uuid'; import Constants from '../constants/auth'; +import delay from '../utils/index'; const singleton = Symbol(''); const singletonEnforcer = Symbol(''); @@ -49,6 +50,8 @@ class Auth { async signInAnonymously() { const user = Constants.anonymousUser1; + await delay(Constants.defaultDelayInMilliseconds); + this.onAuthStateChangedObservers.forEach((observer) => observer(user)); return Promise.resolve(user); diff --git a/__mocks__/gatsby-plugin-firebase/constants/auth.js b/__mocks__/gatsby-plugin-firebase/constants/auth.js index 9280bfd9..13f8fcc4 100644 --- a/__mocks__/gatsby-plugin-firebase/constants/auth.js +++ b/__mocks__/gatsby-plugin-firebase/constants/auth.js @@ -14,6 +14,8 @@ const anonymousUser2 = { uid: 'anonym456', }; +const defaultDelayInMilliseconds = 100; + class Auth { static get anonymousUser1() { return anonymousUser1; @@ -22,6 +24,10 @@ class Auth { static get anonymousUser2() { return anonymousUser2; } + + static get defaultDelayInMilliseconds() { + return defaultDelayInMilliseconds; + } } export default Auth; diff --git a/__mocks__/gatsby-plugin-firebase/database/reference.js b/__mocks__/gatsby-plugin-firebase/database/reference.js index 7e37737b..6d422314 100644 --- a/__mocks__/gatsby-plugin-firebase/database/reference.js +++ b/__mocks__/gatsby-plugin-firebase/database/reference.js @@ -4,6 +4,7 @@ import { debounce } from 'lodash'; import DatabaseConstants from '../constants/database'; import DataSnapshot from './dataSnapshot'; +import delay from '../utils/index'; const parsePath = (path) => { if (!path) { @@ -183,9 +184,7 @@ class Reference { throw new Error('eventType should be a string.'); } - await new Promise((resolve) => - setTimeout(resolve, DatabaseConstants.defaultDelayInMilliseconds), - ); + await delay(DatabaseConstants.defaultDelayInMilliseconds); return Promise.resolve(this._dataSnapshot); } @@ -196,21 +195,27 @@ class Reference { } async update(value) { + await delay(DatabaseConstants.defaultDelayInMilliseconds); + this._handleDataUpdate(value); - return Promise.resolve(true); + return Promise.resolve(); } async remove() { + await delay(DatabaseConstants.defaultDelayInMilliseconds); + this._handleDataUpdate(null); - return Promise.resolve(true); + return Promise.resolve(); } async set(value) { + await delay(DatabaseConstants.defaultDelayInMilliseconds); + this._handleDataUpdate(value); - return Promise.resolve(true); + return Promise.resolve(); } } diff --git a/__mocks__/gatsby-plugin-firebase/utils/index.js b/__mocks__/gatsby-plugin-firebase/utils/index.js new file mode 100644 index 00000000..0b290076 --- /dev/null +++ b/__mocks__/gatsby-plugin-firebase/utils/index.js @@ -0,0 +1,5 @@ +const delay = async (milliseconds) => { + await new Promise((resolve) => setTimeout(resolve, milliseconds)); +}; + +export default delay; diff --git a/src/pages/app/__tests__/builder.test.js b/src/pages/app/__tests__/builder.test.js index 4f238893..d1551e62 100644 --- a/src/pages/app/__tests__/builder.test.js +++ b/src/pages/app/__tests__/builder.test.js @@ -1,7 +1,6 @@ import { navigate as mockNavigateFunction } from 'gatsby'; import React from 'react'; import { - act, fireEvent, render, screen, @@ -31,7 +30,7 @@ describe('Builder', () => { async function setup( resumeIdParameter, waitForLoadingScreenToDisappear = true, - waitForDatabaseUpdateFunctionToHaveBeenCalled = true, + waitForDatabaseUpdateFunctionToHaveCompleted = true, ) { FirebaseStub.database().initializeData(); @@ -49,6 +48,8 @@ describe('Builder', () => { 'update', ); + FirebaseStub.auth().signInAnonymously(); + render( @@ -65,20 +66,17 @@ describe('Builder', () => { , ); - await act(async () => { - await FirebaseStub.auth().signInAnonymously(); - }); - if (waitForLoadingScreenToDisappear) { await waitForElementToBeRemoved(() => screen.getByTestId(loadingScreenTestId), ); } - if (waitForDatabaseUpdateFunctionToHaveBeenCalled) { + if (waitForDatabaseUpdateFunctionToHaveCompleted) { await waitFor(() => mockDatabaseUpdateFunction.mock.calls[0][0], { timeout: DebounceWaitTime, }); + await waitFor(() => mockDatabaseUpdateFunction.mock.results[0].value); mockDatabaseUpdateFunction.mockClear(); } } @@ -158,6 +156,11 @@ describe('Builder', () => { expect( mockDatabaseUpdateFunctionCallArgument.updatedAt, ).toBeGreaterThanOrEqual(now); + await waitFor(() => + expect( + mockDatabaseUpdateFunction.mock.results[0].value, + ).resolves.toBeUndefined(), + ); }); afterEach(() => { @@ -195,6 +198,11 @@ describe('Builder', () => { expect( mockDatabaseUpdateFunctionCallArgument.updatedAt, ).toBeGreaterThanOrEqual(now); + await waitFor(() => + expect( + mockDatabaseUpdateFunction.mock.results[0].value, + ).resolves.toBeUndefined(), + ); }); }); diff --git a/src/pages/app/__tests__/dashboard.test.js b/src/pages/app/__tests__/dashboard.test.js index ac1a7452..a2ff6adf 100644 --- a/src/pages/app/__tests__/dashboard.test.js +++ b/src/pages/app/__tests__/dashboard.test.js @@ -1,6 +1,5 @@ import React from 'react'; import { - act, render, screen, waitForElementToBeRemoved, @@ -34,6 +33,8 @@ describe('Dashboard', () => { .once('value') ).val(); + FirebaseStub.auth().signInAnonymously(); + render( @@ -50,10 +51,6 @@ describe('Dashboard', () => { , ); - await act(async () => { - await FirebaseStub.auth().signInAnonymously(); - }); - if (waitForLoadingScreenToDisappear) { await waitForElementToBeRemoved(() => screen.getByTestId(loadingScreenTestId),