mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-21 04:01:41 +10:00
Builder page: unit tests separated in different files
This commit is contained in:
39
src/pages/app/__tests__/builder.dataPersistence.test.js
Normal file
39
src/pages/app/__tests__/builder.dataPersistence.test.js
Normal file
@ -0,0 +1,39 @@
|
||||
import { fireEvent, screen } from '@testing-library/react';
|
||||
|
||||
import { DatabaseConstants } from 'gatsby-plugin-firebase';
|
||||
|
||||
import {
|
||||
setupAndWait,
|
||||
expectDatabaseUpdateToHaveCompleted,
|
||||
} from './helpers/builder';
|
||||
|
||||
const testTimeoutInMilliseconds = 20000;
|
||||
jest.setTimeout(testTimeoutInMilliseconds);
|
||||
|
||||
test('when input value is changed, updates database', async () => {
|
||||
const resumeId = DatabaseConstants.demoStateResume1Id;
|
||||
const { mockDatabaseUpdateFunction } = await setupAndWait(
|
||||
resumeId,
|
||||
true,
|
||||
true,
|
||||
);
|
||||
|
||||
const input = screen.getByRole('textbox', { name: /address line 1/i });
|
||||
const newInputValue = 'test street 123';
|
||||
const now = new Date().getTime();
|
||||
|
||||
fireEvent.change(input, { target: { value: newInputValue } });
|
||||
|
||||
expect(input.value).toBe(newInputValue);
|
||||
|
||||
await expectDatabaseUpdateToHaveCompleted(mockDatabaseUpdateFunction);
|
||||
const mockDatabaseUpdateFunctionCallArgument =
|
||||
mockDatabaseUpdateFunction.mock.calls[0][0];
|
||||
expect(mockDatabaseUpdateFunctionCallArgument.id).toBe(resumeId);
|
||||
expect(mockDatabaseUpdateFunctionCallArgument.profile.address.line1).toBe(
|
||||
newInputValue,
|
||||
);
|
||||
expect(
|
||||
mockDatabaseUpdateFunctionCallArgument.updatedAt,
|
||||
).toBeGreaterThanOrEqual(now);
|
||||
});
|
||||
24
src/pages/app/__tests__/builder.errorHandling.test.js
Normal file
24
src/pages/app/__tests__/builder.errorHandling.test.js
Normal file
@ -0,0 +1,24 @@
|
||||
import { navigate as mockNavigateFunction } from 'gatsby';
|
||||
import { fireEvent, getByText, screen, waitFor } from '@testing-library/react';
|
||||
|
||||
import setup from './helpers/builder';
|
||||
|
||||
test('if resume does not exist, navigates to Dashboard and displays notification', async () => {
|
||||
await setup('xxxxxx');
|
||||
|
||||
await waitFor(() => expect(mockNavigateFunction).toHaveBeenCalledTimes(1));
|
||||
expect(mockNavigateFunction).toHaveBeenCalledWith('/app/dashboard');
|
||||
|
||||
const notification = await screen.findByRole('alert');
|
||||
expect(
|
||||
getByText(
|
||||
notification,
|
||||
/The resume you were looking for does not exist anymore/i,
|
||||
),
|
||||
).toBeInTheDocument();
|
||||
fireEvent.click(notification);
|
||||
|
||||
await waitFor(() =>
|
||||
expect(mockNavigateFunction.mock.results[0].value).resolves.toBeUndefined(),
|
||||
);
|
||||
});
|
||||
63
src/pages/app/__tests__/builder.rendering.test.js
Normal file
63
src/pages/app/__tests__/builder.rendering.test.js
Normal file
@ -0,0 +1,63 @@
|
||||
import {
|
||||
fireEvent,
|
||||
getByText,
|
||||
screen,
|
||||
waitForElementToBeRemoved,
|
||||
} from '@testing-library/react';
|
||||
|
||||
import { DatabaseConstants } from 'gatsby-plugin-firebase';
|
||||
|
||||
import { dataTestId as loadingScreenTestId } from '../../../components/router/LoadingScreen';
|
||||
|
||||
import setup, {
|
||||
setupAndWait,
|
||||
waitForDatabaseUpdateToHaveCompleted,
|
||||
} from './helpers/builder';
|
||||
|
||||
const testTimeoutInMilliseconds = 10000;
|
||||
jest.setTimeout(testTimeoutInMilliseconds);
|
||||
|
||||
test('renders first and last name', async () => {
|
||||
const { resume } = await setupAndWait(
|
||||
DatabaseConstants.demoStateResume1Id,
|
||||
true,
|
||||
true,
|
||||
);
|
||||
|
||||
expect(
|
||||
screen.getByRole('textbox', { name: /first name/i }),
|
||||
).toHaveDisplayValue(resume.profile.firstName);
|
||||
expect(
|
||||
screen.getByRole('textbox', { name: /last name/i }),
|
||||
).toHaveDisplayValue(resume.profile.lastName);
|
||||
expect(
|
||||
screen.getAllByText(new RegExp(resume.profile.firstName, 'i')).length,
|
||||
).toBeTruthy();
|
||||
expect(
|
||||
screen.getAllByText(new RegExp(resume.profile.lastName, 'i')).length,
|
||||
).toBeTruthy();
|
||||
});
|
||||
|
||||
test('renders loading screen', async () => {
|
||||
const { mockDatabaseUpdateFunction } = await setup(
|
||||
DatabaseConstants.demoStateResume1Id,
|
||||
);
|
||||
|
||||
expect(screen.getByTestId(loadingScreenTestId)).toBeInTheDocument();
|
||||
|
||||
await waitForElementToBeRemoved(() =>
|
||||
screen.getByTestId(loadingScreenTestId),
|
||||
);
|
||||
|
||||
await waitForDatabaseUpdateToHaveCompleted(mockDatabaseUpdateFunction);
|
||||
});
|
||||
|
||||
test('if resume is in initial state, renders load demo data notification', async () => {
|
||||
await setup(DatabaseConstants.initialStateResumeId);
|
||||
|
||||
const notification = await screen.findByRole('alert');
|
||||
expect(
|
||||
getByText(notification, /Not sure where to begin\? Try loading demo data/i),
|
||||
).toBeInTheDocument();
|
||||
fireEvent.click(notification);
|
||||
});
|
||||
54
src/pages/app/__tests__/builder.settings.test.js
Normal file
54
src/pages/app/__tests__/builder.settings.test.js
Normal file
@ -0,0 +1,54 @@
|
||||
import { fireEvent, screen } from '@testing-library/react';
|
||||
|
||||
import { DatabaseConstants } from 'gatsby-plugin-firebase';
|
||||
|
||||
import { languageStorageItemKey } from '../../../contexts/SettingsContext';
|
||||
|
||||
import {
|
||||
setupAndWait,
|
||||
expectDatabaseUpdateToHaveCompleted,
|
||||
} from './helpers/builder';
|
||||
|
||||
const testTimeoutInMilliseconds = 20000;
|
||||
jest.setTimeout(testTimeoutInMilliseconds);
|
||||
|
||||
test('allows to change the language', async () => {
|
||||
const resumeId = DatabaseConstants.demoStateResume1Id;
|
||||
const { mockDatabaseUpdateFunction } = await setupAndWait(
|
||||
resumeId,
|
||||
true,
|
||||
true,
|
||||
);
|
||||
|
||||
const languageElement = screen.getByLabelText(/language/i);
|
||||
const italianLanguageCode = 'it';
|
||||
const now = new Date().getTime();
|
||||
|
||||
fireEvent.change(languageElement, {
|
||||
target: { value: italianLanguageCode },
|
||||
});
|
||||
|
||||
expect(languageElement).toHaveValue(italianLanguageCode);
|
||||
|
||||
expect(screen.queryByLabelText(/date of birth/i)).not.toBeInTheDocument();
|
||||
expect(screen.getByLabelText(/data di nascita/i)).toBeInTheDocument();
|
||||
|
||||
const languageStorageItem = localStorage.getItem(languageStorageItemKey);
|
||||
expect(languageStorageItem).toBe(italianLanguageCode);
|
||||
|
||||
await expectDatabaseUpdateToHaveCompleted(mockDatabaseUpdateFunction);
|
||||
const mockDatabaseUpdateFunctionCallArgument =
|
||||
mockDatabaseUpdateFunction.mock.calls[0][0];
|
||||
expect(mockDatabaseUpdateFunctionCallArgument.id).toBe(resumeId);
|
||||
expect(mockDatabaseUpdateFunctionCallArgument.metadata.language).toBe(
|
||||
italianLanguageCode,
|
||||
);
|
||||
expect(
|
||||
mockDatabaseUpdateFunctionCallArgument.updatedAt,
|
||||
).toBeGreaterThanOrEqual(now);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
const englishLanguageCode = 'en';
|
||||
localStorage.setItem(languageStorageItemKey, englishLanguageCode);
|
||||
});
|
||||
@ -1,260 +0,0 @@
|
||||
import { navigate as mockNavigateFunction } from 'gatsby';
|
||||
import React from 'react';
|
||||
import {
|
||||
fireEvent,
|
||||
getByText,
|
||||
render,
|
||||
screen,
|
||||
waitFor,
|
||||
waitForElementToBeRemoved,
|
||||
} from '@testing-library/react';
|
||||
|
||||
import FirebaseStub, { DatabaseConstants } from 'gatsby-plugin-firebase';
|
||||
|
||||
import { dataTestId as loadingScreenTestId } from '../../../components/router/LoadingScreen';
|
||||
import {
|
||||
SettingsProvider,
|
||||
languageStorageItemKey,
|
||||
} from '../../../contexts/SettingsContext';
|
||||
import { ModalProvider } from '../../../contexts/ModalContext';
|
||||
import { UserProvider } from '../../../contexts/UserContext';
|
||||
import {
|
||||
DatabaseProvider,
|
||||
DebounceWaitTime,
|
||||
} from '../../../contexts/DatabaseContext';
|
||||
import { ResumeProvider } from '../../../contexts/ResumeContext';
|
||||
import { StorageProvider } from '../../../contexts/StorageContext';
|
||||
import Wrapper from '../../../components/shared/Wrapper';
|
||||
import Builder from '../builder';
|
||||
|
||||
describe('Builder', () => {
|
||||
let resumeId = null;
|
||||
let resume = null;
|
||||
let mockDatabaseUpdateFunction = null;
|
||||
|
||||
const fnWaitForDatabaseUpdateToHaveCompleted = async () => {
|
||||
await waitFor(() => mockDatabaseUpdateFunction.mock.calls[0][0], {
|
||||
timeout: DebounceWaitTime,
|
||||
});
|
||||
await waitFor(() => mockDatabaseUpdateFunction.mock.results[0].value);
|
||||
};
|
||||
|
||||
const expectDatabaseUpdateToHaveCompleted = async () => {
|
||||
await waitFor(
|
||||
() => expect(mockDatabaseUpdateFunction).toHaveBeenCalledTimes(1),
|
||||
{
|
||||
timeout: DebounceWaitTime,
|
||||
},
|
||||
);
|
||||
await waitFor(() =>
|
||||
expect(
|
||||
mockDatabaseUpdateFunction.mock.results[0].value,
|
||||
).resolves.toBeUndefined(),
|
||||
);
|
||||
};
|
||||
|
||||
async function setup(
|
||||
resumeIdParameter,
|
||||
waitForLoadingScreenToDisappear = true,
|
||||
waitForDatabaseUpdateToHaveCompleted = true,
|
||||
) {
|
||||
FirebaseStub.database().initializeData();
|
||||
|
||||
resumeId = resumeIdParameter;
|
||||
resume = (
|
||||
await FirebaseStub.database()
|
||||
.ref(`${DatabaseConstants.resumesPath}/${resumeId}`)
|
||||
.once('value')
|
||||
).val();
|
||||
|
||||
mockDatabaseUpdateFunction = jest.spyOn(
|
||||
FirebaseStub.database().ref(
|
||||
`${DatabaseConstants.resumesPath}/${resumeId}`,
|
||||
),
|
||||
'update',
|
||||
);
|
||||
|
||||
FirebaseStub.auth().signInAnonymously();
|
||||
|
||||
render(
|
||||
<SettingsProvider>
|
||||
<ModalProvider>
|
||||
<UserProvider>
|
||||
<DatabaseProvider>
|
||||
<ResumeProvider>
|
||||
<StorageProvider>
|
||||
<Wrapper>
|
||||
<Builder id={resumeId} />
|
||||
</Wrapper>
|
||||
</StorageProvider>
|
||||
</ResumeProvider>
|
||||
</DatabaseProvider>
|
||||
</UserProvider>
|
||||
</ModalProvider>
|
||||
</SettingsProvider>,
|
||||
);
|
||||
|
||||
if (waitForLoadingScreenToDisappear) {
|
||||
await waitForElementToBeRemoved(() =>
|
||||
screen.getByTestId(loadingScreenTestId),
|
||||
);
|
||||
}
|
||||
|
||||
if (waitForDatabaseUpdateToHaveCompleted) {
|
||||
await fnWaitForDatabaseUpdateToHaveCompleted();
|
||||
}
|
||||
|
||||
mockDatabaseUpdateFunction.mockClear();
|
||||
}
|
||||
|
||||
describe('handles errors', () => {
|
||||
describe('if resume does not exist', () => {
|
||||
beforeEach(async () => {
|
||||
await setup('xxxxxx', false, false);
|
||||
});
|
||||
|
||||
it('navigates to Dashboard and displays notification', async () => {
|
||||
await waitFor(() =>
|
||||
expect(mockNavigateFunction).toHaveBeenCalledTimes(1),
|
||||
);
|
||||
expect(mockNavigateFunction).toHaveBeenCalledWith('/app/dashboard');
|
||||
|
||||
const notification = await screen.findByRole('alert');
|
||||
expect(
|
||||
getByText(
|
||||
notification,
|
||||
/The resume you were looking for does not exist anymore/i,
|
||||
),
|
||||
).toBeInTheDocument();
|
||||
fireEvent.click(notification);
|
||||
|
||||
await waitFor(() =>
|
||||
expect(
|
||||
mockNavigateFunction.mock.results[0].value,
|
||||
).resolves.toBeUndefined(),
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('renders', () => {
|
||||
beforeEach(async () => {
|
||||
await setup(DatabaseConstants.demoStateResume1Id);
|
||||
});
|
||||
|
||||
it('first and last name', () => {
|
||||
expect(
|
||||
screen.getByRole('textbox', { name: /first name/i }),
|
||||
).toHaveDisplayValue(resume.profile.firstName);
|
||||
expect(
|
||||
screen.getByRole('textbox', { name: /last name/i }),
|
||||
).toHaveDisplayValue(resume.profile.lastName);
|
||||
expect(
|
||||
screen.getAllByText(new RegExp(resume.profile.firstName, 'i')).length,
|
||||
).toBeTruthy();
|
||||
expect(
|
||||
screen.getAllByText(new RegExp(resume.profile.lastName, 'i')).length,
|
||||
).toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
||||
describe('settings', () => {
|
||||
beforeEach(async () => {
|
||||
await setup(DatabaseConstants.demoStateResume1Id);
|
||||
});
|
||||
|
||||
it('allow to change the language', async () => {
|
||||
const languageElement = screen.getByLabelText(/language/i);
|
||||
const italianLanguageCode = 'it';
|
||||
const now = new Date().getTime();
|
||||
|
||||
fireEvent.change(languageElement, {
|
||||
target: { value: italianLanguageCode },
|
||||
});
|
||||
|
||||
expect(languageElement).toHaveValue(italianLanguageCode);
|
||||
|
||||
expect(screen.queryByLabelText(/date of birth/i)).not.toBeInTheDocument();
|
||||
expect(screen.getByLabelText(/data di nascita/i)).toBeInTheDocument();
|
||||
|
||||
const languageStorageItem = localStorage.getItem(languageStorageItemKey);
|
||||
expect(languageStorageItem).toBe(italianLanguageCode);
|
||||
|
||||
await expectDatabaseUpdateToHaveCompleted();
|
||||
const mockDatabaseUpdateFunctionCallArgument =
|
||||
mockDatabaseUpdateFunction.mock.calls[0][0];
|
||||
expect(mockDatabaseUpdateFunctionCallArgument.id).toBe(resumeId);
|
||||
expect(mockDatabaseUpdateFunctionCallArgument.metadata.language).toBe(
|
||||
italianLanguageCode,
|
||||
);
|
||||
expect(
|
||||
mockDatabaseUpdateFunctionCallArgument.updatedAt,
|
||||
).toBeGreaterThanOrEqual(now);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
const englishLanguageCode = 'en';
|
||||
localStorage.setItem(languageStorageItemKey, englishLanguageCode);
|
||||
});
|
||||
});
|
||||
|
||||
describe('updates data', () => {
|
||||
beforeEach(async () => {
|
||||
await setup(DatabaseConstants.demoStateResume1Id);
|
||||
});
|
||||
|
||||
it('when input value is changed', async () => {
|
||||
const input = screen.getByRole('textbox', { name: /address line 1/i });
|
||||
const newInputValue = 'test street 123';
|
||||
const now = new Date().getTime();
|
||||
|
||||
fireEvent.change(input, { target: { value: newInputValue } });
|
||||
|
||||
expect(input.value).toBe(newInputValue);
|
||||
|
||||
await expectDatabaseUpdateToHaveCompleted();
|
||||
const mockDatabaseUpdateFunctionCallArgument =
|
||||
mockDatabaseUpdateFunction.mock.calls[0][0];
|
||||
expect(mockDatabaseUpdateFunctionCallArgument.id).toBe(resumeId);
|
||||
expect(mockDatabaseUpdateFunctionCallArgument.profile.address.line1).toBe(
|
||||
newInputValue,
|
||||
);
|
||||
expect(
|
||||
mockDatabaseUpdateFunctionCallArgument.updatedAt,
|
||||
).toBeGreaterThanOrEqual(now);
|
||||
});
|
||||
});
|
||||
|
||||
describe('while loading', () => {
|
||||
beforeEach(async () => {
|
||||
await setup(DatabaseConstants.demoStateResume1Id, false, false);
|
||||
});
|
||||
|
||||
it('renders loading screen', async () => {
|
||||
expect(screen.getByTestId(loadingScreenTestId)).toBeInTheDocument();
|
||||
|
||||
await waitForElementToBeRemoved(() =>
|
||||
screen.getByTestId(loadingScreenTestId),
|
||||
);
|
||||
|
||||
await fnWaitForDatabaseUpdateToHaveCompleted();
|
||||
});
|
||||
});
|
||||
|
||||
describe('with resume in initial state', () => {
|
||||
beforeEach(async () => {
|
||||
await setup(DatabaseConstants.initialStateResumeId, false, false);
|
||||
});
|
||||
|
||||
it('displays load demo data notification', async () => {
|
||||
const notification = await screen.findByRole('alert');
|
||||
expect(
|
||||
getByText(
|
||||
notification,
|
||||
/Not sure where to begin\? Try loading demo data/i,
|
||||
),
|
||||
).toBeInTheDocument();
|
||||
fireEvent.click(notification);
|
||||
});
|
||||
});
|
||||
});
|
||||
127
src/pages/app/__tests__/helpers/builder.js
Normal file
127
src/pages/app/__tests__/helpers/builder.js
Normal file
@ -0,0 +1,127 @@
|
||||
import React from 'react';
|
||||
import {
|
||||
render,
|
||||
screen,
|
||||
waitFor,
|
||||
waitForElementToBeRemoved,
|
||||
} from '@testing-library/react';
|
||||
|
||||
import FirebaseStub, { DatabaseConstants } from 'gatsby-plugin-firebase';
|
||||
|
||||
import { dataTestId as loadingScreenTestId } from '../../../../components/router/LoadingScreen';
|
||||
import { SettingsProvider } from '../../../../contexts/SettingsContext';
|
||||
import { ModalProvider } from '../../../../contexts/ModalContext';
|
||||
import { UserProvider } from '../../../../contexts/UserContext';
|
||||
import {
|
||||
DatabaseProvider,
|
||||
DebounceWaitTime,
|
||||
} from '../../../../contexts/DatabaseContext';
|
||||
import { ResumeProvider } from '../../../../contexts/ResumeContext';
|
||||
import { StorageProvider } from '../../../../contexts/StorageContext';
|
||||
import Wrapper from '../../../../components/shared/Wrapper';
|
||||
import Builder from '../../builder';
|
||||
|
||||
const waitForDatabaseUpdateToHaveCompletedFn = async (
|
||||
mockDatabaseUpdateFunction,
|
||||
) => {
|
||||
await waitFor(() => mockDatabaseUpdateFunction.mock.calls[0][0], {
|
||||
timeout: DebounceWaitTime,
|
||||
});
|
||||
await waitFor(() => mockDatabaseUpdateFunction.mock.results[0].value);
|
||||
};
|
||||
|
||||
const expectDatabaseUpdateToHaveCompleted = async (
|
||||
mockDatabaseUpdateFunction,
|
||||
) => {
|
||||
await waitFor(
|
||||
() => expect(mockDatabaseUpdateFunction).toHaveBeenCalledTimes(1),
|
||||
{
|
||||
timeout: DebounceWaitTime,
|
||||
},
|
||||
);
|
||||
await waitFor(() =>
|
||||
expect(
|
||||
mockDatabaseUpdateFunction.mock.results[0].value,
|
||||
).resolves.toBeUndefined(),
|
||||
);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
async function _setup(
|
||||
resumeId,
|
||||
waitForLoadingScreenToDisappear,
|
||||
waitForDatabaseUpdateToHaveCompleted,
|
||||
) {
|
||||
FirebaseStub.database().initializeData();
|
||||
|
||||
const resume = (
|
||||
await FirebaseStub.database()
|
||||
.ref(`${DatabaseConstants.resumesPath}/${resumeId}`)
|
||||
.once('value')
|
||||
).val();
|
||||
|
||||
const mockDatabaseUpdateFunction = jest.spyOn(
|
||||
FirebaseStub.database().ref(`${DatabaseConstants.resumesPath}/${resumeId}`),
|
||||
'update',
|
||||
);
|
||||
|
||||
FirebaseStub.auth().signInAnonymously();
|
||||
|
||||
render(
|
||||
<SettingsProvider>
|
||||
<ModalProvider>
|
||||
<UserProvider>
|
||||
<DatabaseProvider>
|
||||
<ResumeProvider>
|
||||
<StorageProvider>
|
||||
<Wrapper>
|
||||
<Builder id={resumeId} />
|
||||
</Wrapper>
|
||||
</StorageProvider>
|
||||
</ResumeProvider>
|
||||
</DatabaseProvider>
|
||||
</UserProvider>
|
||||
</ModalProvider>
|
||||
</SettingsProvider>,
|
||||
);
|
||||
|
||||
if (waitForLoadingScreenToDisappear) {
|
||||
await waitForElementToBeRemoved(() =>
|
||||
screen.getByTestId(loadingScreenTestId),
|
||||
);
|
||||
}
|
||||
|
||||
if (waitForDatabaseUpdateToHaveCompleted) {
|
||||
await waitForDatabaseUpdateToHaveCompletedFn(mockDatabaseUpdateFunction);
|
||||
}
|
||||
|
||||
mockDatabaseUpdateFunction.mockClear();
|
||||
|
||||
return { resume, mockDatabaseUpdateFunction };
|
||||
}
|
||||
|
||||
async function setup(resumeId) {
|
||||
const returnValue = await _setup(resumeId, false, false);
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
async function setupAndWait(
|
||||
resumeId,
|
||||
waitForLoadingScreenToDisappear,
|
||||
waitForDatabaseUpdateToHaveCompleted,
|
||||
) {
|
||||
const returnValue = await _setup(
|
||||
resumeId,
|
||||
waitForLoadingScreenToDisappear,
|
||||
waitForDatabaseUpdateToHaveCompleted,
|
||||
);
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
export default setup;
|
||||
|
||||
export {
|
||||
setupAndWait,
|
||||
waitForDatabaseUpdateToHaveCompletedFn as waitForDatabaseUpdateToHaveCompleted,
|
||||
expectDatabaseUpdateToHaveCompleted,
|
||||
};
|
||||
@ -41,8 +41,10 @@ const expectResumeToBeRenderedInPreview = async (resumeName) => {
|
||||
};
|
||||
|
||||
const waitForModalWindowToHaveBeenClosed = async () => {
|
||||
await waitForElementToBeRemoved(() =>
|
||||
screen.getByRole('textbox', { name: /name/i }),
|
||||
await waitFor(() =>
|
||||
screen.queryByRole('textbox', { name: /name/i })
|
||||
? Promise.reject()
|
||||
: Promise.resolve(),
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user