Skip to content

Commit

Permalink
feat: reduce unnecessary api calls
Browse files Browse the repository at this point in the history
  • Loading branch information
zacharis278 committed Jan 5, 2024
1 parent 8457727 commit be40480
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 2 deletions.
5 changes: 4 additions & 1 deletion src/exam/ExamWrapper.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ const ExamWrapper = ({ children, ...props }) => {
const isGated = sequence && sequence.gatedContent !== undefined && sequence.gatedContent.gated;

useEffect(() => {
loadInitialData();
// fetch exam data on exam sequences or if no exam data has been fetched yet
if (sequence.isTimeLimited || state.isLoading) {
loadInitialData();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

Expand Down
41 changes: 40 additions & 1 deletion src/exam/ExamWrapper.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Factory } from 'rosie';
import React from 'react';
import SequenceExamWrapper from './ExamWrapper';
import { store, getExamAttemptsData, startTimedExam } from '../data';
import { render } from '../setupTest';
import { render, waitFor } from '../setupTest';
import ExamStateProvider from '../core/ExamStateProvider';
import { ExamStatus, ExamType } from '../constants';

Expand Down Expand Up @@ -114,6 +114,45 @@ describe('SequenceExamWrapper', () => {
expect(queryByTestId('exam-api-error-component')).not.toBeInTheDocument();
});

it('does not fetch exam data if already loaded and the sequence is not an exam', () => {
store.getState = () => ({
examState: Factory.build('examState', {
isLoading: false,
}),
});

render(
<ExamStateProvider>
<SequenceExamWrapper sequence={{ ...sequence, isTimeLimited: false }} courseId={courseId}>
<div>children</div>
</SequenceExamWrapper>
</ExamStateProvider>,
{ store },
);
expect(getExamAttemptsData).not.toHaveBeenCalled();
});

it('does fetch exam data for non exam sequences if not already loaded', async () => {
// this would only occur if the user deeplinks directly to a non-exam sequence
store.getState = () => ({
examState: Factory.build('examState', {
isLoading: true,
getExamAttemptsData

Check failure on line 140 in src/exam/ExamWrapper.test.jsx

View workflow job for this annotation

GitHub Actions / tests

Missing trailing comma

Check failure on line 140 in src/exam/ExamWrapper.test.jsx

View workflow job for this annotation

GitHub Actions / tests

Missing trailing comma
}),
});

render(
<ExamStateProvider>
<SequenceExamWrapper sequence={{ ...sequence, isTimeLimited: false }} courseId={courseId}>
<div>children</div>
</SequenceExamWrapper>
</ExamStateProvider>,
{ store },
);

await waitFor(() => expect(getExamAttemptsData).toHaveBeenCalled());
});

it('does not take any actions if sequence item is not exam', () => {
const { getByTestId } = render(
<ExamStateProvider>
Expand Down

0 comments on commit be40480

Please sign in to comment.