Delete Account unit tests: fixed warnings, added test for error notifications

This commit is contained in:
gianantoniopini
2021-05-18 13:41:38 +02:00
parent a8cf553217
commit 53d0e17865
2 changed files with 80 additions and 51 deletions

View File

@ -3,20 +3,24 @@ import { toast } from 'react-toastify';
import { fireEvent, screen, waitFor } from '@testing-library/react'; import { fireEvent, screen, waitFor } from '@testing-library/react';
import FirebaseStub, { import FirebaseStub, {
AuthConstants,
DatabaseConstants, DatabaseConstants,
FunctionsConstants, FunctionsConstants,
} from 'gatsby-plugin-firebase'; } from 'gatsby-plugin-firebase';
import { setupAndWait } from './helpers/builder'; import { setupAndWait } from './helpers/builder';
import { delay } from '../../../utils/index';
const testTimeoutInMilliseconds = 20000; const testTimeoutInMilliseconds = 60000;
jest.setTimeout(testTimeoutInMilliseconds); jest.setTimeout(testTimeoutInMilliseconds);
async function setup() { async function setup() {
const resumeId = DatabaseConstants.demoStateResume1Id; const resumeId = DatabaseConstants.demoStateResume1Id;
await setupAndWait(resumeId, true, true); await setupAndWait(resumeId, true, true);
const mockFirebaseDeleteUserCloudFunction = jest.fn(async () => {}); const mockFirebaseDeleteUserCloudFunction = jest.fn(async () => {
await delay(FunctionsConstants.defaultDelayInMilliseconds);
});
const mockFirebaseFunctionsHttpsCallable = jest.fn((name) => const mockFirebaseFunctionsHttpsCallable = jest.fn((name) =>
name === FunctionsConstants.deleteUserFunctionName name === FunctionsConstants.deleteUserFunctionName
? mockFirebaseDeleteUserCloudFunction ? mockFirebaseDeleteUserCloudFunction
@ -24,13 +28,16 @@ async function setup() {
); );
FirebaseStub.functions().httpsCallable = mockFirebaseFunctionsHttpsCallable; FirebaseStub.functions().httpsCallable = mockFirebaseFunctionsHttpsCallable;
const mockFirebaseCurrentUserDelete = jest.fn(async () => { const mockFirebaseCurrentUserDelete = jest.spyOn(
throw new Error('Error occurred while deleting user.'); FirebaseStub.auth().currentUser,
}); 'delete',
FirebaseStub.auth().currentUser.delete = mockFirebaseCurrentUserDelete; );
const mockFirebaseAuthSignOutErrorMessage =
'Error occurred while signing out.';
const mockFirebaseAuthSignOut = jest.fn(async () => { const mockFirebaseAuthSignOut = jest.fn(async () => {
throw new Error('Error occurred while signing out.'); await delay(AuthConstants.defaultDelayInMilliseconds);
throw new Error(mockFirebaseAuthSignOutErrorMessage);
}); });
FirebaseStub.auth().signOut = mockFirebaseAuthSignOut; FirebaseStub.auth().signOut = mockFirebaseAuthSignOut;
@ -38,40 +45,46 @@ async function setup() {
const mockToastError = jest.fn((content, options) => {}); const mockToastError = jest.fn((content, options) => {});
toast.error = mockToastError; toast.error = mockToastError;
const deleteAccountRegExp = /Delete Account/i; const deleteAccountButtonText = /Delete Account/i;
const button = screen.getByRole('button', { const areYouSureButtonText = /Are you sure?/i;
name: deleteAccountRegExp, const deleteAccountButton = screen.getByRole('button', {
name: deleteAccountButtonText,
}); });
const waitForDeleteAccountButtonTextToChangeTo = async (text) => {
const waitForButtonNameToBeSetToDeleteAccount = async () => { await waitFor(() => expect(deleteAccountButton).toHaveTextContent(text), {
waitFor(() => { timeout: 30000,
expect(button).toHaveTextContent(deleteAccountRegExp);
}); });
}; };
return { return {
button, deleteAccountButton,
areYouSureButtonText,
deleteAccountButtonText,
waitForDeleteAccountButtonTextToChangeTo,
mockFirebaseDeleteUserCloudFunction, mockFirebaseDeleteUserCloudFunction,
mockFirebaseCurrentUserDelete, mockFirebaseCurrentUserDelete,
mockFirebaseAuthSignOut, mockFirebaseAuthSignOut,
mockFirebaseAuthSignOutErrorMessage,
mockToastError, mockToastError,
waitForButtonNameToBeSetToDeleteAccount,
}; };
} }
test('prompts for confirmation', async () => { test('prompts for confirmation', async () => {
const { const {
button, deleteAccountButton,
areYouSureButtonText,
waitForDeleteAccountButtonTextToChangeTo,
mockFirebaseDeleteUserCloudFunction, mockFirebaseDeleteUserCloudFunction,
mockFirebaseCurrentUserDelete, mockFirebaseCurrentUserDelete,
mockFirebaseAuthSignOut, mockFirebaseAuthSignOut,
mockToastError, mockToastError,
} = await setup(); } = await setup();
fireEvent.click(button); fireEvent.click(deleteAccountButton);
expect(button).toHaveTextContent(/Are you sure?/i);
await expect(
waitForDeleteAccountButtonTextToChangeTo(areYouSureButtonText),
).resolves.toBeUndefined();
expect(mockFirebaseDeleteUserCloudFunction).not.toHaveBeenCalled(); expect(mockFirebaseDeleteUserCloudFunction).not.toHaveBeenCalled();
expect(mockFirebaseCurrentUserDelete).not.toHaveBeenCalled(); expect(mockFirebaseCurrentUserDelete).not.toHaveBeenCalled();
expect(mockFirebaseAuthSignOut).not.toHaveBeenCalled(); expect(mockFirebaseAuthSignOut).not.toHaveBeenCalled();
@ -81,15 +94,17 @@ test('prompts for confirmation', async () => {
test('calls Firebase delete user cloud function', async () => { test('calls Firebase delete user cloud function', async () => {
const { const {
button, deleteAccountButton,
deleteAccountButtonText,
mockFirebaseDeleteUserCloudFunction, mockFirebaseDeleteUserCloudFunction,
waitForButtonNameToBeSetToDeleteAccount, waitForDeleteAccountButtonTextToChangeTo,
} = await setup(); } = await setup();
fireEvent.click(button); fireEvent.click(deleteAccountButton);
fireEvent.click(button); fireEvent.click(deleteAccountButton);
await waitForDeleteAccountButtonTextToChangeTo(deleteAccountButtonText);
await waitForButtonNameToBeSetToDeleteAccount();
await waitFor(() => await waitFor(() =>
expect(mockFirebaseDeleteUserCloudFunction).toHaveBeenCalledTimes(1), expect(mockFirebaseDeleteUserCloudFunction).toHaveBeenCalledTimes(1),
); );
@ -97,15 +112,17 @@ test('calls Firebase delete user cloud function', async () => {
test('calls Firebase current user delete', async () => { test('calls Firebase current user delete', async () => {
const { const {
button, deleteAccountButton,
deleteAccountButtonText,
mockFirebaseCurrentUserDelete, mockFirebaseCurrentUserDelete,
waitForButtonNameToBeSetToDeleteAccount, waitForDeleteAccountButtonTextToChangeTo,
} = await setup(); } = await setup();
fireEvent.click(button); fireEvent.click(deleteAccountButton);
fireEvent.click(button); fireEvent.click(deleteAccountButton);
await waitForDeleteAccountButtonTextToChangeTo(deleteAccountButtonText);
await waitForButtonNameToBeSetToDeleteAccount();
await waitFor(() => await waitFor(() =>
expect(mockFirebaseCurrentUserDelete).toHaveBeenCalledTimes(1), expect(mockFirebaseCurrentUserDelete).toHaveBeenCalledTimes(1),
); );
@ -113,45 +130,58 @@ test('calls Firebase current user delete', async () => {
test('calls Firebase auth sign out', async () => { test('calls Firebase auth sign out', async () => {
const { const {
button, deleteAccountButton,
deleteAccountButtonText,
mockFirebaseAuthSignOut, mockFirebaseAuthSignOut,
waitForButtonNameToBeSetToDeleteAccount, waitForDeleteAccountButtonTextToChangeTo,
} = await setup(); } = await setup();
fireEvent.click(button); fireEvent.click(deleteAccountButton);
fireEvent.click(button); fireEvent.click(deleteAccountButton);
await waitForDeleteAccountButtonTextToChangeTo(deleteAccountButtonText);
await waitForButtonNameToBeSetToDeleteAccount();
await waitFor(() => expect(mockFirebaseAuthSignOut).toHaveBeenCalledTimes(1)); await waitFor(() => expect(mockFirebaseAuthSignOut).toHaveBeenCalledTimes(1));
}); });
describe('if an error occurs while signing out the current user', () => { describe('if an error occurs while signing out the current user', () => {
test('does not navigate away', async () => { test('does not navigate away', async () => {
const { button, waitForButtonNameToBeSetToDeleteAccount } = await setup(); const {
deleteAccountButton,
deleteAccountButtonText,
waitForDeleteAccountButtonTextToChangeTo,
} = await setup();
fireEvent.click(button); fireEvent.click(deleteAccountButton);
fireEvent.click(button); fireEvent.click(deleteAccountButton);
await waitForDeleteAccountButtonTextToChangeTo(deleteAccountButtonText);
await waitForButtonNameToBeSetToDeleteAccount();
expect(mockNavigateFunction).not.toHaveBeenCalled(); expect(mockNavigateFunction).not.toHaveBeenCalled();
}); });
/* test('displays error notifications', async () => {
test('displays toast', async () => {
const { const {
button, deleteAccountButton,
waitForButtonNameToBeSetToDeleteAccount, deleteAccountButtonText,
mockFirebaseAuthSignOutErrorMessage,
waitForDeleteAccountButtonTextToChangeTo,
mockToastError, mockToastError,
} = await setup(); } = await setup();
fireEvent.click(button); fireEvent.click(deleteAccountButton);
fireEvent.click(button); fireEvent.click(deleteAccountButton);
await waitForDeleteAccountButtonTextToChangeTo(deleteAccountButtonText);
await waitForButtonNameToBeSetToDeleteAccount();
expect(mockToastError).toHaveBeenCalledTimes(2); expect(mockToastError).toHaveBeenCalledTimes(2);
expect(mockToastError).toHaveBeenLastCalledWith( expect(mockToastError).toHaveBeenNthCalledWith(
1,
mockFirebaseAuthSignOutErrorMessage,
);
expect(mockToastError).toHaveBeenNthCalledWith(
2,
'An error occurred deleting your account.', 'An error occurred deleting your account.',
); );
}); });
*/
}); });

View File

@ -137,6 +137,5 @@ export const b64toBlob = (b64Data, contentType = '', sliceSize = 512) => {
return blob; return blob;
}; };
export const delay = async (milliseconds) => { export const delay = (milliseconds) =>
await new Promise((resolve) => setTimeout(resolve, milliseconds)); new Promise((resolve) => setTimeout(resolve, milliseconds));
};