diff --git a/src/proctored-exam-settings/ProctoredExamSettings.jsx b/src/proctored-exam-settings/ProctoredExamSettings.jsx index 02d14c77d..4d21e7bfb 100644 --- a/src/proctored-exam-settings/ProctoredExamSettings.jsx +++ b/src/proctored-exam-settings/ProctoredExamSettings.jsx @@ -18,8 +18,6 @@ function ExamSettings(props) { const [allowOptingOut, setAllowOptingOut] = useState(false); const [proctoringProvider, setProctoringProvider] = useState(''); const [availableProctoringProviders, setAvailableProctoringProviders] = useState([]); - // TODO: we'll probably want to hide this field when proctortrack is not selected; currently, - // this causes some errors in the browser console const [proctortrackEscalationEmail, setProctortrackEscalationEmail] = useState(''); const [createZendeskTickets, setCreateZendeskTickets] = useState(false); const [courseStartDate, setCourseStartDate] = useState(''); @@ -78,13 +76,17 @@ function ExamSettings(props) { proctored_exam_settings: { enable_proctored_exams: enableProctoredExams, proctoring_provider: proctoringProvider, - proctoring_escalation_email: proctortrackEscalationEmail, }, }; if (isEdxStaff) { dataToPostBack.proctored_exam_settings.allow_proctoring_opt_out = allowOptingOut; dataToPostBack.proctored_exam_settings.create_zendesk_tickets = createZendeskTickets; } + + if (proctoringProvider === 'proctortrack') { + dataToPostBack.proctored_exam_settings.proctoring_escalation_email = proctortrackEscalationEmail === '' ? null : proctortrackEscalationEmail; + } + setSubmissionInProgress(true); StudioApiService.saveProctoredExamSettingsData(props.courseId, dataToPostBack).then(() => { setSaveSuccess(true); @@ -409,7 +411,13 @@ function ExamSettings(props) { const isProctortrack = proctoredExamSettings.proctoring_provider === 'proctortrack'; setShowProctortrackEscalationEmail(isProctortrack); setAvailableProctoringProviders(response.data.available_proctoring_providers); - setProctortrackEscalationEmail(proctoredExamSettings.proctoring_escalation_email); + + // The backend API may return null for the proctoringEscalationEmail value, which is the default. + // In order to keep our email input component controlled, we use the empty string as the default + // and perform this conversion during GETs and POSTs. + const proctoringEscalationEmail = proctoredExamSettings.proctoring_escalation_email; + setProctortrackEscalationEmail(proctoringEscalationEmail === null ? '' : proctoringEscalationEmail); + setCreateZendeskTickets(proctoredExamSettings.create_zendesk_tickets); }, ).catch( diff --git a/src/proctored-exam-settings/ProctoredExamSettings.test.jsx b/src/proctored-exam-settings/ProctoredExamSettings.test.jsx index 7f4aa5b5b..f59d0f6f3 100644 --- a/src/proctored-exam-settings/ProctoredExamSettings.test.jsx +++ b/src/proctored-exam-settings/ProctoredExamSettings.test.jsx @@ -464,7 +464,7 @@ describe('ProctoredExamSettings save settings tests', () => { expect(screen.queryByTestId('saveInProgress')).toBeFalsy(); }); - it('Makes API call successfully', async () => { + it('Makes API call successfully with proctoring_escalation_email if proctortrack', async () => { const mockedFunctions = mockAPI(mockGetData, { data: 'success' }); await act(async () => render()); // Make a change to the provider to proctortrack and set the email @@ -501,6 +501,35 @@ describe('ProctoredExamSettings save settings tests', () => { ); }); + it('Makes API call successfully without proctoring_escalation_email if not proctortrack', async () => { + const mockedFunctions = mockAPI(mockGetData, { data: 'success' }); + await act(async () => render()); + + // make sure we have not selected proctortrack as the proctoring provider + expect(screen.getByDisplayValue('mockproc')).toBeDefined(); + + const submitButton = screen.getByTestId('submissionButton'); + await act(async () => { + fireEvent.click(submitButton); + }); + expect(mockedFunctions.mockClientPost).toHaveBeenCalled(); + expect(mockedFunctions.mockClientPost).toHaveBeenCalledWith( + StudioApiService.getProctoredExamSettingsUrl(defaultProps.courseId), + { + proctored_exam_settings: { + enable_proctored_exams: true, + allow_proctoring_opt_out: false, + proctoring_provider: 'mockproc', + create_zendesk_tickets: true, + }, + }, + ); + const errorAlert = screen.getByTestId('saveSuccess'); + expect(errorAlert.textContent).toEqual( + expect.stringContaining('Proctored exam settings saved successfully.'), + ); + }); + it('Makes API call generated error', async () => { const mockedFunctions = mockAPI(mockGetData, false); await act(async () => render());