From b0c71e5291420e947aa19b80274f57366281a85b Mon Sep 17 00:00:00 2001 From: Zachary Hancock Date: Tue, 8 Aug 2023 17:34:05 -0400 Subject: [PATCH] fix: error when navigating exam units (#1157) * fix: incorrect usage of useEffect callback caused intermittent react errors --- .../course/sequence/Unit/hooks/useExamAccess.js | 3 +-- .../sequence/Unit/hooks/useExamAccess.test.js | 13 ++++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/courseware/course/sequence/Unit/hooks/useExamAccess.js b/src/courseware/course/sequence/Unit/hooks/useExamAccess.js index 3926753b..a18046ea 100644 --- a/src/courseware/course/sequence/Unit/hooks/useExamAccess.js +++ b/src/courseware/course/sequence/Unit/hooks/useExamAccess.js @@ -16,7 +16,7 @@ const useExamAccess = ({ const [blockAccess, setBlockAccess] = useKeyedState(stateKeys.blockAccess, isExam()); React.useEffect(() => { if (isExam()) { - return fetchExamAccess() + fetchExamAccess() .finally(() => { const examAccess = getExamAccess(); setAccessToken(examAccess); @@ -26,7 +26,6 @@ const useExamAccess = ({ logError(error); }); } - return undefined; }, [id]); return { diff --git a/src/courseware/course/sequence/Unit/hooks/useExamAccess.test.js b/src/courseware/course/sequence/Unit/hooks/useExamAccess.test.js index 167290db..c6608944 100644 --- a/src/courseware/course/sequence/Unit/hooks/useExamAccess.test.js +++ b/src/courseware/course/sequence/Unit/hooks/useExamAccess.test.js @@ -4,6 +4,7 @@ import { mockUseKeyedState } from '@edx/react-unit-test-utils'; import { getExamAccess, fetchExamAccess, isExam } from '@edx/frontend-lib-special-exams'; import { isEqual } from 'lodash'; +import { waitFor } from '../../../../../setupTest'; import useExamAccess, { stateKeys } from './useExamAccess'; const getEffect = (prereqs) => { @@ -55,18 +56,19 @@ describe('useExamAccess hook', () => { state.expectInitializedWith(stateKeys.blockAccess, true); }); describe('effects - on id change', () => { - let cb; + let useEffectCb; beforeEach(() => { useExamAccess({ id }); - cb = getEffect([id], React); + useEffectCb = getEffect([id], React); }); it('does not call fetchExamAccess if not an exam', () => { - cb(); + useEffectCb(); expect(fetchExamAccess).not.toHaveBeenCalled(); }); it('fetches and sets exam access if isExam', async () => { isExam.mockReturnValueOnce(true); - await cb(); + useEffectCb(); + await waitFor(() => expect(fetchExamAccess).toHaveBeenCalled()); state.expectSetStateCalledWith(stateKeys.accessToken, testAccessToken); state.expectSetStateCalledWith(stateKeys.blockAccess, false); }); @@ -74,7 +76,8 @@ describe('useExamAccess hook', () => { it('logs error if fetchExamAccess fails', async () => { isExam.mockReturnValueOnce(true); fetchExamAccess.mockReturnValueOnce(Promise.reject(testError)); - await cb(); + useEffectCb(); + await waitFor(() => expect(fetchExamAccess).toHaveBeenCalled()); expect(logError).toHaveBeenCalledWith(testError); }); });