From 4c63f68215e26486bcfb219b6244c4c10ec4df50 Mon Sep 17 00:00:00 2001 From: gianantoniopini <63844628+gianantoniopini@users.noreply.github.com> Date: Wed, 20 Jan 2021 15:52:35 +0100 Subject: [PATCH] Builder tests: added test for loading screen --- .../constants/database.js | 6 +++ .../database/reference.js | 6 ++- src/pages/app/__tests__/builder.test.js | 28 +++++++++-- src/pages/app/__tests__/dashboard.test.js | 46 +++++++++---------- 4 files changed, 56 insertions(+), 30 deletions(-) diff --git a/__mocks__/gatsby-plugin-firebase/constants/database.js b/__mocks__/gatsby-plugin-firebase/constants/database.js index 6f4fbe5d..62a5459e 100644 --- a/__mocks__/gatsby-plugin-firebase/constants/database.js +++ b/__mocks__/gatsby-plugin-firebase/constants/database.js @@ -20,6 +20,8 @@ const user2 = { isAnonymous: AuthConstants.anonymousUser2.isAnonymous, }; +const defaultDelayInMilliseconds = 100; + class Database { static get valueEventType() { return valueEventType; @@ -60,6 +62,10 @@ class Database { static get user2() { return user2; } + + static get defaultDelayInMilliseconds() { + return defaultDelayInMilliseconds; + } } export default Database; diff --git a/__mocks__/gatsby-plugin-firebase/database/reference.js b/__mocks__/gatsby-plugin-firebase/database/reference.js index 3b3447d6..7e37737b 100644 --- a/__mocks__/gatsby-plugin-firebase/database/reference.js +++ b/__mocks__/gatsby-plugin-firebase/database/reference.js @@ -149,7 +149,7 @@ class Reference { const debouncedEventCallback = debounce( this.eventCallbacks[eventType], - 100, + DatabaseConstants.defaultDelayInMilliseconds, ); debouncedEventCallback(snapshot); } @@ -183,6 +183,10 @@ class Reference { throw new Error('eventType should be a string.'); } + await new Promise((resolve) => + setTimeout(resolve, DatabaseConstants.defaultDelayInMilliseconds), + ); + return Promise.resolve(this._dataSnapshot); } diff --git a/src/pages/app/__tests__/builder.test.js b/src/pages/app/__tests__/builder.test.js index e703defe..4f238893 100644 --- a/src/pages/app/__tests__/builder.test.js +++ b/src/pages/app/__tests__/builder.test.js @@ -6,6 +6,7 @@ import { render, screen, waitFor, + waitForElementToBeRemoved, } from '@testing-library/react'; import FirebaseStub, { DatabaseConstants } from 'gatsby-plugin-firebase'; @@ -25,9 +26,11 @@ describe('Builder', () => { let resumeId = null; let resume = null; let mockDatabaseUpdateFunction = null; + const loadingScreenTestId = 'loading-screen'; async function setup( resumeIdParameter, + waitForLoadingScreenToDisappear = true, waitForDatabaseUpdateFunctionToHaveBeenCalled = true, ) { FirebaseStub.database().initializeData(); @@ -66,6 +69,12 @@ describe('Builder', () => { await FirebaseStub.auth().signInAnonymously(); }); + if (waitForLoadingScreenToDisappear) { + await waitForElementToBeRemoved(() => + screen.getByTestId(loadingScreenTestId), + ); + } + if (waitForDatabaseUpdateFunctionToHaveBeenCalled) { await waitFor(() => mockDatabaseUpdateFunction.mock.calls[0][0], { timeout: DebounceWaitTime, @@ -77,12 +86,13 @@ describe('Builder', () => { describe('handles errors', () => { describe('if resume does not exist', () => { beforeEach(async () => { - await setup('xxxxxx', false); + await setup('xxxxxx', false, false); }); - it('navigates to Dashboard', () => { - expect(resume).toBeNull(); - expect(mockNavigateFunction).toHaveBeenCalledTimes(1); + it('navigates to Dashboard', async () => { + await waitFor(() => + expect(mockNavigateFunction).toHaveBeenCalledTimes(1), + ); expect(mockNavigateFunction).toHaveBeenCalledWith('/app/dashboard'); }); }); @@ -187,4 +197,14 @@ describe('Builder', () => { ).toBeGreaterThanOrEqual(now); }); }); + + describe('while loading', () => { + beforeEach(async () => { + await setup(DatabaseConstants.demoStateResume1Id, false, false); + }); + + it('renders loading screen', () => { + expect(screen.getByTestId(loadingScreenTestId)).toBeInTheDocument(); + }); + }); }); diff --git a/src/pages/app/__tests__/dashboard.test.js b/src/pages/app/__tests__/dashboard.test.js index 93d1615e..ac1a7452 100644 --- a/src/pages/app/__tests__/dashboard.test.js +++ b/src/pages/app/__tests__/dashboard.test.js @@ -23,7 +23,7 @@ describe('Dashboard', () => { const user = DatabaseConstants.user1; const loadingScreenTestId = 'loading-screen'; - async function setup(waitForLoadingScreenToDisappear) { + async function setup(waitForLoadingScreenToDisappear = true) { FirebaseStub.database().initializeData(); resumes = ( @@ -61,32 +61,30 @@ describe('Dashboard', () => { } } - describe('after loading', () => { + describe('renders', () => { beforeEach(async () => { - await setup(true); + await setup(); }); - describe('renders', () => { - it('document title', () => { - expect(document.title).toEqual('Dashboard | Reactive Resume'); - }); + it('document title', () => { + expect(document.title).toEqual('Dashboard | Reactive Resume'); + }); - it('create resume', () => { - expect(screen.getByText(/create resume/i)).toBeInTheDocument(); - }); + it('create resume', () => { + expect(screen.getByText(/create resume/i)).toBeInTheDocument(); + }); - it('preview of user resumes', () => { - expect(Object.keys(resumes)).toHaveLength(2); + it('preview of user resumes', () => { + expect(Object.keys(resumes)).toHaveLength(2); - expect(Object.values(resumes)[0].user).toEqual(user.uid); - expect( - screen.getByText(Object.values(resumes)[0].name), - ).toBeInTheDocument(); - expect(Object.values(resumes)[1].user).toEqual(user.uid); - expect( - screen.getByText(Object.values(resumes)[1].name), - ).toBeInTheDocument(); - }); + expect(Object.values(resumes)[0].user).toEqual(user.uid); + expect( + screen.getByText(Object.values(resumes)[0].name), + ).toBeInTheDocument(); + expect(Object.values(resumes)[1].user).toEqual(user.uid); + expect( + screen.getByText(Object.values(resumes)[1].name), + ).toBeInTheDocument(); }); }); @@ -95,10 +93,8 @@ describe('Dashboard', () => { await setup(false); }); - describe('renders', () => { - it('loading screen', () => { - expect(screen.getByTestId(loadingScreenTestId)).toBeInTheDocument(); - }); + it('renders loading screen', () => { + expect(screen.getByTestId(loadingScreenTestId)).toBeInTheDocument(); }); }); });