diff --git a/UNRELEASED.md b/UNRELEASED.md
index 93943b1b53b..7b4f4dd09b0 100644
--- a/UNRELEASED.md
+++ b/UNRELEASED.md
@@ -80,5 +80,6 @@ Use [the changelog guidelines](https://git.io/polaris-changelog-guidelines) to f
- Modernized tests for EmptyState component ([#4427](https://github.com/Shopify/polaris-react/pull/4427))
- Modernized tests for Pagination, FilterControl, FilterCreator, FilterValueSelector, and DateSelector components ([#4438](https://github.com/Shopify/polaris-react/pull/4438))
- Modernized tests for PopoverOverlay component([#4430](https://github.com/Shopify/polaris-react/pull/4430))
+- Modernized tests for Dropzone, ExceptionList, and ConnectedFilterControl > Item components([#4412](https://github.com/Shopify/polaris-react/pull/4412))
### Deprecations
diff --git a/src/components/DropZone/tests/DropZone.test.tsx b/src/components/DropZone/tests/DropZone.test.tsx
index 2b7dde55376..e33c96df0db 100755
--- a/src/components/DropZone/tests/DropZone.test.tsx
+++ b/src/components/DropZone/tests/DropZone.test.tsx
@@ -2,9 +2,8 @@ import React from 'react';
import {act} from 'react-dom/test-utils';
import {clock} from '@shopify/jest-dom-mocks';
import {Label, Labelled, DisplayText, Caption} from 'components';
-// eslint-disable-next-line no-restricted-imports
-import {mountWithAppProvider, ReactWrapper} from 'test-utilities/legacy';
import {mountWithApp} from 'test-utilities';
+import type {CustomRoot} from '@shopify/react-testing';
import {DropZone, DropZoneFileType} from '../DropZone';
import {DropZoneContext} from '../context';
@@ -58,22 +57,22 @@ describe('', () => {
});
it('calls the onDrop callback when a drop event is fired', () => {
- const dropZone = mountWithAppProvider();
- fireEvent({element: dropZone});
+ const dropZone = mountWithApp();
+ fireEvent({wrapper: dropZone});
expect(spy).toHaveBeenCalledWith(files, files, []);
});
it('calls the onDrop callback when a drop event is fired on document twice when a duplicate file is added consecutively', () => {
- const dropZone = mountWithAppProvider();
- fireEvent({element: dropZone});
+ const dropZone = mountWithApp();
+ fireEvent({wrapper: dropZone});
expect(spy).toHaveBeenCalledWith(files, files, []);
- fireEvent({element: dropZone, testFiles: duplicateFiles});
+ fireEvent({wrapper: dropZone, testFiles: duplicateFiles});
expect(spy).toHaveBeenCalledWith(duplicateFiles, duplicateFiles, []);
});
it('calls the onDrop callback with files when a drop event is fired on document', () => {
- mountWithAppProvider();
+ mountWithApp();
const event = createEvent('drop', files);
act(() => {
document.dispatchEvent(event);
@@ -82,44 +81,44 @@ describe('', () => {
});
it('calls the onDrop callback with files, acceptedFiles, and rejectedFiles when it accepts only jpeg', () => {
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- fireEvent({element: dropZone});
+ fireEvent({wrapper: dropZone});
expect(spy).toHaveBeenCalledWith(files, acceptedFiles, rejectedFiles);
});
it('calls the onDropAccepted callback with acceptedFiles when it accepts only jpeg', () => {
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- fireEvent({element: dropZone});
+ fireEvent({wrapper: dropZone});
expect(spy).toHaveBeenCalledWith(acceptedFiles);
});
it('calls the onDropRejected callback with rejectedFiles when it accepts only jpeg', () => {
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- fireEvent({element: dropZone});
+ fireEvent({wrapper: dropZone});
expect(spy).toHaveBeenCalledWith(rejectedFiles);
});
it('calls the onDragEnter callback when a dragenter event is fired', () => {
- const dropZone = mountWithAppProvider();
- fireEvent({element: dropZone, eventType: 'dragenter'});
+ const dropZone = mountWithApp();
+ fireEvent({wrapper: dropZone, eventType: 'dragenter'});
expect(spy).toHaveBeenCalled();
});
it('calls the onDragOver callback when a dragover event is fired', () => {
- const dropZone = mountWithAppProvider();
- fireEvent({element: dropZone, eventType: 'dragover'});
+ const dropZone = mountWithApp();
+ fireEvent({wrapper: dropZone, eventType: 'dragover'});
expect(spy).toHaveBeenCalled();
});
it('calls the onDragLeave callback when a dragleave event is fired', () => {
- const dropZone = mountWithAppProvider();
- fireEvent({element: dropZone, eventType: 'dragleave'});
+ const dropZone = mountWithApp();
+ fireEvent({wrapper: dropZone, eventType: 'dragleave'});
expect(spy).toHaveBeenCalled();
});
@@ -127,15 +126,15 @@ describe('', () => {
const customValidator = (file: File) => {
return file.type === 'image/jpeg';
};
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- fireEvent({element: dropZone});
+ fireEvent({wrapper: dropZone});
expect(spy).toHaveBeenCalledWith(files, acceptedFiles, rejectedFiles);
});
it('does not call any callbacks when disabled', () => {
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
', () => {
onDragOver={spy}
/>,
);
- fireEvent({element: dropZone, spy});
+ fireEvent({wrapper: dropZone, spy});
expect(spy).not.toHaveBeenCalled();
- fireEvent({element: dropZone, eventType: 'dragenter', spy});
+ fireEvent({wrapper: dropZone, eventType: 'dragenter', spy});
expect(spy).not.toHaveBeenCalled();
- fireEvent({element: dropZone, eventType: 'dragleave', spy});
+ fireEvent({wrapper: dropZone, eventType: 'dragleave', spy});
expect(spy).not.toHaveBeenCalled();
- fireEvent({element: dropZone, eventType: 'dragover', spy});
+ fireEvent({wrapper: dropZone, eventType: 'dragover', spy});
expect(spy).not.toHaveBeenCalled();
});
it('calls callbacks when not allowed multiple and a replacement file is uploaded', () => {
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
', () => {
);
// Initial event to populate zone with data (should succeed)
- fireEvent({element: dropZone, spy});
+ fireEvent({wrapper: dropZone, spy});
expect(spy).toHaveBeenCalledWith(files, acceptedFiles, rejectedFiles);
// Attempt to replace the current file
- fireEvent({element: dropZone, spy});
+ fireEvent({wrapper: dropZone, spy});
expect(spy).toHaveBeenCalledWith(files, acceptedFiles, rejectedFiles);
- fireEvent({element: dropZone, eventType: 'dragenter', spy});
+ fireEvent({wrapper: dropZone, eventType: 'dragenter', spy});
expect(spy).toHaveBeenCalled();
- fireEvent({element: dropZone, eventType: 'dragleave', spy});
+ fireEvent({wrapper: dropZone, eventType: 'dragleave', spy});
expect(spy).toHaveBeenCalled();
- fireEvent({element: dropZone, eventType: 'dragover', spy});
+ fireEvent({wrapper: dropZone, eventType: 'dragover', spy});
expect(spy).toHaveBeenCalled();
});
it('renders when `label` is provided', () => {
const labelText = 'My DropZone label';
- const dropZone = mountWithAppProvider();
- const labelled = dropZone.find(Labelled);
- expect(labelled.prop('label')).toStrictEqual(labelText);
+ const dropZone = mountWithApp();
+ expect(dropZone).toContainReactComponent(Labelled, {label: labelText});
});
it('renders a with matching id for the file input', () => {
const id = 'Test';
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- const label = dropZone.find(Label);
+ const label = dropZone.find(Label)!;
+
+ expect(dropZone).toContainReactComponent(Label, {id});
+
expect(label.prop('id')).toStrictEqual(id);
- const input = dropZone.find('input[type="file"]');
- expect(input.prop('id')).toStrictEqual(id);
+ const input = dropZone.find('input', {type: 'file'});
+
+ expect(input).toHaveReactProps({id});
});
it('renders a disabled input when the disabled prop is true', () => {
- const dropZone = mountWithAppProvider();
- expect(dropZone.find('input[type="file"]').prop('disabled')).toBe(true);
+ const dropZone = mountWithApp();
+ expect(dropZone.find('input', {type: 'file'})!).toHaveReactProps({
+ disabled: true,
+ });
});
it.each([
@@ -243,21 +247,31 @@ describe('', () => {
describe('onClick', () => {
it('calls the onClick when clicking the dropzone if one is provided', () => {
const spy = jest.fn();
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- dropZone.find('div').at(4).simulate('click');
+ dropZone
+ .find('div', {
+ 'aria-disabled': false,
+ })
+ ?.trigger('onClick');
+
expect(spy).toHaveBeenCalled();
});
- it('does not calls the onClick when the dropzone is disabled', () => {
+ it('does not call the onClick when the dropzone is disabled', () => {
const spy = jest.fn();
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- dropZone.find('div').at(4).simulate('click');
+ dropZone
+ .find('div', {
+ 'aria-disabled': true,
+ })
+ ?.domNode!.click();
+
expect(spy).not.toHaveBeenCalled();
});
@@ -278,25 +292,22 @@ describe('', () => {
const callbackDropZone = {
onAction: () => {},
};
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- expect(dropZone.find(Labelled).props()).toHaveProperty(
- 'action',
- callbackDropZone,
- );
+
+ expect(dropZone).toContainReactComponent(Labelled, {
+ action: callbackDropZone,
+ });
});
});
describe('labelHidden', () => {
it("passes 'labelHidden' to the Labelled options", () => {
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- expect(dropZone.find(Labelled).props()).toHaveProperty(
- 'labelHidden',
- true,
- );
+ expect(dropZone).toContainReactComponent(Labelled, {labelHidden: true});
});
});
@@ -304,54 +315,44 @@ describe('', () => {
const overlayText = 'overlay text';
it('does not render the overlayText on small screens', () => {
setBoundingClientRect('small');
- const dropZone = mountWithAppProvider(
- ,
- );
- fireEvent({element: dropZone, eventType: 'dragenter'});
- const displayText = dropZone.find(DisplayText);
- const caption = dropZone.find(Caption);
- expect(displayText).toHaveLength(0);
- expect(caption).toHaveLength(0);
+ const dropZone = mountWithApp();
+ fireEvent({wrapper: dropZone, eventType: 'dragenter'});
+ expect(dropZone).not.toContainReactComponent(DisplayText);
+ expect(dropZone).not.toContainReactComponent(Caption);
});
it('renders a Caption containing the overlayText on medium screens', () => {
setBoundingClientRect('medium');
- const dropZone = mountWithAppProvider(
- ,
- );
- fireEvent({element: dropZone, eventType: 'dragenter'});
+ const dropZone = mountWithApp();
+ fireEvent({wrapper: dropZone, eventType: 'dragenter'});
const captionText = dropZone.find(Caption);
- expect(captionText.contains(overlayText)).toBe(true);
+ expect(captionText).toContainReactText(overlayText);
});
it('renders a Caption containing the overlayText on large screens', () => {
setBoundingClientRect('large');
- const dropZone = mountWithAppProvider(
- ,
- );
- fireEvent({element: dropZone, eventType: 'dragenter'});
+ const dropZone = mountWithApp();
+ fireEvent({wrapper: dropZone, eventType: 'dragenter'});
const captionText = dropZone.find(Caption);
- expect(captionText.contains(overlayText)).toBe(true);
+ expect(captionText).toContainReactText(overlayText);
});
it('renders a DisplayText containing the overlayText on extra-large screens', () => {
setBoundingClientRect('extraLarge');
- const dropZone = mountWithAppProvider(
- ,
- );
- fireEvent({element: dropZone, eventType: 'dragenter'});
+ const dropZone = mountWithApp();
+ fireEvent({wrapper: dropZone, eventType: 'dragenter'});
const displayText = dropZone.find(DisplayText);
- expect(displayText.contains(overlayText)).toBe(true);
+ expect(displayText).toContainReactText(overlayText);
});
it('renders a DisplayText containing the overlayText on any screen size when variableHeight is true', () => {
setBoundingClientRect('small');
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- fireEvent({element: dropZone, eventType: 'dragenter'});
+ fireEvent({wrapper: dropZone, eventType: 'dragenter'});
const displayText = dropZone.find(DisplayText);
- expect(displayText.contains(overlayText)).toBe(true);
+ expect(displayText).toContainReactText(overlayText);
});
});
@@ -359,58 +360,57 @@ describe('', () => {
const errorOverlayText = "can't drop this";
it("doesn't render the overlayText on small screens", () => {
setBoundingClientRect('small');
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- fireEvent({element: dropZone, eventType: 'dragenter'});
- const displayText = dropZone.find(DisplayText);
- const caption = dropZone.find(Caption);
- expect(displayText).toHaveLength(0);
- expect(caption).toHaveLength(0);
+ fireEvent({wrapper: dropZone, eventType: 'dragenter'});
+ expect(dropZone).not.toContainReactComponent(DisplayText);
+ expect(dropZone).not.toContainReactComponent(Caption);
});
it('renders a Caption containing the overlayText on medium screens', () => {
setBoundingClientRect('medium');
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- fireEvent({element: dropZone, eventType: 'dragenter'});
+ fireEvent({wrapper: dropZone, eventType: 'dragenter'});
const captionText = dropZone.find(Caption);
- expect(captionText.contains(errorOverlayText)).toBe(true);
+ expect(captionText).toContainReactText(errorOverlayText);
});
it('renders a Caption containing the overlayText on large screens', () => {
setBoundingClientRect('large');
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- fireEvent({element: dropZone, eventType: 'dragenter'});
+ fireEvent({wrapper: dropZone, eventType: 'dragenter'});
const captionText = dropZone.find(Caption);
- expect(captionText.contains(errorOverlayText)).toBe(true);
+
+ expect(captionText).toContainReactText(errorOverlayText);
});
it('renders a DisplayText containing the overlayText on extra-large screens', () => {
setBoundingClientRect('extraLarge');
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- fireEvent({element: dropZone, eventType: 'dragenter'});
+ fireEvent({wrapper: dropZone, eventType: 'dragenter'});
const displayText = dropZone.find(DisplayText);
- expect(displayText.contains(errorOverlayText)).toBe(true);
+ expect(displayText).toContainReactText(errorOverlayText);
});
it('renders a DisplayText containing the overlayText on any screen size when variableHeight is true', () => {
setBoundingClientRect('small');
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
,
);
- fireEvent({element: dropZone, eventType: 'dragenter'});
+ fireEvent({wrapper: dropZone, eventType: 'dragenter'});
const displayText = dropZone.find(DisplayText);
- expect(displayText.contains(errorOverlayText)).toBe(true);
+ expect(displayText).toContainReactText(errorOverlayText);
});
});
@@ -449,7 +449,7 @@ describe('', () => {
});
it('sets focused to true when the input file is focused', () => {
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
{({focused}) => {
@@ -458,13 +458,13 @@ describe('', () => {
,
);
- const fileInput = dropZone.find(`input[type="file"]`);
- fileInput.simulate('focus');
- expect(dropZone.find('#focused')).toHaveLength(1);
+ const fileInput = dropZone.find('input', {type: 'file'})!;
+ fileInput.trigger('onFocus');
+ expect(dropZone).toContainReactComponent('div', {id: 'focused'});
});
it('sets focused to false when the input file is blur', () => {
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
{({focused}) => {
@@ -473,13 +473,13 @@ describe('', () => {
,
);
- const fileInput = dropZone.find(`input[type="file"]`);
- fileInput.simulate('blur');
- expect(dropZone.find('#blurred')).toHaveLength(1);
+ const fileInput = dropZone.find('input', {type: 'file'})!;
+ fileInput.trigger('onBlur');
+ expect(dropZone).toContainReactComponent('div', {id: 'blurred'});
});
it('sets disabled to true when the dropzone is disabled', () => {
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
{({disabled}) => {
@@ -489,11 +489,11 @@ describe('', () => {
,
);
- expect(dropZone.find('#disabled')).toHaveLength(1);
+ expect(dropZone).toContainReactComponent('div', {id: 'disabled'});
});
it('sets the default type to file if not specified', () => {
- const dropZone = mountWithAppProvider(
+ const dropZone = mountWithApp(
{({type}) => {
@@ -503,7 +503,7 @@ describe('', () => {
,
);
- expect(dropZone.find('#file')).toHaveLength(1);
+ expect(dropZone).toContainReactComponent('div', {id: 'file'});
});
});
@@ -516,7 +516,7 @@ describe('', () => {
});
it('updates safely', () => {
- const dropZone = mountWithAppProvider();
+ const dropZone = mountWithApp();
expect(() => {
dropZone.setProps({openFileDialog: true});
@@ -524,7 +524,7 @@ describe('', () => {
});
it('unmounts safely', () => {
- const dropZone = mountWithAppProvider();
+ const dropZone = mountWithApp();
expect(() => {
dropZone.unmount();
@@ -561,12 +561,12 @@ function setBoundingClientRect(size: keyof typeof widths) {
}
function fireEvent({
- element,
+ wrapper,
eventType = 'drop',
testFiles = files,
spy,
}: {
- element: ReactWrapper;
+ wrapper: CustomRoot;
eventType?: string;
spy?: jest.Mock;
testFiles?: Record[];
@@ -577,11 +577,11 @@ function fireEvent({
}
const event = createEvent(eventType, testFiles);
- element.find('div').at(3).getDOMNode().dispatchEvent(event);
+ wrapper.findAll('div')[3].domNode!.dispatchEvent(event);
if (eventType === 'dragenter') {
clock.tick(50);
}
});
- element.update();
+ wrapper.forceUpdate();
}
diff --git a/src/components/ExceptionList/tests/ExceptionList.test.tsx b/src/components/ExceptionList/tests/ExceptionList.test.tsx
index 78b81d0366b..0213490e5a5 100644
--- a/src/components/ExceptionList/tests/ExceptionList.test.tsx
+++ b/src/components/ExceptionList/tests/ExceptionList.test.tsx
@@ -1,7 +1,6 @@
import React from 'react';
import {CirclePlusMinor, NoteMinor} from '@shopify/polaris-icons';
-// eslint-disable-next-line no-restricted-imports
-import {mountWithAppProvider} from 'test-utilities/legacy';
+import {mountWithApp} from 'test-utilities';
import {Icon} from 'components';
import {ExceptionList} from '../ExceptionList';
@@ -9,7 +8,7 @@ import {Truncate} from '../../Truncate';
describe('', () => {
it('renders its items', () => {
- const exceptionList = mountWithAppProvider(
+ const exceptionList = mountWithApp(
', () => {
]}
/>,
);
- expect(exceptionList.find('li')).toHaveLength(2);
+ expect(exceptionList).toContainReactComponentTimes('li', 2);
});
it('renders its items icon as an ', () => {
- const exceptionList = mountWithAppProvider(
+ const exceptionList = mountWithApp(
', () => {
]}
/>,
);
- expect(exceptionList.find(Icon)).toHaveLength(1);
+
+ expect(exceptionList).toContainReactComponent(Icon);
});
it('renders an item without an icon', () => {
- const exceptionList = mountWithAppProvider(
+ const exceptionList = mountWithApp(
', () => {
]}
/>,
);
- expect(exceptionList.find(Icon)).toHaveLength(0);
+
+ expect(exceptionList).not.toContainReactComponent(Icon);
});
it('renders an item with a truncate', () => {
- const exceptionList = mountWithAppProvider(
+ const exceptionList = mountWithApp(
', () => {
]}
/>,
);
- expect(exceptionList.find(Truncate)).toHaveLength(1);
+
+ expect(exceptionList).toContainReactComponent(Truncate);
});
it('renders an item with a title', () => {
- const exceptionList = mountWithAppProvider(
+ const exceptionList = mountWithApp(
', () => {
]}
/>,
);
- expect(exceptionList.text()).toBe('Favorite customer');
+ expect(exceptionList).toContainReactText('Favorite customer');
});
});
diff --git a/src/components/Filters/components/ConnectedFilterControl/components/Item/tests/Item.test.tsx b/src/components/Filters/components/ConnectedFilterControl/components/Item/tests/Item.test.tsx
index 7f7e0b58027..f9a0d8a543f 100644
--- a/src/components/Filters/components/ConnectedFilterControl/components/Item/tests/Item.test.tsx
+++ b/src/components/Filters/components/ConnectedFilterControl/components/Item/tests/Item.test.tsx
@@ -1,23 +1,26 @@
import React from 'react';
-// eslint-disable-next-line no-restricted-imports
-import {mountWithAppProvider, trigger} from 'test-utilities/legacy';
+import {mountWithApp} from 'test-utilities';
import {Item} from '../Item';
describe(' ', () => {
it('handles focus', () => {
- const item = mountWithAppProvider( );
+ const item = mountWithApp( );
- trigger(item.find('div'), 'onFocus');
+ item.find('div')!.trigger('onFocus');
- expect(item.find('div').hasClass('Item-focused')).toBe(true);
+ expect(item).toContainReactComponent('div', {
+ className: expect.stringContaining('Item-focused'),
+ });
});
it('handles blur', () => {
- const item = mountWithAppProvider( );
+ const item = mountWithApp( );
- trigger(item.find('div'), 'onBlur');
+ item.find('div')!.trigger('onBlur');
- expect(item.find('div').hasClass('Item-focused')).toBe(false);
+ expect(item).not.toContainReactComponent('div', {
+ className: expect.stringContaining('Item-focused'),
+ });
});
});