diff --git a/src/course-home/data/api.js b/src/course-home/data/api.js index 031bb273..d3efe2b9 100644 --- a/src/course-home/data/api.js +++ b/src/course-home/data/api.js @@ -131,7 +131,7 @@ export async function getProgressTabData(courseId) { } export async function getProctoringInfoData(courseId) { - const url = `${getConfig().LMS_BASE_URL}/api/edx_proctoring/v1/user_onboarding/status?course_id=${courseId}`; + const url = `${getConfig().LMS_BASE_URL}/api/edx_proctoring/v1/user_onboarding/status?course_id=${encodeURIComponent(courseId)}`; try { const { data } = await getAuthenticatedHttpClient().get(url); return data; diff --git a/src/course-home/outline-tab/OutlineTab.test.jsx b/src/course-home/outline-tab/OutlineTab.test.jsx index bbfda389..b10539b0 100644 --- a/src/course-home/outline-tab/OutlineTab.test.jsx +++ b/src/course-home/outline-tab/OutlineTab.test.jsx @@ -25,7 +25,7 @@ describe('Outline Tab', () => { const enrollmentUrl = `${getConfig().LMS_BASE_URL}/api/enrollment/v1/enrollment`; const goalUrl = `${getConfig().LMS_BASE_URL}/api/course_home/v1/save_course_goal`; const outlineUrl = `${getConfig().LMS_BASE_URL}/api/course_home/v1/outline/${courseId}`; - const proctoringInfoUrl = `${getConfig().LMS_BASE_URL}/api/edx_proctoring/v1/user_onboarding/status?course_id=${courseId}`; + const proctoringInfoUrl = `${getConfig().LMS_BASE_URL}/api/edx_proctoring/v1/user_onboarding/status?course_id=${encodeURIComponent(courseId)}`; const store = initializeStore(); const defaultMetadata = Factory.build('courseHomeMetadata', { courseId }); @@ -499,6 +499,14 @@ describe('Outline Tab', () => { expect(screen.queryByRole('link', { name: 'Review instructions and system requirements' })).toBeInTheDocument(); }); + it('appears for no status', async () => { + axiosMock.onGet(proctoringInfoUrl).reply(200, { onboarding_status: '', onboarding_link: 'test' }); + await fetchAndRender(); + await screen.findByText('This course contains proctored exams'); + expect(screen.queryByRole('link', { name: 'Complete Onboarding' })).toBeInTheDocument(); + expect(screen.queryByRole('link', { name: 'Review instructions and system requirements' })).toBeInTheDocument(); + }); + it('does not appear for 404', async () => { axiosMock.onGet(proctoringInfoUrl).reply(404); expect(screen.queryByRole('link', { name: 'Review instructions and system requirements' })).not.toBeInTheDocument(); diff --git a/src/course-home/outline-tab/widgets/ProctoringInfoPanel.jsx b/src/course-home/outline-tab/widgets/ProctoringInfoPanel.jsx index 915bf100..16d3bb83 100644 --- a/src/course-home/outline-tab/widgets/ProctoringInfoPanel.jsx +++ b/src/course-home/outline-tab/widgets/ProctoringInfoPanel.jsx @@ -1,6 +1,7 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; +import { getConfig } from '@edx/frontend-platform'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { Button } from '@edx/paragon'; @@ -56,7 +57,7 @@ function ProctoringInfoPanel({ courseId, intl }) { return ( <> - { status && ( + { link && (

{intl.formatMessage(messages.proctoringInfoPanel)}

@@ -77,7 +78,7 @@ function ProctoringInfoPanel({ courseId, intl }) { )} {showExamLink(status) && ( - )}