mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-23 21:21:32 +10:00
Delete Account unit tests: fixed warnings, added test for error notifications
This commit is contained in:
@ -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.',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
*/
|
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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));
|
||||||
};
|
|
||||||
|
|||||||
Reference in New Issue
Block a user