test: update snackbar with variant and data-test attributes

This commit is contained in:
QAComet
2023-10-26 15:43:42 -06:00
committed by Ali BARIN
parent bf7ab475ee
commit 1a55cc8604
18 changed files with 95 additions and 62 deletions

View File

@@ -14,11 +14,12 @@ export class BasePage {
*/ */
constructor(page) { constructor(page) {
this.page = page; this.page = page;
this.snackbar = this.page.locator('.notistack-MuiContent'); this.snackbar = page.locator('*[data-test^="snackbar"]');
} }
/** /**
* Finds the latest snackbar message and extracts relevant data * Finds the latest snackbar message and extracts relevant data
* @param {string | undefined} testId
* @returns {( * @returns {(
* null | { * null | {
* variant: SnackbarVariant, * variant: SnackbarVariant,
@@ -27,25 +28,13 @@ export class BasePage {
* } * }
* )} * )}
*/ */
async getSnackbarData () { async getSnackbarData (testId) {
if (await this.snackbar.count() === 0) { if (!testId) {
return null; testId = 'snackbar';
}
const snack = this.snackbar.first(); // uses flex: column-reverse
const classList = await snack.evaluate(node => Array.from(node.classList));
/** @type SnackbarVariant */
let variant = 'default';
if (classList.includes('notistack-MuiContent-success')) {
variant = 'success'
} else if (classList.includes('notistack-MuiContent-warning')) {
variant = 'warning'
} else if (classList.includes('notistack-MuiContent-error')) {
variant = 'error'
} else if (classList.includes('notistack-MuiContent-info')) {
variant = 'info'
} }
const snack = this.page.getByTestId(testId);
return { return {
variant, variant: await snack.getAttribute('data-snackbar-variant'),
text: await snack.evaluate(node => node.innerText), text: await snack.evaluate(node => node.innerText),
dataset: await snack.evaluate(node => { dataset: await snack.evaluate(node => {
function getChildren (n) { function getChildren (n) {

View File

@@ -35,10 +35,9 @@ test.describe('User management page', () => {
'option', { name: 'Admin' } 'option', { name: 'Admin' }
).click(); ).click();
await adminCreateUserPage.createButton.click(); await adminCreateUserPage.createButton.click();
await adminUsersPage.snackbar.waitFor({ const snackbar = await adminUsersPage.getSnackbarData(
state: 'attached' 'snackbar-create-user-success'
}); );
const snackbar = await adminUsersPage.getSnackbarData();
await expect(snackbar.variant).toBe('success'); await expect(snackbar.variant).toBe('success');
await adminUsersPage.closeSnackbar(); await adminUsersPage.closeSnackbar();
} }
@@ -65,10 +64,9 @@ test.describe('User management page', () => {
await adminEditUserPage.fullNameInput.fill(newUserInfo.fullName); await adminEditUserPage.fullNameInput.fill(newUserInfo.fullName);
await adminEditUserPage.updateButton.click(); await adminEditUserPage.updateButton.click();
await adminUsersPage.snackbar.waitFor({ const snackbar = await adminUsersPage.getSnackbarData(
state: 'attached' 'snackbar-edit-user-success'
}); );
const snackbar = await adminUsersPage.getSnackbarData();
await expect(snackbar.variant).toBe('success'); await expect(snackbar.variant).toBe('success');
await adminUsersPage.closeSnackbar(); await adminUsersPage.closeSnackbar();
@@ -86,10 +84,10 @@ test.describe('User management page', () => {
await adminUsersPage.clickDeleteUser(userRow); await adminUsersPage.clickDeleteUser(userRow);
const modal = adminUsersPage.deleteUserModal; const modal = adminUsersPage.deleteUserModal;
await modal.deleteButton.click(); await modal.deleteButton.click();
await adminUsersPage.snackbar.waitFor({
state: 'attached' const snackbar = await adminUsersPage.getSnackbarData(
}); 'snackbar-delete-user-success'
const snackbar = await adminUsersPage.getSnackbarData(); );
await expect(snackbar.variant).toBe('success'); await expect(snackbar.variant).toBe('success');
await adminUsersPage.closeSnackbar(); await adminUsersPage.closeSnackbar();
await expect(userRow).not.toBeVisible(false); await expect(userRow).not.toBeVisible(false);
@@ -115,10 +113,9 @@ test.describe('User management page', () => {
'option', { name: 'Admin' } 'option', { name: 'Admin' }
).click(); ).click();
await adminCreateUserPage.createButton.click(); await adminCreateUserPage.createButton.click();
await adminUsersPage.snackbar.waitFor({ const snackbar = await adminUsersPage.getSnackbarData(
state: 'attached' 'snackbar-create-user-success'
}); );
const snackbar = await adminUsersPage.getSnackbarData();
await expect(snackbar.variant).toBe('success'); await expect(snackbar.variant).toBe('success');
await adminUsersPage.closeSnackbar(); await adminUsersPage.closeSnackbar();
} }
@@ -132,10 +129,9 @@ test.describe('User management page', () => {
await adminUsersPage.clickDeleteUser(userRow); await adminUsersPage.clickDeleteUser(userRow);
const modal = adminUsersPage.deleteUserModal; const modal = adminUsersPage.deleteUserModal;
await modal.deleteButton.click(); await modal.deleteButton.click();
await adminUsersPage.snackbar.waitFor({ const snackbar = await adminUsersPage.getSnackbarData(
state: 'attached' 'snackbar-delete-user-success'
}); );
const snackbar = await adminUsersPage.getSnackbarData();
await expect(snackbar).not.toBeNull(); await expect(snackbar).not.toBeNull();
await expect(snackbar.variant).toBe('success'); await expect(snackbar.variant).toBe('success');
await adminUsersPage.closeSnackbar(); await adminUsersPage.closeSnackbar();
@@ -163,6 +159,7 @@ test.describe('User management page', () => {
happen here, i.e. if this should create a new user, stay the happen here, i.e. if this should create a new user, stay the
same, un-delete the user, or something else same, un-delete the user, or something else
*/ */
// await adminUsersPage.getSnackbarData('snackbar-error');
await adminUsersPage.closeSnackbar(); await adminUsersPage.closeSnackbar();
} }
); );
@@ -187,10 +184,9 @@ test.describe('User management page', () => {
'option', { name: 'Admin' } 'option', { name: 'Admin' }
).click(); ).click();
await adminCreateUserPage.createButton.click(); await adminCreateUserPage.createButton.click();
await adminUsersPage.snackbar.waitFor({ const snackbar = await adminUsersPage.getSnackbarData(
state: 'attached' 'snackbar-create-user-success'
}); );
const snackbar = await adminUsersPage.getSnackbarData();
await expect(snackbar.variant).toBe('success'); await expect(snackbar.variant).toBe('success');
await adminUsersPage.closeSnackbar(); await adminUsersPage.closeSnackbar();
} }
@@ -209,11 +205,9 @@ test.describe('User management page', () => {
'option', { name: 'Admin' } 'option', { name: 'Admin' }
).click(); ).click();
await adminCreateUserPage.createButton.click(); await adminCreateUserPage.createButton.click();
await adminCreateUserPage.snackbar.waitFor({
state: 'attached'
});
await expect(page.url()).toBe(createUserPageUrl); await expect(page.url()).toBe(createUserPageUrl);
const snackbar = await adminUsersPage.getSnackbarData(); const snackbar = await adminUsersPage.getSnackbarData('snackbar-error');
await expect(snackbar.variant).toBe('error'); await expect(snackbar.variant).toBe('error');
await adminUsersPage.closeSnackbar(); await adminUsersPage.closeSnackbar();
} }
@@ -241,10 +235,9 @@ test.describe('User management page', () => {
'option', { name: 'Admin' } 'option', { name: 'Admin' }
).click(); ).click();
await adminCreateUserPage.createButton.click(); await adminCreateUserPage.createButton.click();
await adminUsersPage.snackbar.waitFor({ const snackbar = await adminUsersPage.getSnackbarData(
state: 'attached' 'snackbar-create-user-success'
}); );
const snackbar = await adminUsersPage.getSnackbarData();
await expect(snackbar.variant).toBe('success'); await expect(snackbar.variant).toBe('success');
await adminUsersPage.closeSnackbar(); await adminUsersPage.closeSnackbar();
} }
@@ -262,10 +255,9 @@ test.describe('User management page', () => {
'option', { name: 'Admin' } 'option', { name: 'Admin' }
).click(); ).click();
await adminCreateUserPage.createButton.click(); await adminCreateUserPage.createButton.click();
await adminUsersPage.snackbar.waitFor({ const snackbar = await adminUsersPage.getSnackbarData(
state: 'attached' 'snackbar-create-user-success'
}); );
const snackbar = await adminUsersPage.getSnackbarData();
await expect(snackbar.variant).toBe('success'); await expect(snackbar.variant).toBe('success');
await adminUsersPage.closeSnackbar(); await adminUsersPage.closeSnackbar();
} }
@@ -282,10 +274,9 @@ test.describe('User management page', () => {
const editPageUrl = page.url(); const editPageUrl = page.url();
await adminEditUserPage.updateButton.click(); await adminEditUserPage.updateButton.click();
await adminUsersPage.snackbar.waitFor({ const snackbar = await adminUsersPage.getSnackbarData(
state: 'attached' 'snackbar-error'
}); );
const snackbar = await adminUsersPage.getSnackbarData();
await expect(snackbar.variant).toBe('error'); await expect(snackbar.variant).toBe('error');
await adminUsersPage.closeSnackbar(); await adminUsersPage.closeSnackbar();
await expect(page.url()).toBe(editPageUrl); await expect(page.url()).toBe(editPageUrl);

View File

@@ -6,13 +6,13 @@ import Paper from '@mui/material/Paper';
import Stack from '@mui/material/Stack'; import Stack from '@mui/material/Stack';
import LoadingButton from '@mui/lab/LoadingButton'; import LoadingButton from '@mui/lab/LoadingButton';
import { useMutation } from '@apollo/client'; import { useMutation } from '@apollo/client';
import { useSnackbar } from 'notistack';
import { CREATE_APP_CONFIG } from 'graphql/mutations/create-app-config'; import { CREATE_APP_CONFIG } from 'graphql/mutations/create-app-config';
import { UPDATE_APP_CONFIG } from 'graphql/mutations/update-app-config'; import { UPDATE_APP_CONFIG } from 'graphql/mutations/update-app-config';
import Form from 'components/Form'; import Form from 'components/Form';
import { Switch } from './style'; import { Switch } from './style';
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
type AdminApplicationSettingsProps = { type AdminApplicationSettingsProps = {
appKey: string; appKey: string;
@@ -36,7 +36,7 @@ function AdminApplicationSettings(
); );
const formatMessage = useFormatMessage(); const formatMessage = useFormatMessage();
const { enqueueSnackbar } = useSnackbar(); const enqueueSnackbar = useEnqueueSnackbar();
const handleSubmit = async (values: any) => { const handleSubmit = async (values: any) => {
try { try {
@@ -55,6 +55,9 @@ function AdminApplicationSettings(
} }
enqueueSnackbar(formatMessage('adminAppsSettings.successfullySaved'), { enqueueSnackbar(formatMessage('adminAppsSettings.successfullySaved'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-save-admin-apps-settings-success'
}
}); });
} catch (error) { } catch (error) {
throw new Error('Failed while saving!'); throw new Error('Failed while saving!');

View File

@@ -15,7 +15,12 @@ const ApolloProvider = (props: ApolloProviderProps): React.ReactElement => {
const onError = React.useCallback( const onError = React.useCallback(
(message) => { (message) => {
enqueueSnackbar(message, { variant: 'error' }); enqueueSnackbar(message, {
variant: 'error',
SnackbarProps: {
'data-test': 'snackbar-error'
}
});
}, },
[enqueueSnackbar] [enqueueSnackbar]
); );

View File

@@ -82,6 +82,9 @@ function AppConnectionRow(props: AppConnectionRowProps): React.ReactElement {
enqueueSnackbar(formatMessage('connection.deletedMessage'), { enqueueSnackbar(formatMessage('connection.deletedMessage'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-delete-connection-success'
}
}); });
} else if (action.type === 'test') { } else if (action.type === 'test') {
setVerificationVisible(true); setVerificationVisible(true);

View File

@@ -31,6 +31,9 @@ export default function DeleteRoleButton(props: DeleteRoleButtonProps) {
setShowConfirmation(false); setShowConfirmation(false);
enqueueSnackbar(formatMessage('deleteRoleButton.successfullyDeleted'), { enqueueSnackbar(formatMessage('deleteRoleButton.successfullyDeleted'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-delete-role-success'
}
}); });
} catch (error) { } catch (error) {
throw new Error('Failed while deleting!'); throw new Error('Failed while deleting!');

View File

@@ -29,6 +29,9 @@ export default function DeleteUserButton(props: DeleteUserButtonProps) {
setShowConfirmation(false); setShowConfirmation(false);
enqueueSnackbar(formatMessage('deleteUserButton.successfullyDeleted'), { enqueueSnackbar(formatMessage('deleteUserButton.successfullyDeleted'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-delete-user-success'
}
}); });
} catch (error) { } catch (error) {
throw new Error('Failed while deleting!'); throw new Error('Failed while deleting!');

View File

@@ -36,6 +36,9 @@ export default function ContextMenu(
enqueueSnackbar(formatMessage('flow.successfullyDuplicated'), { enqueueSnackbar(formatMessage('flow.successfullyDuplicated'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-duplicate-flow-success'
}
}); });
onClose(); onClose();

View File

@@ -43,6 +43,9 @@ export default function ResetPasswordForm() {
enqueueSnackbar(formatMessage('resetPasswordForm.passwordUpdated'), { enqueueSnackbar(formatMessage('resetPasswordForm.passwordUpdated'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-reset-password-success'
}
}); });
navigate(URLS.LOGIN); navigate(URLS.LOGIN);

View File

@@ -20,7 +20,11 @@ export default function useEnqueueSnackbar() {
...(options || {}) as Record<string, unknown>, ...(options || {}) as Record<string, unknown>,
SnackbarProps: { SnackbarProps: {
onClick: () => closeSnackbar(key), onClick: () => closeSnackbar(key),
...(options.SnackbarProps || {}) as Record<string, unknown> ...({
'data-test': 'snackbar', // keep above options.snackbarProps
'data-snackbar-variant': `${options.variant}` || 'default',
}) as Record<string, string>,
...(options.SnackbarProps || {}) as Record<string, unknown>,
} }
} }
); );

View File

@@ -64,6 +64,9 @@ function RoleMappings({ provider, providerLoading }: RoleMappingsProps) {
}); });
enqueueSnackbar(formatMessage('roleMappingsForm.successfullySaved'), { enqueueSnackbar(formatMessage('roleMappingsForm.successfullySaved'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-update-role-mappings-success'
}
}); });
} }
} catch (error) { } catch (error) {

View File

@@ -93,6 +93,9 @@ function SamlConfiguration({
enqueueSnackbar(formatMessage('authenticationForm.successfullySaved'), { enqueueSnackbar(formatMessage('authenticationForm.successfullySaved'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-save-saml-provider-success'
}
}); });
} catch (error) { } catch (error) {
throw new Error('Failed while saving!'); throw new Error('Failed while saving!');

View File

@@ -43,6 +43,9 @@ export default function CreateRole(): React.ReactElement {
enqueueSnackbar(formatMessage('createRole.successfullyCreated'), { enqueueSnackbar(formatMessage('createRole.successfullyCreated'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-create-role-success'
}
}); });
navigate(URLS.ROLES); navigate(URLS.ROLES);

View File

@@ -47,6 +47,10 @@ export default function CreateUser(): React.ReactElement {
enqueueSnackbar(formatMessage('createUser.successfullyCreated'), { enqueueSnackbar(formatMessage('createUser.successfullyCreated'), {
variant: 'success', variant: 'success',
persist: true,
SnackbarProps: {
'data-test': 'snackbar-create-user-success',
}
}); });
navigate(URLS.USERS); navigate(URLS.USERS);

View File

@@ -53,6 +53,9 @@ export default function EditRole(): React.ReactElement {
enqueueSnackbar(formatMessage('editRole.successfullyUpdated'), { enqueueSnackbar(formatMessage('editRole.successfullyUpdated'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-edit-role-success'
}
}); });
navigate(URLS.ROLES); navigate(URLS.ROLES);

View File

@@ -55,6 +55,10 @@ export default function EditUser(): React.ReactElement {
enqueueSnackbar(formatMessage('editUser.successfullyUpdated'), { enqueueSnackbar(formatMessage('editUser.successfullyUpdated'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-edit-user-success',
persist: true
}
}); });
navigate(URLS.USERS); navigate(URLS.USERS);

View File

@@ -78,6 +78,9 @@ function ProfileSettings() {
enqueueSnackbar(formatMessage('profileSettings.updatedProfile'), { enqueueSnackbar(formatMessage('profileSettings.updatedProfile'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-update-profile-settings-success'
}
}); });
}; };

View File

@@ -128,6 +128,9 @@ export default function UserInterface(): React.ReactElement {
enqueueSnackbar(formatMessage('userInterfacePage.successfullyUpdated'), { enqueueSnackbar(formatMessage('userInterfacePage.successfullyUpdated'), {
variant: 'success', variant: 'success',
SnackbarProps: {
'data-test': 'snackbar-update-user-interface-success'
}
}); });
} catch (error) { } catch (error) {
throw new Error('Failed while updating!'); throw new Error('Failed while updating!');