diff --git a/package-lock.json b/package-lock.json
index 7c102e3..ee69661 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -58,7 +58,6 @@
},
"devDependencies": {
"@edx/browserslist-config": "^1.3.0",
- "@edx/react-unit-test-utils": "^4.0.0",
"@edx/reactifex": "^2.1.1",
"@openedx/frontend-build": "^14.3.3",
"@testing-library/jest-dom": "^6.6.3",
@@ -2679,44 +2678,6 @@
"atlas": "atlas"
}
},
- "node_modules/@edx/react-unit-test-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@edx/react-unit-test-utils/-/react-unit-test-utils-4.0.0.tgz",
- "integrity": "sha512-QlVYhYD9L2bzx1eAtf8BbCJr00ek9rrHrG+/pW2bVSt+t0uvKHQpX1CNdMrDePv18DsMeC7IOB00t8ZIn4mi7w==",
- "dev": true,
- "license": "AGPL-3.0",
- "dependencies": {
- "@edx/browserslist-config": "^1.1.1",
- "@reduxjs/toolkit": "^1.5.1",
- "@testing-library/dom": "^10.4.0",
- "@testing-library/jest-dom": "^6.6.3",
- "@testing-library/react": "^16.2.0",
- "classnames": "^2.2.6",
- "core-js": "3.6.5",
- "lodash": "^4.17.21",
- "react-dev-utils": "^12.0.1",
- "react-test-renderer": "^18.3.1"
- },
- "peerDependencies": {
- "@edx/frontend-platform": "^8.3.1",
- "@openedx/frontend-build": "^14.3.0",
- "@openedx/paragon": "^22.0.0 || ^23.0.0",
- "react": "^18.0.0"
- }
- },
- "node_modules/@edx/react-unit-test-utils/node_modules/core-js": {
- "version": "3.6.5",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
- "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==",
- "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
"node_modules/@edx/reactifex": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@edx/reactifex/-/reactifex-2.2.0.tgz",
@@ -5351,6 +5312,7 @@
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
"integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5",
@@ -5506,7 +5468,8 @@
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
"integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@types/babel__core": {
"version": "7.20.5",
@@ -9475,7 +9438,8 @@
"version": "0.5.16",
"resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
"integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/dom-converter": {
"version": "0.2.0",
@@ -15292,6 +15256,7 @@
"resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
"integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
"license": "MIT",
+ "peer": true,
"bin": {
"lz-string": "bin/bin.js"
}
@@ -17761,6 +17726,7 @@
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
"integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"ansi-regex": "^5.0.1",
"ansi-styles": "^5.0.0",
@@ -17775,6 +17741,7 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=10"
},
diff --git a/package.json b/package.json
index 3666ebf..f8ec83d 100755
--- a/package.json
+++ b/package.json
@@ -76,7 +76,6 @@
},
"devDependencies": {
"@edx/browserslist-config": "^1.3.0",
- "@edx/react-unit-test-utils": "^4.0.0",
"@edx/reactifex": "^2.1.1",
"@openedx/frontend-build": "^14.3.3",
"@testing-library/jest-dom": "^6.6.3",
diff --git a/src/App.test.jsx b/src/App.test.jsx
index 364a377..aa86ae4 100644
--- a/src/App.test.jsx
+++ b/src/App.test.jsx
@@ -1,12 +1,8 @@
-import { render, screen } from '@testing-library/react';
-import { IntlProvider } from '@edx/frontend-platform/i18n';
+import { screen } from '@testing-library/react';
import { selectors } from 'data/redux';
+import { renderWithIntl } from './testUtils';
import { App, mapStateToProps } from './App';
-jest.unmock('react');
-jest.unmock('@openedx/paragon');
-jest.unmock('@edx/frontend-platform/i18n');
-
// we want to scope these tests to the App component, so we mock some child components to reduce complexity
jest.mock('@edx/frontend-platform/auth', () => ({
@@ -39,12 +35,6 @@ jest.mock('data/redux', () => ({
},
}));
-const renderWithIntl = (component) => render(
-
- {component}
- ,
-);
-
describe('App component', () => {
const defaultProps = {
courseMetadata: {
diff --git a/src/__snapshots__/index.test.jsx.snap b/src/__snapshots__/index.test.jsx.snap
deleted file mode 100644
index a5904fa..0000000
--- a/src/__snapshots__/index.test.jsx.snap
+++ /dev/null
@@ -1,28 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`app registry subscribe: APP_INIT_ERROR. snapshot: displays an ErrorPage to root element 1`] = `
-
-
-
-`;
-
-exports[`app registry subscribe: APP_READY. links App to root element 1`] = `
-
-
-
-
-
-`;
diff --git a/src/components/ConfirmModal.test.jsx b/src/components/ConfirmModal.test.jsx
index b85118a..03e6cd3 100644
--- a/src/components/ConfirmModal.test.jsx
+++ b/src/components/ConfirmModal.test.jsx
@@ -2,9 +2,6 @@ import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { ConfirmModal } from './ConfirmModal';
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
-
describe('ConfirmModal', () => {
const props = {
isOpen: false,
@@ -21,13 +18,13 @@ describe('ConfirmModal', () => {
});
it('should not render content when modal is closed', () => {
- const { queryByText } = render();
- expect(queryByText(props.content)).toBeNull();
+ render();
+ expect(screen.queryByText(props.content)).toBeNull();
});
it('should display content when modal is open', () => {
- const { getByText } = render();
- expect(getByText(props.content)).toBeInTheDocument();
+ render();
+ expect(screen.getByText(props.content)).toBeInTheDocument();
});
it('should call onCancel when cancel button is clicked', async () => {
diff --git a/src/components/DemoAlert/index.test.jsx b/src/components/DemoAlert/index.test.jsx
index 604d7e5..25a08f4 100644
--- a/src/components/DemoAlert/index.test.jsx
+++ b/src/components/DemoAlert/index.test.jsx
@@ -1,12 +1,10 @@
-import { render, fireEvent } from '@testing-library/react';
+import { screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+import { renderWithIntl } from '../../testUtils';
-import { formatMessage } from 'testUtils';
import messages from './messages';
import { DemoAlert } from '.';
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
-
describe('DemoAlert component', () => {
const props = {
isOpen: true,
@@ -14,20 +12,21 @@ describe('DemoAlert component', () => {
};
it('does not render when isOpen is false', () => {
- const { queryByText } = render();
- expect(queryByText(formatMessage(messages.title))).toBeNull();
+ renderWithIntl();
+ expect(screen.queryByText(messages.title.defaultMessage)).toBeNull();
});
it('renders with correct title and message when isOpen is true', () => {
- const { getByText } = render();
- expect(getByText(formatMessage(messages.title))).toBeInTheDocument();
- expect(getByText(formatMessage(messages.warningMessage))).toBeInTheDocument();
+ renderWithIntl();
+ expect(screen.getByText(messages.title.defaultMessage)).toBeInTheDocument();
+ expect(screen.getByText(messages.warningMessage.defaultMessage)).toBeInTheDocument();
});
- it('calls onClose when confirmation button is clicked', () => {
- const { getByText } = render();
- const confirmButton = getByText(formatMessage(messages.confirm));
- fireEvent.click(confirmButton);
+ it('calls onClose when confirmation button is clicked', async () => {
+ renderWithIntl();
+ const user = userEvent.setup();
+ const confirmButton = screen.getByText(messages.confirm.defaultMessage);
+ await user.click(confirmButton);
expect(props.onClose).toHaveBeenCalled();
});
});
diff --git a/src/components/FilePopoverContent/index.test.jsx b/src/components/FilePopoverContent/index.test.jsx
index 1ca1eea..85c238a 100644
--- a/src/components/FilePopoverContent/index.test.jsx
+++ b/src/components/FilePopoverContent/index.test.jsx
@@ -1,11 +1,10 @@
-import { render } from '@testing-library/react';
-
+import { screen } from '@testing-library/react';
import filesize from 'filesize';
+import { renderWithIntl } from '../../testUtils';
+
import FilePopoverContent from '.';
jest.mock('filesize', () => (size) => `filesize(${size})`);
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
describe('FilePopoverContent', () => {
describe('component', () => {
@@ -18,23 +17,23 @@ describe('FilePopoverContent', () => {
describe('behavior', () => {
it('renders file name correctly', () => {
- const { getByText } = render();
- expect(getByText(props.name)).toBeInTheDocument();
+ renderWithIntl();
+ expect(screen.getByText(props.name)).toBeInTheDocument();
});
it('renders file description correctly', () => {
- const { getByText } = render();
- expect(getByText(props.description)).toBeInTheDocument();
+ renderWithIntl();
+ expect(screen.getByText(props.description)).toBeInTheDocument();
});
it('renders file size correctly', () => {
- const { getByText } = render();
- expect(getByText(filesize(props.size))).toBeInTheDocument();
+ renderWithIntl();
+ expect(screen.getByText(filesize(props.size))).toBeInTheDocument();
});
it('renders "Unknown" when size is null', () => {
- const { getByText } = render();
- expect(getByText('Unknown')).toBeInTheDocument();
+ renderWithIntl();
+ expect(screen.getByText('Unknown')).toBeInTheDocument();
});
});
});
diff --git a/src/components/FilePreview/Banners/ErrorBanner.test.jsx b/src/components/FilePreview/Banners/ErrorBanner.test.jsx
index 990c938..b975445 100644
--- a/src/components/FilePreview/Banners/ErrorBanner.test.jsx
+++ b/src/components/FilePreview/Banners/ErrorBanner.test.jsx
@@ -1,10 +1,8 @@
-import { render, screen } from '@testing-library/react';
+import { screen } from '@testing-library/react';
+import { renderWithIntl } from '../../../testUtils';
import ErrorBanner from './ErrorBanner';
import messages from '../messages';
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
-
describe('Error Banner component', () => {
const children =
Abitary Child
;
@@ -27,25 +25,25 @@ describe('Error Banner component', () => {
describe('behavior', () => {
it('renders children content', () => {
- render();
+ renderWithIntl();
const childText = screen.getByText('Abitary Child');
expect(childText).toBeInTheDocument();
});
it('renders the correct number of action buttons', () => {
- render();
- const buttons = screen.getAllByText('FormattedMessage');
- expect(buttons).toHaveLength(3);
+ renderWithIntl();
+ const buttons = screen.getAllByText(messages.retryButton.defaultMessage);
+ expect(buttons).toHaveLength(2);
});
it('renders error heading with correct message', () => {
- render();
- const heading = screen.getAllByText('FormattedMessage')[0];
+ renderWithIntl();
+ const heading = screen.getAllByText(messages.unknownError.defaultMessage)[0];
expect(heading).toBeInTheDocument();
});
it('renders with danger variant', () => {
- render();
+ renderWithIntl();
const alert = screen.getByRole('alert');
expect(alert).toHaveClass('alert-danger');
});
diff --git a/src/components/FilePreview/Banners/LoadingBanner.test.jsx b/src/components/FilePreview/Banners/LoadingBanner.test.jsx
index f0abfb3..94c1c6b 100644
--- a/src/components/FilePreview/Banners/LoadingBanner.test.jsx
+++ b/src/components/FilePreview/Banners/LoadingBanner.test.jsx
@@ -1,9 +1,6 @@
import { render, screen } from '@testing-library/react';
import LoadingBanner from './LoadingBanner';
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
-
describe('Loading Banner component', () => {
describe('behavior', () => {
it('renders an info alert', () => {
diff --git a/src/components/FilePreview/BaseRenderers/ImageRenderer.test.jsx b/src/components/FilePreview/BaseRenderers/ImageRenderer.test.jsx
index d558318..884182b 100644
--- a/src/components/FilePreview/BaseRenderers/ImageRenderer.test.jsx
+++ b/src/components/FilePreview/BaseRenderers/ImageRenderer.test.jsx
@@ -3,9 +3,6 @@ import { render, screen } from '@testing-library/react';
import ImageRenderer from './ImageRenderer';
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
-
describe('Image Renderer Component', () => {
const props = {
url: 'some_url.jpg',
diff --git a/src/components/FilePreview/BaseRenderers/PDFRenderer.test.jsx b/src/components/FilePreview/BaseRenderers/PDFRenderer.test.jsx
index fc8cc80..54184f2 100644
--- a/src/components/FilePreview/BaseRenderers/PDFRenderer.test.jsx
+++ b/src/components/FilePreview/BaseRenderers/PDFRenderer.test.jsx
@@ -21,9 +21,6 @@ jest.mock('./pdfHooks', () => ({
rendererHooks: jest.fn(),
}));
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
-
describe('PDF Renderer Component', () => {
const props = {
url: 'some_url.pdf',
diff --git a/src/components/FilePreview/BaseRenderers/TXTRenderer.test.jsx b/src/components/FilePreview/BaseRenderers/TXTRenderer.test.jsx
index 46ee11f..b65a648 100644
--- a/src/components/FilePreview/BaseRenderers/TXTRenderer.test.jsx
+++ b/src/components/FilePreview/BaseRenderers/TXTRenderer.test.jsx
@@ -8,9 +8,6 @@ jest.mock('./textHooks', () => {
};
});
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
-
const textHooks = require('./textHooks');
describe('TXT Renderer Component', () => {
diff --git a/src/components/FilePreview/BaseRenderers/pdfHooks.test.js b/src/components/FilePreview/BaseRenderers/pdfHooks.test.js
index bbe7b02..c0ad5ab 100644
--- a/src/components/FilePreview/BaseRenderers/pdfHooks.test.js
+++ b/src/components/FilePreview/BaseRenderers/pdfHooks.test.js
@@ -12,6 +12,11 @@ jest.mock('react-pdf', () => ({
Page: () => 'Page',
}));
+jest.mock('react', () => ({
+ ...jest.requireActual('react'),
+ useRef: jest.fn((val) => ({ current: val, useRef: true })),
+}));
+
const state = new MockUseState(hooks);
const hookKeys = keyStore(hooks);
diff --git a/src/components/FilePreview/BaseRenderers/textHooks.test.js b/src/components/FilePreview/BaseRenderers/textHooks.test.js
index f0a2c87..09a84bf 100644
--- a/src/components/FilePreview/BaseRenderers/textHooks.test.js
+++ b/src/components/FilePreview/BaseRenderers/textHooks.test.js
@@ -10,6 +10,11 @@ jest.mock('axios', () => ({
get: jest.fn(),
}));
+jest.mock('react', () => ({
+ ...jest.requireActual('react'),
+ useEffect: jest.fn((cb, prereqs) => ({ useEffect: { cb, prereqs } })),
+}));
+
const hookKeys = keyStore(hooks);
const state = new MockUseState(hooks);
diff --git a/src/components/FilePreview/FileCard.test.jsx b/src/components/FilePreview/FileCard.test.jsx
index 8eb9bd9..59b1133 100644
--- a/src/components/FilePreview/FileCard.test.jsx
+++ b/src/components/FilePreview/FileCard.test.jsx
@@ -3,8 +3,6 @@ import FileCard from './FileCard';
jest.mock('components/FilePopoverContent', () => 'FilePopoverContent');
jest.mock('./FileInfo', () => 'FileInfo');
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
describe('File Preview Card component', () => {
const props = {
diff --git a/src/components/FilePreview/FileInfo.test.jsx b/src/components/FilePreview/FileInfo.test.jsx
index c0f7d36..8736bef 100644
--- a/src/components/FilePreview/FileInfo.test.jsx
+++ b/src/components/FilePreview/FileInfo.test.jsx
@@ -1,10 +1,9 @@
-import { render, screen } from '@testing-library/react';
+import { screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
+import { renderWithIntl } from '../../testUtils';
import FileInfo from './FileInfo';
-
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
+import messages from './messages';
describe('FileInfo component', () => {
const children = (some Children
);
@@ -16,15 +15,14 @@ describe('FileInfo component', () => {
describe('Component rendering', () => {
it('renders the FileInfo button with correct text', () => {
- render({children});
-
- expect(screen.getByText('FormattedMessage')).toBeInTheDocument();
+ renderWithIntl({children});
+ expect(screen.getByText(messages.fileInfo.defaultMessage)).toBeInTheDocument();
});
it('calls onClick when button is clicked', async () => {
- render({children});
+ renderWithIntl({children});
const user = userEvent.setup();
- await user.click(screen.getByText('FormattedMessage'));
+ await user.click(screen.getByText(messages.fileInfo.defaultMessage));
expect(props.onClick).toHaveBeenCalledTimes(1);
});
});
diff --git a/src/components/FilePreview/FileRenderer.test.jsx b/src/components/FilePreview/FileRenderer.test.jsx
index 08e1e22..80a786e 100644
--- a/src/components/FilePreview/FileRenderer.test.jsx
+++ b/src/components/FilePreview/FileRenderer.test.jsx
@@ -1,12 +1,10 @@
-import { render, screen } from '@testing-library/react';
+import { screen } from '@testing-library/react';
import { keyStore } from 'utils';
import { ErrorStatuses } from 'data/constants/requests';
+import { renderWithIntl } from '../../testUtils';
import { FileRenderer } from './FileRenderer';
import * as hooks from './hooks';
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
-
const hookKeys = keyStore(hooks);
const props = {
@@ -27,7 +25,7 @@ describe('FileRenderer', () => {
rendererProps: { prop: 'hooks.rendererProps' },
};
jest.spyOn(hooks, hookKeys.renderHooks).mockReturnValueOnce(hookProps);
- render();
+ renderWithIntl();
expect(screen.getByText('filename.txt')).toBeInTheDocument();
expect(screen.getByTestId('mock-renderer')).toBeInTheDocument();
@@ -50,7 +48,7 @@ describe('FileRenderer', () => {
};
jest.spyOn(hooks, hookKeys.renderHooks).mockReturnValueOnce(hookProps);
- render();
+ renderWithIntl();
expect(screen.getByText('filename.txt')).toBeInTheDocument();
expect(screen.getByText('Error Message')).toBeInTheDocument();
@@ -68,7 +66,7 @@ describe('FileRenderer', () => {
};
jest.spyOn(hooks, hookKeys.renderHooks).mockReturnValueOnce(hookProps);
- render();
+ renderWithIntl();
expect(screen.getByText('filename.txt')).toBeInTheDocument();
expect(screen.getByTestId('mock-renderer')).toBeInTheDocument();
diff --git a/src/components/Head/index.test.jsx b/src/components/Head/index.test.jsx
index d1d8d55..1cd2876 100644
--- a/src/components/Head/index.test.jsx
+++ b/src/components/Head/index.test.jsx
@@ -27,9 +27,6 @@ jest.mock('@edx/frontend-platform', () => ({
}),
}));
-jest.unmock('@openedx/paragon');
-jest.unmock('react');
-
describe('Head', () => {
it('should render page title with site name from config', () => {
const { container } = render(