+ test-support-email
+ ,
+ }
+ }
+ />
+
+`;
diff --git a/src/containers/CourseCard/components/Banners/messages.js b/src/containers/CourseCard/components/Banners/messages.js
new file mode 100644
index 0000000..052d800
--- /dev/null
+++ b/src/containers/CourseCard/components/Banners/messages.js
@@ -0,0 +1,96 @@
+import { StrictDict } from 'utils';
+
+export const messages = StrictDict({
+ auditAccessExpired: {
+ id: 'learner-dash.courseCard.banners.auditAccessExpired',
+ description: 'Audit access expiration banner message',
+ defaultMessage: 'Your audit access to this course has expired.',
+ },
+ upgradeToAccess: {
+ id: 'learner-dash.courseCard.banners.upgradeToAccess',
+ description: 'Upgrade prompt for audit-expired learners that can still upgrade',
+ defaultMessage: 'Upgrade now to access your course again.',
+ },
+ findAnotherCourse: {
+ id: 'learner-dash.courseCard.banners.findAnotherCourse',
+ description: 'Action prompt taking learners to course exploration',
+ defaultMessage: 'Find another course',
+ },
+ upgradeDeadlinePassed: {
+ id: 'learner-dash.courseCard.banners.upgradeDeadlinePassed',
+ description: 'Audit upgrade deadline passed banner message',
+ defaultMessage: 'Your upgrade deadline for this course has passed. To upgrade, enroll in a session that is farther in the future.',
+ },
+ exploreCourseDetails: {
+ id: 'learner-dash.courseCard.banners.exploreCourseDetails',
+ description: 'Action prompt taking learners to course details page',
+ defaultMessage: 'Explore course details.',
+ },
+ certRestricted: {
+ id: 'learner-dash.courseCard.banners.certificateRestricted',
+ description: 'Restricted certificate warning message',
+ defaultMessage: 'Your Certificate of Achievement is being held pending confirmation that the issuance of your Certificate is in compliance with strict U.S. embargoes on Iran, Cuba, Syria, and Sudan. If you think our system has mistakenly identified you as being connected with one of those countries, please let us know by contacting {supportEmail}.',
+ },
+ certRefundContactBilling: {
+ id: 'learner-dash.courseCard.banners.certificateRefundContactBilling',
+ description: 'Message to learners to contact billing for certificate refunds',
+ defaultMessage: 'If you would like a refund on your Certificate of Achievement, please contact our billing address {billingEmail}',
+ },
+ passingGrade: {
+ id: 'learner-dash.courseCard.banners.passingGrade',
+ description: 'Message to learners with minimum passing grade for the course',
+ defaultMessage: 'Grade required to pass the course: {minPassingGrade}',
+ },
+ notEligibleForCert: {
+ id: 'learner-dash.courseCard.banners.notEligibleForCert',
+ description: 'Certificate inelligibility message',
+ defaultMessage: 'You are not eligible for a certificate.',
+ },
+ viewGrades: {
+ id: 'learner-dash.courseCard.banners.viewGrades',
+ description: 'Gradses link text',
+ defaultMessage: 'View grades.',
+ },
+ certReady: {
+ id: 'learner-dash.courseCard.banners.certReady',
+ description: 'Certificate ready message',
+ defaultMessage: 'Congratulations. Your certificate is ready.',
+ },
+ viewCertificate: {
+ id: 'learner-dash.courseCard.banners.viewCertificate',
+ description: 'Certificate link text',
+ defaultMessage: 'View Certificate.',
+ },
+ certMinGrade: {
+ id: 'learner-dash.courseCard.banners.certMinGrade',
+ description: 'Passing grade requirement message',
+ defaultMessage: 'Grade required for a certificate: {minPassingGrade}',
+ },
+ downloadCertificate: {
+ id: 'learner-dash.courseCard.banners.downloadCertificate',
+ description: 'Certificate download link text',
+ defaultMessage: 'Download Certificate.',
+ },
+ gradeAndCertReadyAfter: {
+ id: 'learner-dash.courseCard.banners.gradseAndCertReadyAfter',
+ description: 'Grade and certificate availability date message',
+ defaultMessage: 'Your grade and certificate will be ready after {availableDate}.',
+ },
+ entitlementsUnavailable: {
+ id: 'learner-dash.courseCard.banners.entitlementsUnavailable',
+ description: 'Entitlements course message when no sessions are available',
+ defaultMessage: 'There are no sessions available at the moment. The course team will create new sessions soon. If no sessions appear, please contact {emailLink} for information.',
+ },
+ entitlementsExpiringSoon: {
+ id: 'learner-dash.courseCard.banners.entitlementsExpiringSoon',
+ description: 'Entitlements course message when the entitlement is expiring soon.',
+ defaultMessage: 'You must {selectSessionButton} by {changeDeadline} to access the course.',
+ },
+ selectSession: {
+ id: 'learner-dash.courseCard.banners.selectSession',
+ description: 'Entitlements session selection link text',
+ defaultMessage: 'select a session',
+ },
+});
+
+export default messages;
diff --git a/src/containers/CourseCard/components/CourseCardActions/hooks.js b/src/containers/CourseCard/components/CourseCardActions/hooks.js
index 2661f5a..ba168ee 100644
--- a/src/containers/CourseCard/components/CourseCardActions/hooks.js
+++ b/src/containers/CourseCard/components/CourseCardActions/hooks.js
@@ -1,37 +1,35 @@
import { Locked } from '@edx/paragon/icons';
+import { useIntl } from '@edx/frontend-platform/i18n';
-import { selectors } from 'data/redux';
-import { useIntl, useCardValues } from 'hooks';
+import { hooks as appHooks } from 'data/redux';
import messages from './messages';
-const { cardData } = selectors;
-
export const useCardActionData = ({ courseNumber }) => {
const { formatMessage } = useIntl();
- const data = useCardValues(courseNumber, {
- canUpgrade: cardData.canUpgrade,
- isAudit: cardData.isAudit,
- isAuditAccessExpired: cardData.isAuditAccessExpired,
- isVerified: cardData.isVerified,
- isPending: cardData.isCourseRunPending,
- isFinished: cardData.isCourseRunFinished,
- });
+ const {
+ canUpgrade,
+ isAudit,
+ isAuditAccessExpired,
+ isVerified,
+ } = appHooks.useCardEnrollmentData(courseNumber);
+ const { isPending, isArchived } = appHooks.useCardCourseRunData(courseNumber);
+
let primary;
let secondary = null;
- if (!data.isVerified) {
+ if (!isVerified) {
secondary = {
iconBefore: Locked,
variant: 'outline-primary',
- disabled: !data.canUpgrade,
+ disabled: !canUpgrade,
children: formatMessage(messages.upgrade),
};
}
- if (data.isPending) {
+ if (isPending) {
primary = { children: formatMessage(messages.beginCourse) };
- } else if (!data.isFinished) {
+ } else if (!isArchived) {
primary = {
children: formatMessage(messages.resume),
- disabled: data.isAudit && data.isAuditAccessExpired,
+ disabled: isAudit && isAuditAccessExpired,
};
} else {
primary = { children: formatMessage(messages.viewCourse) };
diff --git a/src/containers/CourseCard/components/CourseCardActions/hooks.test.js b/src/containers/CourseCard/components/CourseCardActions/hooks.test.js
index 8b14c0c..58c9107 100644
--- a/src/containers/CourseCard/components/CourseCardActions/hooks.test.js
+++ b/src/containers/CourseCard/components/CourseCardActions/hooks.test.js
@@ -1,54 +1,48 @@
import { Locked } from '@edx/paragon/icons';
+import { useIntl } from '@edx/frontend-platform/i18n';
-import { selectors } from 'data/redux';
+import { hooks as appHooks } from 'data/redux';
-import * as appHooks from 'hooks';
-import { testCardValues } from 'testUtils';
import * as hooks from './hooks';
import messages from './messages';
-const courseNumber = 'my-test-course-number';
-const { fieldKeys } = selectors.cardData;
+jest.mock('data/redux', () => ({
+ hooks: {
+ useCardCourseRunData: jest.fn(),
+ useCardEnrollmentData: jest.fn(),
+ },
+}));
-const props = {
+const courseNumber = 'my-test-course-number';
+
+const enrollmentData = {
canUpgrade: false,
isAudit: true,
isAuditAccessExpired: false,
isVerified: false,
+};
+const courseRunData = {
isPending: false,
- isFinished: false,
+ isArchived: false,
};
describe('CourseCardActions hooks', () => {
let out;
- const { formatMessage } = appHooks.useIntl();
- describe('data connection', () => {
- beforeEach(() => {
- out = hooks.useCardActionData({ courseNumber });
- });
- testCardValues(courseNumber, {
- canUpgrade: fieldKeys.canUpgrade,
- isAudit: fieldKeys.isAudit,
- isAuditAccessExpired: fieldKeys.isAuditAccessExpired,
- isVerified: fieldKeys.isVerified,
- isPending: fieldKeys.isCourseRunPending,
- isFinished: fieldKeys.isCourseRunFinished,
- });
- });
+ const { formatMessage } = useIntl();
+ const runHook = (overrides = {}) => {
+ const { enrollment = {}, courseRun = {} } = overrides;
+ appHooks.useCardCourseRunData.mockReturnValueOnce({ ...courseRunData, ...courseRun });
+ appHooks.useCardEnrollmentData.mockReturnValueOnce({ ...enrollmentData, ...enrollment });
+ out = hooks.useCardActionData({ courseNumber });
+ };
describe('secondary action', () => {
it('returns null if verified', () => {
- appHooks.useCardValues.mockReturnValueOnce({
- ...props,
- isAudit: false,
- isVerified: true,
- });
- out = hooks.useCardActionData({ courseNumber });
+ runHook({ enrollment: { isAudit: false, isVerified: true } });
expect(out.secondary).toEqual(null);
});
it('returns disabled upgrade button if audit, but cannot upgrade', () => {
- appHooks.useCardValues.mockReturnValueOnce(props);
- out = hooks.useCardActionData({ courseNumber });
+ runHook();
expect(out.secondary).toEqual({
iconBefore: Locked,
variant: 'outline-primary',
@@ -57,8 +51,7 @@ describe('CourseCardActions hooks', () => {
});
});
it('returns enabled upgrade button if audit and can upgrade', () => {
- appHooks.useCardValues.mockReturnValueOnce({ ...props, canUpgrade: true });
- out = hooks.useCardActionData({ courseNumber });
+ runHook({ enrollment: { canUpgrade: true } });
expect(out.secondary).toEqual({
iconBefore: Locked,
variant: 'outline-primary',
@@ -69,37 +62,30 @@ describe('CourseCardActions hooks', () => {
});
describe('primary action', () => {
it('returns Begin Course button if pending', () => {
- appHooks.useCardValues.mockReturnValueOnce({ ...props, isPending: true });
- out = hooks.useCardActionData({ courseNumber });
- expect(out.primary).toEqual({
- children: formatMessage(messages.beginCourse),
- });
+ runHook({ courseRun: { isPending: true } });
+ expect(out.primary).toEqual({ children: formatMessage(messages.beginCourse) });
});
it('returns enabled Resume button if active, and not audit with expired access', () => {
- appHooks.useCardValues.mockReturnValueOnce({ ...props, isAuditAccessExpired: true });
- out = hooks.useCardActionData({ courseNumber });
+ runHook({ enrollment: { isAuditAccessExpired: true } });
expect(out.primary).toEqual({
children: formatMessage(messages.resume),
disabled: true,
});
});
it('returns disabled Resume button if active and audit without expired access', () => {
- appHooks.useCardValues.mockReturnValueOnce({ ...props });
- out = hooks.useCardActionData({ courseNumber });
+ runHook();
expect(out.primary).toEqual({
children: formatMessage(messages.resume),
disabled: false,
});
- appHooks.useCardValues.mockReturnValueOnce({ ...props, isAudit: false, isVerified: true });
- out = hooks.useCardActionData({ courseNumber });
+ runHook({ enrollment: { isAudit: false, isVerified: true } });
expect(out.primary).toEqual({
children: formatMessage(messages.resume),
disabled: false,
});
});
- it('returns viewCourse button if finished', () => {
- appHooks.useCardValues.mockReturnValueOnce({ ...props, isFinished: true });
- out = hooks.useCardActionData({ courseNumber });
+ it('returns viewCourse button if archived', () => {
+ runHook({ courseRun: { isArchived: true } });
expect(out.primary).toEqual({
children: formatMessage(messages.viewCourse),
});
diff --git a/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.jsx b/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.jsx
index 875f892..0021cb0 100644
--- a/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.jsx
+++ b/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.jsx
@@ -2,14 +2,11 @@ import React from 'react';
import { useIntl } from '@edx/frontend-platform/i18n';
import { StrictDict } from 'utils';
-import { selectors } from 'data/redux';
-import { useCardValues } from 'hooks';
+import { hooks as appHooks } from 'data/redux';
import messages from './messages';
import * as module from './hooks';
-const { cardData } = selectors;
-
export const state = StrictDict({
isOpen: (val) => React.useState(val), // eslint-disable-line
});
@@ -17,10 +14,7 @@ export const state = StrictDict({
export const useRelatedProgramsBadgeData = ({ courseNumber }) => {
const [isOpen, setIsOpen] = module.state.isOpen(false);
const { formatMessage } = useIntl();
- const { numPrograms } = useCardValues(courseNumber, {
- numPrograms: cardData.numRelatedPrograms,
- });
-
+ const numPrograms = appHooks.useCardRelatedProgramsData(courseNumber).length;
let programsMessage = '';
if (numPrograms) {
programsMessage = formatMessage(
diff --git a/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.test.js b/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.test.js
index a57619f..39987fd 100644
--- a/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.test.js
+++ b/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.test.js
@@ -1,13 +1,16 @@
import { useIntl } from '@edx/frontend-platform/i18n';
import { MockUseState } from 'testUtils';
-import * as appHooks from 'hooks';
-import { selectors } from 'data/redux';
+import { hooks as appHooks } from 'data/redux';
import * as hooks from './hooks';
import messages from './messages';
-const { cardData } = selectors;
+jest.mock('data/redux', () => ({
+ hooks: {
+ useCardRelatedProgramsData: jest.fn(),
+ },
+}));
const courseNumber = 'my-test-course-number';
@@ -16,7 +19,7 @@ const numPrograms = 27;
const { formatMessage } = useIntl();
-describe('EmailSettingsModal hooks', () => {
+describe('RelatedProgramsBadge hooks', () => {
let out;
describe('state values', () => {
state.testGetter(state.keys.isOpen);
@@ -27,8 +30,8 @@ describe('EmailSettingsModal hooks', () => {
describe('useRelatedProgramsBadgeData', () => {
beforeEach(() => {
state.mock();
- appHooks.useCardValues.mockReturnValueOnce({
- numPrograms,
+ appHooks.useCardRelatedProgramsData.mockReturnValueOnce({
+ length: numPrograms,
});
out = hooks.useRelatedProgramsBadgeData({ courseNumber });
});
@@ -52,21 +55,16 @@ describe('EmailSettingsModal hooks', () => {
expect(out.isOpen).toEqual(state.stateVals.isOpen);
});
- test('returns numPrograms from useCardValues call on numRelatedPrograms', () => {
- expect(appHooks.useCardValues).toHaveBeenCalledWith(
- courseNumber,
- { numPrograms: cardData.numRelatedPrograms },
- );
+ test('forwards numPrograms from relatedPrograms.length for the courseNumber', () => {
expect(out.numPrograms).toEqual(numPrograms);
});
-
test('returns empty programsMessage if no programs', () => {
- appHooks.useCardValues.mockReturnValueOnce({ numPrograms: 0 });
+ appHooks.useCardRelatedProgramsData.mockReturnValueOnce({ length: 0 });
out = hooks.useRelatedProgramsBadgeData({ courseNumber });
expect(out.programsMessage).toEqual('');
});
test('returns badgeLabelSingular programsMessage if 1 programs', () => {
- appHooks.useCardValues.mockReturnValueOnce({ numPrograms: 1 });
+ appHooks.useCardRelatedProgramsData.mockReturnValueOnce({ length: 1 });
out = hooks.useRelatedProgramsBadgeData({ courseNumber });
expect(out.programsMessage).toEqual(formatMessage(
messages.badgeLabelSingular,
diff --git a/src/containers/CourseCard/hooks.js b/src/containers/CourseCard/hooks.js
index 94344c5..6287d56 100644
--- a/src/containers/CourseCard/hooks.js
+++ b/src/containers/CourseCard/hooks.js
@@ -1,46 +1,40 @@
-import { selectors } from 'data/redux';
-
-import { useIntl, useCardValues } from 'hooks';
+import { useIntl } from '@edx/frontend-platform/i18n';
+import { hooks as appHooks } from 'data/redux';
import * as module from './hooks';
import messages from './messages';
-const { cardData } = selectors;
-
export const useAccessMessage = ({ courseNumber }) => {
const { formatMessage, formatDate } = useIntl();
+ const {
+ accessExpirationDate,
+ isAudit,
+ isAuditAccessExpired,
+ } = appHooks.useCardEnrollmentData(courseNumber);
+ const { isArchived, endDate } = appHooks.useCardCourseRunData(courseNumber);
- const data = useCardValues(courseNumber, {
- accessExpirationDate: cardData.courseRunAccessExpirationDate,
- isAudit: cardData.isAudit,
- isFinished: cardData.isCourseRunFinished,
- isAuditAccessExpired: cardData.isAuditAccessExpired,
- endDate: cardData.courseRunEndDate,
- });
- if (data.isAudit) {
+ if (isAudit) {
return formatMessage(
- data.isAuditAccessExpired ? messages.accessExpired : messages.accessExpires,
- { accessExpirationDate: formatDate(data.accessExpirationDate) },
+ isAuditAccessExpired ? messages.accessExpired : messages.accessExpires,
+ { accessExpirationDate: formatDate(accessExpirationDate) },
);
}
+
return formatMessage(
- data.isFinished ? messages.courseEnded : messages.courseEnds,
- { endDate: formatDate(data.endDate) },
+ isArchived ? messages.courseEnded : messages.courseEnds,
+ { endDate: formatDate(endDate) },
);
};
export const useCardData = ({ courseNumber }) => {
const { formatMessage } = useIntl();
- const data = useCardValues(courseNumber, {
- title: cardData.courseTitle,
- bannerUrl: cardData.courseBannerUrl,
- providerName: cardData.providerName,
- });
+ const { title, bannerUrl } = appHooks.useCardCourseData(courseNumber);
+ const providerName = appHooks.useCardProviderData(courseNumber).name;
return {
- title: data.title,
- bannerUrl: data.bannerUrl,
- providerName: data.providerName || formatMessage(messages.unknownProviderName),
+ title,
+ bannerUrl,
+ providerName: providerName || formatMessage(messages.unknownProviderName),
accessMessage: module.useAccessMessage({ courseNumber }),
formatMessage,
};
diff --git a/src/containers/CourseCard/hooks.test.js b/src/containers/CourseCard/hooks.test.js
index 86345ad..1233d91 100644
--- a/src/containers/CourseCard/hooks.test.js
+++ b/src/containers/CourseCard/hooks.test.js
@@ -1,12 +1,19 @@
+import { useIntl } from '@edx/frontend-platform/i18n';
+
import { keyStore } from 'utils';
-import { selectors } from 'data/redux';
-import * as appHooks from 'hooks';
-import { testCardValues } from 'testUtils';
+import { hooks as appHooks } from 'data/redux';
import * as hooks from './hooks';
import messages from './messages';
-const { fieldKeys } = selectors.cardData;
+jest.mock('data/redux', () => ({
+ hooks: {
+ useCardCourseData: jest.fn(),
+ useCardCourseRunData: jest.fn(),
+ useCardEnrollmentData: jest.fn(),
+ useCardProviderData: jest.fn(),
+ },
+}));
const courseNumber = 'my-test-course-number';
const useAccessMessage = 'test-access-message';
@@ -15,121 +22,115 @@ const hookKeys = keyStore(hooks);
describe('CourseCard hooks', () => {
let out;
- const { formatMessage, formatDate } = appHooks.useIntl();
+ const { formatMessage, formatDate } = useIntl();
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
describe('useCardData', () => {
+ const courseData = {
+ title: 'fake-title',
+ bannerUrl: 'my-banner-url',
+ };
+ const providerData = {
+ name: 'my-provider-name',
+ };
+ const runHook = ({ course = {}, provider = {} }) => {
+ jest.spyOn(hooks, hookKeys.useAccessMessage)
+ .mockImplementationOnce(mockAccessMessage);
+ appHooks.useCardCourseData.mockReturnValueOnce({
+ ...courseData,
+ ...course,
+ });
+ appHooks.useCardProviderData.mockReturnValueOnce({
+ ...providerData,
+ ...provider,
+ });
+ out = hooks.useCardData({ courseNumber });
+ };
beforeEach(() => {
- jest.spyOn(hooks, hookKeys.useAccessMessage).mockImplementationOnce(mockAccessMessage);
- out = hooks.useCardData({ courseNumber });
- });
-
- testCardValues(courseNumber, {
- title: fieldKeys.courseTitle,
- bannerUrl: fieldKeys.courseBannerUrl,
- providerName: fieldKeys.providerName,
- });
-
- test('providerName returns Unknown message if not provided', () => {
- appHooks.useCardValues.mockReturnValueOnce({
- title: 'title',
- bannerUrl: 'bannerUrl',
- providerName: null,
- });
- jest.spyOn(hooks, hookKeys.useAccessMessage).mockImplementationOnce(mockAccessMessage);
- out = hooks.useCardData({ courseNumber });
- expect(out.providerName).toEqual(formatMessage(messages.unknownProviderName));
- });
- describe('useAccessMessage', () => {
- it('returns the output of useAccessMessage hook, passed courseNumber', () => {
- expect(out.accessMessage).toEqual(mockAccessMessage({ courseNumber }));
- });
+ runHook({});
});
it('forwards formatMessage from useIntl', () => {
expect(out.formatMessage).toEqual(formatMessage);
});
+ it('passes course title and banner URL form course data', () => {
+ expect(appHooks.useCardCourseData).toHaveBeenCalledWith(courseNumber);
+ expect(out.title).toEqual(courseData.title);
+ expect(out.bannerUrl).toEqual(courseData.bannerUrl);
+ });
+ it('forwards useAccessMessage output, called with courseNumber', () => {
+ expect(out.accessMessage).toEqual(mockAccessMessage({ courseNumber }));
+ });
+ it('forwards provider name if it exists, else formatted unknown provider name', () => {
+ expect(appHooks.useCardCourseData).toHaveBeenCalledWith(courseNumber);
+ expect(out.providerName).toEqual(providerData.name);
+ runHook({ provider: { name: '' } });
+ expect(out.providerName).toEqual(formatMessage(messages.unknownProviderName));
+ });
});
-
describe('useAccessMessage', () => {
- const accessExpirationDate = 'test-expiration-date';
- const endDate = 'test-end-date';
-
- beforeEach(() => {
- appHooks.useCardValues.mockClear();
- });
-
- describe('loaded data', () => {
- beforeEach(() => {
- out = hooks.useAccessMessage({ courseNumber });
+ const enrollmentData = {
+ accessExpirationDate: 'test-expiration-date',
+ isAudit: false,
+ isAuditAccessExpired: false,
+ };
+ const courseRunData = {
+ isFinished: false,
+ endDate: 'test-end-date',
+ };
+ const runHook = ({ enrollment = {}, courseRun = {} }) => {
+ appHooks.useCardCourseRunData.mockReturnValueOnce({
+ ...courseRunData,
+ ...courseRun,
});
-
- testCardValues(courseNumber, {
- accessExpirationDate: fieldKeys.courseRunAccessExpirationDate,
- isAudit: fieldKeys.isAudit,
- isFinished: fieldKeys.isCourseRunFinished,
- isAuditAccessExpired: fieldKeys.isAuditAccessExpired,
- endDate: fieldKeys.courseRunEndDate,
+ appHooks.useCardEnrollmentData.mockReturnValueOnce({
+ ...enrollmentData,
+ ...enrollment,
});
+ out = hooks.useAccessMessage({ courseNumber });
+ };
+ it('loads data from enrollment and course run data based on course number', () => {
+ runHook({});
+ expect(appHooks.useCardCourseRunData).toHaveBeenCalledWith(courseNumber);
+ expect(appHooks.useCardEnrollmentData).toHaveBeenCalledWith(courseNumber);
});
-
describe('if audit, and expired', () => {
it('returns accessExpired message with accessExpirationDate from cardData', () => {
- appHooks.useCardValues.mockReturnValueOnce({
- accessExpirationDate,
- endDate,
- isAudit: true,
- isFinished: false,
- isAuditAccessExpired: true,
- });
- expect(hooks.useAccessMessage({ courseNumber })).toEqual(formatMessage(
+ runHook({ enrollment: { isAudit: true, isAuditAccessExpired: true } });
+ expect(out).toEqual(formatMessage(
messages.accessExpired,
- { accessExpirationDate: formatDate(accessExpirationDate) },
+ { accessExpirationDate: formatDate(enrollmentData.accessExpirationDate) },
));
});
});
describe('if audit and not expired', () => {
it('returns accessExpires message with accessExpirationDate from cardData', () => {
- appHooks.useCardValues.mockReturnValueOnce({
- accessExpirationDate,
- endDate,
- isAudit: true,
- isFinished: false,
- isAuditAccessExpired: false,
- });
- expect(hooks.useAccessMessage({ courseNumber })).toEqual(formatMessage(
+ runHook({ enrollment: { isAudit: true } });
+ expect(out).toEqual(formatMessage(
messages.accessExpires,
- { accessExpirationDate: formatDate(accessExpirationDate) },
+ { accessExpirationDate: formatDate(enrollmentData.accessExpirationDate) },
));
});
});
describe('if verified and not ended', () => {
it('returns course ends message with course end date', () => {
- appHooks.useCardValues.mockReturnValueOnce({
- accessExpirationDate,
- endDate,
- isAudit: false,
- isFinished: false,
- isAuditAccessExpired: false,
- });
- expect(hooks.useAccessMessage({ courseNumber })).toEqual(formatMessage(
+ runHook({});
+ expect(out).toEqual(formatMessage(
messages.courseEnds,
- { endDate: formatDate(endDate) },
+ { endDate: formatDate(courseRunData.endDate) },
));
});
});
describe('if verified and ended', () => {
it('returns course ended message with course end date', () => {
- appHooks.useCardValues.mockReturnValueOnce({
- accessExpirationDate,
- endDate,
- isAudit: false,
- isFinished: true,
- isAuditAccessExpired: false,
- });
- expect(hooks.useAccessMessage({ courseNumber })).toEqual(formatMessage(
+ runHook({ courseRun: { isArchived: true } });
+ expect(out).toEqual(formatMessage(
messages.courseEnded,
- { endDate: formatDate(endDate) },
+ { endDate: formatDate(courseRunData.endDate) },
));
});
});
diff --git a/src/containers/EmailSettingsModal/__snapshots__/index.test.jsx.snap b/src/containers/EmailSettingsModal/__snapshots__/index.test.jsx.snap
index e9b5224..d3ee4d0 100644
--- a/src/containers/EmailSettingsModal/__snapshots__/index.test.jsx.snap
+++ b/src/containers/EmailSettingsModal/__snapshots__/index.test.jsx.snap
@@ -16,38 +16,28 @@ exports[`EmailSettingsModal render snapshot: emails disabled, show: false 1`] =
}
>
-
+ Receive course emails?
-
+ Course emails are on
-
+ Course emailsi include important information about your course.
@@ -70,38 +60,28 @@ exports[`EmailSettingsModal render snapshot: emails disabled, show: true 1`] = `
}
>