From e0e53f24f15fa647385d683780b099a424d34258 Mon Sep 17 00:00:00 2001
From: Dillon Dumesnil
Date: Fri, 23 Oct 2020 10:01:42 -0700
Subject: [PATCH] AA-397: Course Exit Tests (#257)
This also renames the CourseExit url from /course/{course_id}/course-exit
to /course/{course_id}/course-end for better UX.
---
src/courseware/course/Course.test.jsx | 15 --
.../course/course-exit/CourseCelebration.jsx | 49 +++---
.../course/course-exit/CourseExit.jsx | 5 +-
.../course/course-exit/CourseExit.test.jsx | 148 ++++++++++++++++++
.../course/course-exit/CourseNonPassing.jsx | 8 +-
src/courseware/course/sequence/Sequence.jsx | 2 +-
.../SequenceNavigation.jsx | 2 +-
.../SequenceNavigation.test.jsx | 36 +++++
.../sequence-navigation/UnitNavigation.jsx | 2 +-
.../UnitNavigation.test.jsx | 44 +++++-
.../__factories__/courseMetadata.factory.js | 6 +-
src/index.jsx | 2 +-
src/setupTest.js | 16 ++
13 files changed, 277 insertions(+), 58 deletions(-)
create mode 100644 src/courseware/course/course-exit/CourseExit.test.jsx
diff --git a/src/courseware/course/Course.test.jsx b/src/courseware/course/Course.test.jsx
index ea11ef2d..2b0faca5 100644
--- a/src/courseware/course/Course.test.jsx
+++ b/src/courseware/course/Course.test.jsx
@@ -57,21 +57,6 @@ describe('Course', () => {
jest.spyOn(console, 'warn').mockImplementation(() => {});
jest.spyOn(console, 'error').mockImplementation(() => {});
- // Mock media queries, because `Celebration` modal uses `react-break` for responsive breakpoints.
- Object.defineProperty(window, 'matchMedia', {
- writable: true,
- value: jest.fn().mockImplementation(query => ({
- matches: false,
- media: query,
- onchange: null,
- addListener: jest.fn(), // deprecated
- removeListener: jest.fn(), // deprecated
- addEventListener: jest.fn(),
- removeEventListener: jest.fn(),
- dispatchEvent: jest.fn(),
- })),
- });
-
const courseMetadata = Factory.build('courseMetadata', { celebrations: { firstSection: true } });
const testStore = await initializeTestStore({ courseMetadata }, false);
const { courseware, models } = testStore.getState();
diff --git a/src/courseware/course/course-exit/CourseCelebration.jsx b/src/courseware/course/course-exit/CourseCelebration.jsx
index 87173516..2b099724 100644
--- a/src/courseware/course/course-exit/CourseCelebration.jsx
+++ b/src/courseware/course/course-exit/CourseCelebration.jsx
@@ -5,8 +5,7 @@ import {
} from '@edx/frontend-platform/i18n';
import { layoutGenerator } from 'react-break';
import { Helmet } from 'react-helmet';
-import { useDispatch } from 'react-redux';
-import { useParams } from 'react-router-dom';
+import { useDispatch, useSelector } from 'react-redux';
import { LinkedinIcon } from 'react-share';
import { Alert, Button, Hyperlink } from '@edx/paragon';
import { getConfig } from '@edx/frontend-platform';
@@ -32,7 +31,7 @@ function CourseCelebration({ intl }) {
const OnMobile = layout.is('mobile');
const OnAtLeastTablet = layout.isAtLeast('tablet');
- const { courseId } = useParams();
+ const { courseId } = useSelector(state => state.courseware);
const dispatch = useDispatch();
const {
certificateData,
@@ -95,14 +94,16 @@ function CourseCelebration({ intl }) {
case 'downloadable':
title = intl.formatMessage(messages.certificateHeaderDownloadable);
message = (
-
+
+
+
);
if (certWebViewUrl) {
buttonLocation = `${getConfig().LMS_BASE_URL}${certWebViewUrl}`;
@@ -117,7 +118,7 @@ function CourseCelebration({ intl }) {
title = intl.formatMessage(messages.certificateHeaderNotAvailable);
message = (
<>
-
-
+
>
);
break;
@@ -141,7 +142,7 @@ function CourseCelebration({ intl }) {
case 'requesting':
buttonText = intl.formatMessage(messages.requestCertificateButton);
title = intl.formatMessage(messages.certificateHeaderRequestable);
- message = intl.formatMessage(messages.requestCertificateBodyText);
+ message = ({intl.formatMessage(messages.requestCertificateBodyText)}
);
break;
case 'unverified':
buttonText = intl.formatMessage(messages.verifyIdentityButton);
@@ -149,12 +150,14 @@ function CourseCelebration({ intl }) {
title = intl.formatMessage(messages.certificateHeaderUnverified);
// todo: check for idVerificationSupportLink null
message = (
-
+
+
+
);
break;
default:
@@ -194,7 +197,7 @@ function CourseCelebration({ intl }) {
{title}
-
{message}
+ {message}
{/* The requesting status needs a different button because it does a POST instead of a GET */}
{certStatus === 'requesting' && (