From ec7f532bc943db1caf4d618ae9c3ace95d9de8e5 Mon Sep 17 00:00:00 2001 From: Agrendalath Date: Fri, 26 Jun 2020 04:23:08 +0200 Subject: [PATCH] [TNL-7268] WIP: Add high priority tests --- jest.config.js | 2 +- .../course/sequence/SequenceContent.test.jsx | 94 ++++ .../SequenceContent.test.jsx.snap | 271 +++++++++++ .../SequenceNavigation.test.jsx | 142 ++++++ .../SequenceNavigationDropdown.test.jsx | 79 ++++ .../SequenceNavigationTabs.test.jsx | 57 +++ .../sequence-navigation/UnitButton.test.jsx | 77 ++++ .../sequence-navigation/UnitIcon.test.jsx | 27 ++ .../UnitNavigation.test.jsx | 109 +++++ .../SequenceNavigation.test.jsx.snap | 244 ++++++++++ .../SequenceNavigationDropdown.test.jsx.snap | 26 ++ .../SequenceNavigationTabs.test.jsx.snap | 436 ++++++++++++++++++ .../__snapshots__/UnitButton.test.jsx.snap | 143 ++++++ .../__snapshots__/UnitIcon.test.jsx.snap | 61 +++ .../UnitNavigation.test.jsx.snap | 36 ++ src/setupTest.js | 1 + .../@fortawesome/react-fontawesome.js | 32 ++ src/test/test-utils.js | 49 ++ 18 files changed, 1885 insertions(+), 1 deletion(-) create mode 100644 src/courseware/course/sequence/SequenceContent.test.jsx create mode 100644 src/courseware/course/sequence/__snapshots__/SequenceContent.test.jsx.snap create mode 100644 src/courseware/course/sequence/sequence-navigation/SequenceNavigation.test.jsx create mode 100644 src/courseware/course/sequence/sequence-navigation/SequenceNavigationDropdown.test.jsx create mode 100644 src/courseware/course/sequence/sequence-navigation/SequenceNavigationTabs.test.jsx create mode 100644 src/courseware/course/sequence/sequence-navigation/UnitButton.test.jsx create mode 100644 src/courseware/course/sequence/sequence-navigation/UnitIcon.test.jsx create mode 100644 src/courseware/course/sequence/sequence-navigation/UnitNavigation.test.jsx create mode 100644 src/courseware/course/sequence/sequence-navigation/__snapshots__/SequenceNavigation.test.jsx.snap create mode 100644 src/courseware/course/sequence/sequence-navigation/__snapshots__/SequenceNavigationDropdown.test.jsx.snap create mode 100644 src/courseware/course/sequence/sequence-navigation/__snapshots__/SequenceNavigationTabs.test.jsx.snap create mode 100644 src/courseware/course/sequence/sequence-navigation/__snapshots__/UnitButton.test.jsx.snap create mode 100644 src/courseware/course/sequence/sequence-navigation/__snapshots__/UnitIcon.test.jsx.snap create mode 100644 src/courseware/course/sequence/sequence-navigation/__snapshots__/UnitNavigation.test.jsx.snap create mode 100644 src/test/__mocks__/@fortawesome/react-fontawesome.js create mode 100644 src/test/test-utils.js diff --git a/jest.config.js b/jest.config.js index 7c936b4c..dc38c063 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,7 +1,7 @@ const { createConfig } = require('@edx/frontend-build'); module.exports = createConfig('jest', { - setupFiles: [ + setupFilesAfterEnv: [ '/src/setupTest.js', ], coveragePathIgnorePatterns: [ diff --git a/src/courseware/course/sequence/SequenceContent.test.jsx b/src/courseware/course/sequence/SequenceContent.test.jsx new file mode 100644 index 00000000..f0bbf2e3 --- /dev/null +++ b/src/courseware/course/sequence/SequenceContent.test.jsx @@ -0,0 +1,94 @@ +import React from 'react'; +import { render, screen } from '../../../test/test-utils'; +import SequenceContent from './SequenceContent'; + +describe('Sequence Content', () => { + window.scrollTo = jest.fn(); + // HACK: Mock the MutationObserver as it's breaking async testing. + // According to StackOverflow it should be fixed in `jest-environment-jsdom` v16, + // but upgrading `jest` to v26 didn't fix this problem. + // ref: https://stackoverflow.com/questions/61036156/react-typescript-testing-typeerror-mutationobserver-is-not-a-constructor + global.MutationObserver = class { + // eslint-disable-next-line no-unused-vars,no-useless-constructor,no-empty-function + constructor(callback) {} + + disconnect() {} + + // eslint-disable-next-line no-unused-vars + observe(element, initObject) {} + }; + + const testUnits = [...Array(10).keys()].map(i => String(i + 1)); + const initialState = { + courseware: { + sequenceStatus: 'loaded', + courseStatus: 'loaded', + courseId: '1', + }, + models: { + courses: { + 1: { + sectionIds: ['1'], + }, + }, + sections: { + 1: { + sequenceIds: ['1', '2'], + }, + }, + sequences: { + 1: { + unitIds: testUnits, + showCompletion: true, + title: 'test-sequence', + gatedContent: { + prereqId: '1', + gatedSectionName: 'test-gated-section', + }, + }, + }, + units: testUnits.reduce( + (acc, unitId) => Object.assign(acc, { + [unitId]: { + id: unitId, + contentType: 'other', + title: unitId, + }, + }), + {}, + ), + }, + }; + + const mockData = { + gated: false, + courseId: '1', + sequenceId: '1', + unitId: '1', + unitLoadedHandler: () => {}, + intl: {}, + }; + + it('displays loading message', () => { + const { asFragment } = render(, { initialState }); + expect(screen.getByText('Loading learning sequence...')).toBeInTheDocument(); + expect(asFragment()).toMatchSnapshot(); + }); + + it('displays messages for the locked content', async () => { + const { asFragment } = render(, { initialState }); + expect(screen.getByText('Loading locked content messaging...')).toBeInTheDocument(); + expect(asFragment()).toMatchSnapshot(); + + expect(await screen.findByText(/content locked/i)).toBeInTheDocument(); + expect(screen.getByText('test-sequence')).toBeInTheDocument(); + expect(screen.queryByText('Loading locked content messaging...')).not.toBeInTheDocument(); + expect(asFragment()).toMatchSnapshot(); + }); + + it('displays message for no content', () => { + const { asFragment } = render(, { initialState }); + expect(screen.getByText('There is no content here.')).toBeInTheDocument(); + expect(asFragment()).toMatchSnapshot(); + }); +}); diff --git a/src/courseware/course/sequence/__snapshots__/SequenceContent.test.jsx.snap b/src/courseware/course/sequence/__snapshots__/SequenceContent.test.jsx.snap new file mode 100644 index 00000000..a3d7a4b6 --- /dev/null +++ b/src/courseware/course/sequence/__snapshots__/SequenceContent.test.jsx.snap @@ -0,0 +1,271 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Sequence Content displays loading message 1`] = ` + +
+

+ 1 +

+ +
+
+
+ + Loading learning sequence... + +
+
+
+
+