Skip to content

Commit f1646bb

Browse files
fix: handle edge cases and test cases
1 parent dab5c89 commit f1646bb

13 files changed

+1085
-267
lines changed

src/optimizer-page/CourseOptimizerPage.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,11 +174,11 @@ describe('CourseOptimizerPage', () => {
174174
expect(getByText(messages.headingTitle.defaultMessage)).toBeInTheDocument();
175175
fireEvent.click(getByText(messages.buttonTitle.defaultMessage));
176176
await waitFor(() => {
177-
expect(getByText(scanResultsMessages.noDataCard.defaultMessage)).toBeInTheDocument();
177+
expect(getByText(scanResultsMessages.noResultsFound.defaultMessage)).toBeInTheDocument();
178178
});
179179
});
180180

181-
it('should show error message if request does not go through', async () => {
181+
it('should show an error state in the scan stepper if request does not go through', async () => {
182182
axiosMock
183183
.onPost(postLinkCheckCourseApiUrl(courseId))
184184
.reply(500);
@@ -387,7 +387,7 @@ describe('CourseOptimizerPage', () => {
387387
fireEvent.click(getByText(messages.buttonTitle.defaultMessage));
388388

389389
await waitFor(() => {
390-
expect(getByText(scanResultsMessages.noDataCard.defaultMessage)).toBeInTheDocument();
390+
expect(getByText(scanResultsMessages.noResultsFound.defaultMessage)).toBeInTheDocument();
391391
});
392392
});
393393

src/optimizer-page/CourseOptimizerPage.tsx

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ import { STATEFUL_BUTTON_STATES } from '../constants';
1717
import messages from './messages';
1818
import {
1919
getCurrentStage, getError, getLinkCheckInProgress, getLoadingStatus, getSavingStatus, getLinkCheckResult,
20-
getLastScannedAt,
20+
getLastScannedAt, getRerunLinkUpdateInProgress, getRerunLinkUpdateResult,
2121
} from './data/selectors';
22-
import { startLinkCheck, fetchLinkCheckStatus } from './data/thunks';
22+
import { startLinkCheck, fetchLinkCheckStatus, fetchRerunLinkUpdateStatus } from './data/thunks';
2323
import { useModel } from '../generic/model-store';
2424
import ScanResults from './scan-results';
2525

@@ -30,6 +30,32 @@ const pollLinkCheckStatus = (dispatch: any, courseId: string, delay: number): nu
3030
return interval as unknown as number;
3131
};
3232

33+
const pollRerunLinkUpdateStatus = (dispatch: any, courseId: string, delay: number): number => {
34+
const interval = setInterval(() => {
35+
dispatch(fetchRerunLinkUpdateStatus(courseId));
36+
}, delay);
37+
return interval as unknown as number;
38+
};
39+
40+
export function pollRerunLinkUpdateDuringUpdate(
41+
rerunLinkUpdateInProgress: boolean | null,
42+
rerunLinkUpdateResult: any,
43+
interval: MutableRefObject<number | undefined>,
44+
dispatch: any,
45+
courseId: string,
46+
) {
47+
const shouldPoll = rerunLinkUpdateInProgress === true
48+
|| (rerunLinkUpdateResult && rerunLinkUpdateResult.status && rerunLinkUpdateResult.status !== 'Succeeded');
49+
50+
if (shouldPoll) {
51+
clearInterval(interval.current as number | undefined);
52+
interval.current = pollRerunLinkUpdateStatus(dispatch, courseId, 2000);
53+
} else if (interval.current) {
54+
clearInterval(interval.current);
55+
interval.current = undefined;
56+
}
57+
}
58+
3359
export function pollLinkCheckDuringScan(
3460
linkCheckInProgress: boolean | null,
3561
interval: MutableRefObject<number | undefined>,
@@ -48,6 +74,8 @@ export function pollLinkCheckDuringScan(
4874
const CourseOptimizerPage: FC<{ courseId: string }> = ({ courseId }) => {
4975
const dispatch = useDispatch();
5076
const linkCheckInProgress = useSelector(getLinkCheckInProgress);
77+
const rerunLinkUpdateInProgress = useSelector(getRerunLinkUpdateInProgress);
78+
const rerunLinkUpdateResult = useSelector(getRerunLinkUpdateResult);
5179
const loadingStatus = useSelector(getLoadingStatus);
5280
const savingStatus = useSelector(getSavingStatus);
5381
const currentStage = useSelector(getCurrentStage);
@@ -56,6 +84,7 @@ const CourseOptimizerPage: FC<{ courseId: string }> = ({ courseId }) => {
5684
const { msg: errorMessage } = useSelector(getError);
5785
const isLoadingDenied = (RequestFailureStatuses as string[]).includes(loadingStatus);
5886
const interval = useRef<number | undefined>(undefined);
87+
const rerunUpdateInterval = useRef<number | undefined>(undefined);
5988
const courseDetails = useModel('courseDetails', courseId);
6089
const linkCheckPresent = currentStage != null ? currentStage >= 0 : !!currentStage;
6190
const [showStepper, setShowStepper] = useState(false);
@@ -101,6 +130,20 @@ const CourseOptimizerPage: FC<{ courseId: string }> = ({ courseId }) => {
101130
};
102131
}, [linkCheckInProgress, linkCheckResult]);
103132

133+
useEffect(() => {
134+
pollRerunLinkUpdateDuringUpdate(
135+
rerunLinkUpdateInProgress,
136+
rerunLinkUpdateResult,
137+
rerunUpdateInterval,
138+
dispatch,
139+
courseId,
140+
);
141+
142+
return () => {
143+
if (rerunUpdateInterval.current) { clearInterval(rerunUpdateInterval.current); }
144+
};
145+
}, [rerunLinkUpdateInProgress, rerunLinkUpdateResult]);
146+
104147
const stepperVisibleCondition = linkCheckPresent && ((!linkCheckResult || linkCheckInProgress) && currentStage !== 2);
105148
useEffect(() => {
106149
let timeout: NodeJS.Timeout;
@@ -119,6 +162,7 @@ const CourseOptimizerPage: FC<{ courseId: string }> = ({ courseId }) => {
119162

120163
if (isLoadingDenied || isSavingDenied) {
121164
if (interval.current) { clearInterval(interval.current); }
165+
if (rerunUpdateInterval.current) { clearInterval(rerunUpdateInterval.current); }
122166

123167
return (
124168
// <Container size="xl" className="course-unit px-4 mt-4">
@@ -217,6 +261,8 @@ const CourseOptimizerPage: FC<{ courseId: string }> = ({ courseId }) => {
217261
data={linkCheckResult}
218262
courseId={courseId}
219263
onErrorStateChange={setScanResultsError}
264+
rerunLinkUpdateInProgress={rerunLinkUpdateInProgress}
265+
rerunLinkUpdateResult={rerunLinkUpdateResult}
220266
/>
221267
)}
222268
</article>

src/optimizer-page/data/api.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ export interface RerunLinkUpdateRequestBody {
2020

2121
export interface RerunLinkUpdateStatusApiResponseBody {
2222
updateStatus: string;
23+
status: string;
24+
results?: Array<{
25+
id: string;
26+
success: boolean;
27+
new_url: string;
28+
original_url: string;
29+
type: string;
30+
}>;
2331
}
2432

2533
const getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;

src/optimizer-page/data/constants.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,30 @@ export const LINK_CHECK_FAILURE_STATUSES = [
3737
LINK_CHECK_STATUSES.FAILED,
3838
LINK_CHECK_STATUSES.CANCELED,
3939
];
40+
41+
export const RERUN_LINK_UPDATE_STATUSES = {
42+
UNINITIATED: 'Uninitiated',
43+
PENDING: 'Pending',
44+
IN_PROGRESS: 'In Progress',
45+
SUCCEEDED: 'Succeeded',
46+
FAILED: 'Failed',
47+
CANCELED: 'Canceled',
48+
RETRYING: 'Retrying',
49+
SCANNING: 'Scanning',
50+
UPDATING: 'Updating',
51+
};
52+
53+
export const RERUN_LINK_UPDATE_IN_PROGRESS_STATUSES = [
54+
RERUN_LINK_UPDATE_STATUSES.PENDING,
55+
RERUN_LINK_UPDATE_STATUSES.IN_PROGRESS,
56+
RERUN_LINK_UPDATE_STATUSES.RETRYING,
57+
RERUN_LINK_UPDATE_STATUSES.SCANNING,
58+
RERUN_LINK_UPDATE_STATUSES.UPDATING,
59+
];
60+
61+
export const RERUN_LINK_UPDATE_FAILURE_STATUSES = [
62+
RERUN_LINK_UPDATE_STATUSES.FAILED,
63+
RERUN_LINK_UPDATE_STATUSES.CANCELED,
64+
];
65+
4066
export const SUCCESS_DATE_FORMAT = 'MM/DD/yyyy';

src/optimizer-page/data/selectors.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,5 @@ export const getLoadingStatus = (state: RootState) => state.courseOptimizer.load
1010
export const getSavingStatus = (state: RootState) => state.courseOptimizer.savingStatus;
1111
export const getLinkCheckResult = (state: RootState) => state.courseOptimizer.linkCheckResult;
1212
export const getLastScannedAt = (state: RootState) => state.courseOptimizer.lastScannedAt;
13+
export const getRerunLinkUpdateInProgress = (state: RootState) => state.courseOptimizer.rerunLinkUpdateInProgress;
14+
export const getRerunLinkUpdateResult = (state: RootState) => state.courseOptimizer.rerunLinkUpdateResult;

src/optimizer-page/data/slice.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ describe('courseOptimizer slice', () => {
3434
successDate: null,
3535
isErrorModalOpen: false,
3636
loadingStatus: '',
37+
rerunLinkUpdateInProgress: null,
38+
rerunLinkUpdateResult: null,
3739
savingStatus: '',
3840
});
3941
});
@@ -95,6 +97,8 @@ describe('courseOptimizer slice', () => {
9597
successDate: null,
9698
isErrorModalOpen: false,
9799
loadingStatus: '',
100+
rerunLinkUpdateInProgress: null,
101+
rerunLinkUpdateResult: null,
98102
savingStatus: '',
99103
});
100104
});

src/optimizer-page/data/slice.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ export interface CourseOptimizerState {
1313
isErrorModalOpen: boolean;
1414
loadingStatus: string;
1515
savingStatus: string;
16+
rerunLinkUpdateInProgress: boolean | null;
17+
rerunLinkUpdateResult: any | null;
1618
}
1719

1820
export type RootState = {
@@ -32,6 +34,8 @@ const initialState: CourseOptimizerState = {
3234
isErrorModalOpen: false,
3335
loadingStatus: '',
3436
savingStatus: '',
37+
rerunLinkUpdateInProgress: null,
38+
rerunLinkUpdateResult: null,
3539
};
3640

3741
const slice = createSlice({
@@ -69,6 +73,12 @@ const slice = createSlice({
6973
updateSavingStatus: (state, { payload }) => {
7074
state.savingStatus = payload.status;
7175
},
76+
updateRerunLinkUpdateInProgress: (state, { payload }) => {
77+
state.rerunLinkUpdateInProgress = payload;
78+
},
79+
updateRerunLinkUpdateResult: (state, { payload }) => {
80+
state.rerunLinkUpdateResult = payload;
81+
},
7282
},
7383
});
7484

@@ -84,6 +94,8 @@ export const {
8494
reset,
8595
updateLoadingStatus,
8696
updateSavingStatus,
97+
updateRerunLinkUpdateInProgress,
98+
updateRerunLinkUpdateResult,
8799
} = slice.actions;
88100

89101
export const {

0 commit comments

Comments
 (0)