diff --git a/src/courseware/course/sequence/Unit/ContentIFrame.jsx b/src/courseware/course/sequence/Unit/ContentIFrame.jsx index 8be355bf14..bc77182506 100644 --- a/src/courseware/course/sequence/Unit/ContentIFrame.jsx +++ b/src/courseware/course/sequence/Unit/ContentIFrame.jsx @@ -1,8 +1,6 @@ import PropTypes from 'prop-types'; -import React from 'react'; import { ErrorPage } from '@edx/frontend-platform/react'; -import { StrictDict } from '@edx/react-unit-test-utils'; import { ModalDialog } from '@openedx/paragon'; import { ContentIFrameLoaderSlot } from '../../../../plugin-slots/ContentIFrameLoaderSlot'; @@ -22,10 +20,10 @@ export const IFRAME_FEATURE_POLICY = ( 'microphone *; camera *; midi *; geolocation *; encrypted-media *; clipboard-write *; autoplay *' ); -export const testIDs = StrictDict({ +export const testIDs = { contentIFrame: 'content-iframe-test-id', modalIFrame: 'modal-iframe-test-id', -}); +}; const ContentIFrame = ({ iframeUrl, diff --git a/src/courseware/course/sequence/Unit/ContentIFrame.test.jsx b/src/courseware/course/sequence/Unit/ContentIFrame.test.jsx index 6ef5f08a95..86f72d7df3 100644 --- a/src/courseware/course/sequence/Unit/ContentIFrame.test.jsx +++ b/src/courseware/course/sequence/Unit/ContentIFrame.test.jsx @@ -1,25 +1,11 @@ -import React from 'react'; +import { render, screen } from '@testing-library/react'; -import { ErrorPage } from '@edx/frontend-platform/react'; -import { ModalDialog } from '@openedx/paragon'; -import { shallow } from '@edx/react-unit-test-utils'; - -import PageLoading from '@src/generic/PageLoading'; - -import { ContentIFrameLoaderSlot } from '@src/plugin-slots/ContentIFrameLoaderSlot'; import * as hooks from './hooks'; -import ContentIFrame, { IFRAME_FEATURE_POLICY, testIDs } from './ContentIFrame'; - -jest.mock('@edx/frontend-platform/react', () => ({ ErrorPage: 'ErrorPage' })); +import ContentIFrame, { IFRAME_FEATURE_POLICY } from './ContentIFrame'; -jest.mock('@openedx/paragon', () => jest.requireActual('@edx/react-unit-test-utils') - .mockComponents({ - ModalDialog: { - Body: 'ModalDialog.Body', - }, - })); +jest.mock('@edx/frontend-platform/react', () => ({ ErrorPage: () =>
ErrorPage
})); -jest.mock('@src/generic/PageLoading', () => 'PageLoading'); +jest.mock('@src/generic/PageLoading', () => jest.fn(() =>
PageLoading
)); jest.mock('./hooks', () => ({ useIFrameBehavior: jest.fn(), @@ -67,14 +53,13 @@ const props = { title: 'test-title', }; -let el; describe('ContentIFrame Component', () => { beforeEach(() => { jest.clearAllMocks(); }); describe('behavior', () => { beforeEach(() => { - el = shallow(); + render(); }); it('initializes iframe behavior hook', () => { expect(hooks.useIFrameBehavior).toHaveBeenCalledWith({ @@ -89,63 +74,56 @@ describe('ContentIFrame Component', () => { }); }); describe('output', () => { - let component; describe('if shouldShowContent', () => { describe('if not hasLoaded', () => { it('displays errorPage if showError', () => { - hooks.useIFrameBehavior.mockReturnValueOnce({ ...iframeBehavior, showError: true }); - el = shallow(); - expect(el.instance.findByType(ErrorPage).length).toEqual(1); + hooks.useIFrameBehavior.mockReturnValueOnce({ ...iframeBehavior, showError: true, shouldShowContent: true }); + render(); + const errorPage = screen.getByText('ErrorPage'); + expect(errorPage).toBeInTheDocument(); }); it('displays PageLoading component if not showError', () => { - el = shallow(); - [component] = el.instance.findByType(ContentIFrameLoaderSlot); - expect(component.props.loadingMessage).toEqual(props.loadingMessage); + render(); + const pageLoading = screen.getByText('PageLoading'); + expect(pageLoading).toBeInTheDocument(); }); }); describe('hasLoaded', () => { it('does not display PageLoading or ErrorPage', () => { hooks.useIFrameBehavior.mockReturnValueOnce({ ...iframeBehavior, hasLoaded: true }); - el = shallow(); - expect(el.instance.findByType(PageLoading).length).toEqual(0); - expect(el.instance.findByType(ErrorPage).length).toEqual(0); + render(); + const pageLoading = screen.queryByText('PageLoading'); + expect(pageLoading).toBeNull(); + const errorPage = screen.queryByText('ErrorPage'); + expect(errorPage).toBeNull(); }); }); it('display iframe with props from hooks', () => { - el = shallow(); - [component] = el.instance.findByTestId(testIDs.contentIFrame); - expect(component.props).toEqual({ - allow: IFRAME_FEATURE_POLICY, - allowFullScreen: true, - scrolling: 'no', - referrerPolicy: 'origin', - title: props.title, - id: props.elementId, - src: props.iframeUrl, - height: iframeBehavior.iframeHeight, - onLoad: iframeBehavior.handleIFrameLoad, - 'data-testid': testIDs.contentIFrame, - }); + render(); + const iframe = screen.getByTitle(props.title); + expect(iframe).toBeInTheDocument(); + expect(iframe).toHaveAttribute('id', props.elementId); + expect(iframe).toHaveAttribute('src', props.iframeUrl); + expect(iframe).toHaveAttribute('allow', IFRAME_FEATURE_POLICY); + expect(iframe).toHaveAttribute('allowfullscreen', ''); + expect(iframe).toHaveAttribute('scrolling', 'no'); + expect(iframe).toHaveAttribute('referrerpolicy', 'origin'); }); }); describe('if not shouldShowContent', () => { it('does not show PageLoading, ErrorPage, or unit-iframe-wrapper', () => { - el = shallow(); - expect(el.instance.findByType(PageLoading).length).toEqual(0); - expect(el.instance.findByType(ErrorPage).length).toEqual(0); - expect(el.instance.findByTestId(testIDs.contentIFrame).length).toEqual(0); + render(); + expect(screen.queryByText('PageLoading')).toBeNull(); + expect(screen.queryByText('ErrorPage')).toBeNull(); + expect(screen.queryByTitle(props.title)).toBeNull(); }); }); it('does not display modal if modalOptions returns isOpen: false', () => { - el = shallow(); - expect(el.instance.findByType(ModalDialog).length).toEqual(0); + render(); + const modal = screen.queryByRole('dialog'); + expect(modal).toBeNull(); }); describe('if modalOptions.isOpen', () => { - const testModalOpenAndHandleClose = () => { - test('Modal component isOpen, with handleModalClose from hook', () => { - expect(component.props.onClose).toEqual(modalIFrameData.handleModalClose); - }); - }; describe('fullscreen modal', () => { describe('body modal', () => { beforeEach(() => { @@ -153,16 +131,14 @@ describe('ContentIFrame Component', () => { ...modalIFrameData, modalOptions: { ...modalOptions.withBody, isFullscreen: true }, }); - el = shallow(); - [component] = el.instance.findByType(ModalDialog); + render(); }); it('displays Modal with div wrapping provided body content if modal.body is provided', () => { - const content = component.findByType(ModalDialog.Body)[0].children[0]; - expect(content.matches(shallow( -
{modalOptions.withBody.body}
, - ))).toEqual(true); + const dialog = screen.getByRole('dialog'); + expect(dialog).toBeInTheDocument(); + const modalBody = screen.getByText(modalOptions.withBody.body); + expect(modalBody).toBeInTheDocument(); }); - testModalOpenAndHandleClose(); }); describe('url modal', () => { beforeEach(() => { @@ -171,54 +147,38 @@ describe('ContentIFrame Component', () => { ...modalIFrameData, modalOptions: { ...modalOptions.withUrl, isFullscreen: true }, }); - el = shallow(); - [component] = el.instance.findByType(ModalDialog); + render(); }); - testModalOpenAndHandleClose(); it('displays Modal with iframe to provided url if modal.body is not provided', () => { - const content = component.findByType(ModalDialog.Body)[0].children[0]; - expect(content.matches(shallow( -