From 9d9d7a7167bee177e5e08177ed3cc82287775ad7 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Wed, 28 Jan 2026 16:48:13 -0800 Subject: [PATCH] fix: resolve incorrect or missing 'await' usages (#2592) * chore: fix incorrect or missing 'await' usages * test: fix broken test * chore: ignore lines causing patch coverage to fail --- plugins/course-apps/live/Settings.jsx | 1 + plugins/course-apps/ora_settings/Settings.jsx | 3 ++- .../course-apps/ora_settings/Settings.test.jsx | 2 +- .../settings-modal/SettingsModal.jsx | 2 ++ .../hooks/useCertificatesList.jsx | 1 + src/content-tags-drawer/data/apiHooks.ts | 2 ++ src/course-checklist/CourseChecklist.test.jsx | 16 ++++++++-------- .../LegacyLibContentBlockAlert.tsx | 2 ++ src/course-outline/CourseOutline.test.tsx | 12 ++++++------ src/course-outline/OutlineAddChildButtons.tsx | 1 + .../card-header/CardHeader.test.tsx | 2 +- src/course-outline/hooks.jsx | 1 + .../section-card/SectionCard.test.tsx | 8 ++++---- src/course-outline/status-bar/hooks.ts | 1 + .../subsection-card/SubsectionCard.test.tsx | 8 ++++---- src/course-outline/unit-card/UnitCard.test.tsx | 8 ++++---- src/course-outline/unit-card/UnitCard.tsx | 1 + src/course-rerun/CourseRerun.test.jsx | 13 ++++++++++--- src/course-unit/CourseUnit.test.jsx | 12 ++++++++++-- .../unit-sidebar/unit-info/UnitInfoSidebar.tsx | 1 + src/course-updates/update-form/UpdateForm.jsx | 6 ++++-- src/files-and-videos/files-page/data/api.js | 2 +- .../table-custom-columns/MoreInfoColumn.jsx | 3 +++ src/files-and-videos/videos-page/data/thunks.js | 6 ++++-- .../CreateOrRerunCourseForm.jsx | 1 + src/generic/data/api.test.js | 2 +- src/generic/inplace-text-editor/index.tsx | 1 + .../LegacyLibMigrationPage.tsx | 1 + .../LibraryAuthoringPage.test.tsx | 4 ++-- .../add-content/AddContent.test.tsx | 2 +- .../component-info/ComponentAdvancedAssets.tsx | 1 + .../component-info/ComponentInfo.test.tsx | 10 +++++----- .../component-info/ComponentInfo.tsx | 3 +++ .../component-info/ComponentUsageTab.test.tsx | 6 +++--- .../components/AddComponentWidget.tsx | 2 ++ .../components/ComponentMenu.tsx | 1 + .../containers/ContainerCard.tsx | 1 + .../containers/ContainerInfo.tsx | 1 + .../hierarchy/ItemHierarchyPublisher.tsx | 4 ++-- .../import-course/ImportDetailsPage.test.tsx | 2 +- .../import-course/ImportDetailsPage.tsx | 1 + src/optimizer-page/scan-results/ScanResults.tsx | 5 +++++ .../app-settings-modal/AppSettingsModal.jsx | 6 ++++-- .../app-config-form/AppConfigForm.jsx | 2 ++ .../apps/shared/DiscussionRestriction.jsx | 2 ++ .../apps/shared/DivisionByGroupFields.jsx | 4 ++++ .../apps/shared/InContextDiscussionFields.jsx | 1 + .../RestrictionSchedules.jsx | 3 ++- .../discussion-topics/DiscussionTopics.jsx | 4 +++- src/search-manager/data/api.mock.ts | 2 +- src/search-manager/data/apiHooks.ts | 7 ++++++- src/taxonomy/TaxonomyListPage.test.tsx | 2 +- src/taxonomy/taxonomy-menu/TaxonomyMenu.jsx | 1 + .../textbook-card/TextbooksCard.test.jsx | 2 +- 54 files changed, 136 insertions(+), 62 deletions(-) diff --git a/plugins/course-apps/live/Settings.jsx b/plugins/course-apps/live/Settings.jsx index 1e1017086..4a79f5f58 100644 --- a/plugins/course-apps/live/Settings.jsx +++ b/plugins/course-apps/live/Settings.jsx @@ -72,6 +72,7 @@ const LiveSettings = ({ }; const handleSettingsSave = async (values) => { + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. await dispatch(saveLiveConfiguration(courseId, values, navigate)); }; diff --git a/plugins/course-apps/ora_settings/Settings.jsx b/plugins/course-apps/ora_settings/Settings.jsx index f16d10f48..386f3d742 100644 --- a/plugins/course-apps/ora_settings/Settings.jsx +++ b/plugins/course-apps/ora_settings/Settings.jsx @@ -48,8 +48,9 @@ const ORASettings = ({ onClose }) => { event.preventDefault(); success = success && await handleSettingsSave(formValues); - await setSaveError(!success); + setSaveError(!success); if ((initialFormValues.enableFlexiblePeerGrade !== formValues.enableFlexiblePeerGrade) && success) { + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. success = await dispatch(updateModel({ modelType: 'courseApps', model: { diff --git a/plugins/course-apps/ora_settings/Settings.test.jsx b/plugins/course-apps/ora_settings/Settings.test.jsx index 0dd79a13f..787042f52 100644 --- a/plugins/course-apps/ora_settings/Settings.test.jsx +++ b/plugins/course-apps/ora_settings/Settings.test.jsx @@ -128,7 +128,7 @@ describe('ORASettings', () => { await mockStore({ apiStatus: 200, enabled: true }); renderComponent(); - const checkbox = await screen.getByRole('checkbox', { name: /Flex Peer Grading/ }); + const checkbox = screen.getByRole('checkbox', { name: /Flex Peer Grading/ }); expect(checkbox).toBeChecked(); await waitFor(() => { diff --git a/plugins/course-apps/xpert_unit_summary/settings-modal/SettingsModal.jsx b/plugins/course-apps/xpert_unit_summary/settings-modal/SettingsModal.jsx index 6aa5bdfbc..f4c016b04 100644 --- a/plugins/course-apps/xpert_unit_summary/settings-modal/SettingsModal.jsx +++ b/plugins/course-apps/xpert_unit_summary/settings-modal/SettingsModal.jsx @@ -239,8 +239,10 @@ const SettingsModal = ({ const values = { ...rest, enabled: enabled ? checked === 'true' : undefined }; if (enabled) { + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. success = await dispatch(updateXpertSettings(courseId, values)); } else { + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. success = await dispatch(removeXpertSettings(courseId)); } diff --git a/src/certificates/certificates-list/hooks/useCertificatesList.jsx b/src/certificates/certificates-list/hooks/useCertificatesList.jsx index 952fa8534..60faf4f13 100644 --- a/src/certificates/certificates-list/hooks/useCertificatesList.jsx +++ b/src/certificates/certificates-list/hooks/useCertificatesList.jsx @@ -25,6 +25,7 @@ const useCertificatesList = (courseId) => { })); const handleSubmit = async (values) => { + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. await dispatch(updateCourseCertificate(courseId, values)); setEditModes({}); dispatch(setMode(MODE_STATES.view)); diff --git a/src/content-tags-drawer/data/apiHooks.ts b/src/content-tags-drawer/data/apiHooks.ts index e00393da1..832154d4c 100644 --- a/src/content-tags-drawer/data/apiHooks.ts +++ b/src/content-tags-drawer/data/apiHooks.ts @@ -172,6 +172,7 @@ export const useContentTaxonomyTagsUpdater = (contentId: string) => { // feature to support the legacy Django template courseware page. // Sends content tags. + // eslint-disable-next-line @typescript-eslint/no-floating-promises getContentTaxonomyTagsData(contentId).then((data) => { const contentData = { contentId, ...data }; @@ -187,6 +188,7 @@ export const useContentTaxonomyTagsUpdater = (contentId: string) => { }); // Sends tags count. + // eslint-disable-next-line @typescript-eslint/no-floating-promises getContentTaxonomyTagsCount(contentId).then((count) => { const contentData = { contentId, count }; diff --git a/src/course-checklist/CourseChecklist.test.jsx b/src/course-checklist/CourseChecklist.test.jsx index e5bf6957b..5c03fe930 100644 --- a/src/course-checklist/CourseChecklist.test.jsx +++ b/src/course-checklist/CourseChecklist.test.jsx @@ -46,9 +46,9 @@ describe('CourseChecklistPage', () => { }); describe('renders', () => { describe('if enable_quality prop is true', () => { - it('two checklist components ', () => { + it('two checklist components ', async () => { renderComponent(); - mockStore(200); + await mockStore(200); expect(screen.getByText(messages.launchChecklistLabel.defaultMessage)).toBeVisible(); @@ -67,7 +67,7 @@ describe('CourseChecklistPage', () => { it('correct content when the launch checklist has loaded', async () => { renderComponent(); - mockStore(404); + await mockStore(404); await waitFor(() => { const { launchChecklistStatus } = store.getState().courseChecklist.loadingStatus; @@ -79,7 +79,7 @@ describe('CourseChecklistPage', () => { it('correct content when the best practices checklist is loading', async () => { renderComponent(); - mockStore(404); + await mockStore(404); await waitFor(() => { const { bestPracticeChecklistStatus } = store.getState().courseChecklist.loadingStatus; @@ -100,9 +100,9 @@ describe('CourseChecklistPage', () => { }); }); - it('one checklist components ', () => { + it('one checklist components ', async () => { renderComponent(); - mockStore(200); + await mockStore(200); expect(screen.getByText(messages.launchChecklistLabel.defaultMessage)).toBeVisible(); @@ -112,7 +112,7 @@ describe('CourseChecklistPage', () => { describe('an aria-live region with', () => { it('correct content when the launch checklist has loaded', async () => { renderComponent(); - mockStore(404); + await mockStore(404); await waitFor(() => { const { launchChecklistStatus } = store.getState().courseChecklist.loadingStatus; @@ -124,7 +124,7 @@ describe('CourseChecklistPage', () => { it('correct content when the best practices checklist is loading', async () => { renderComponent(); - mockStore(404); + await mockStore(404); await waitFor(() => { const { bestPracticeChecklistStatus } = store.getState().courseChecklist.loadingStatus; diff --git a/src/course-libraries/LegacyLibContentBlockAlert.tsx b/src/course-libraries/LegacyLibContentBlockAlert.tsx index 2aaad37b0..8f2551504 100644 --- a/src/course-libraries/LegacyLibContentBlockAlert.tsx +++ b/src/course-libraries/LegacyLibContentBlockAlert.tsx @@ -31,11 +31,13 @@ const LegacyLibContentBlockAlert = ({ courseId }: Props) => { if (taskStatus.data?.state === UserTaskStatus.Succeeded) { showToast(intl.formatMessage(messages.legacyLibReadyToMigrateTaskCompleted)); setTaskId(undefined); + // eslint-disable-next-line @typescript-eslint/no-floating-promises refetch(); } else if (taskStatus.data?.state === UserTaskStatus.Failed || taskStatus.data?.state === UserTaskStatus.Cancelled) { showToast(intl.formatMessage(messages.legacyLibReadyToMigrateTaskFailed)); setTaskId(undefined); + // eslint-disable-next-line @typescript-eslint/no-floating-promises refetch(); } else if (taskId) { showToast(intl.formatMessage(messages.legacyLibReadyToMigrateTaskInProgress)); diff --git a/src/course-outline/CourseOutline.test.tsx b/src/course-outline/CourseOutline.test.tsx index 26a1ef52a..70e6dfe3a 100644 --- a/src/course-outline/CourseOutline.test.tsx +++ b/src/course-outline/CourseOutline.test.tsx @@ -471,11 +471,11 @@ describe('', () => { const dummyBtn = await screen.findByRole('button', { name: 'Dummy button' }); fireEvent.click(dummyBtn); - waitFor(() => expect(axiosMock.history.post.length).toBe(3)); + await waitFor(() => expect(axiosMock.history.post.length).toBe(3)); const [section] = courseOutlineIndexMock.courseStructure.childInfo.children; const [subsection] = section.childInfo.children; - waitFor(() => { + await waitFor(() => { expect(axiosMock.history.post[2].data).toBe(JSON.stringify({ type: COMPONENT_TYPES.libraryV2, category: 'vertical', @@ -509,10 +509,10 @@ describe('', () => { const dummyBtn = await screen.findByRole('button', { name: 'Dummy button' }); fireEvent.click(dummyBtn); - waitFor(() => expect(axiosMock.history.post.length).toBe(3)); + await waitFor(() => expect(axiosMock.history.post.length).toBe(3)); const [section] = courseOutlineIndexMock.courseStructure.childInfo.children; - waitFor(() => { + await waitFor(() => { expect(axiosMock.history.post[2].data).toBe(JSON.stringify({ type: COMPONENT_TYPES.libraryV2, category: 'sequential', @@ -545,10 +545,10 @@ describe('', () => { const dummyBtn = await screen.findByRole('button', { name: 'Dummy button' }); fireEvent.click(dummyBtn); - waitFor(() => expect(axiosMock.history.post.length).toBe(3)); + await waitFor(() => expect(axiosMock.history.post.length).toBe(3)); const courseUsageKey = courseOutlineIndexMock.courseStructure.id; - waitFor(() => { + await waitFor(() => { expect(axiosMock.history.post[2].data).toBe(JSON.stringify({ type: COMPONENT_TYPES.libraryV2, category: 'chapter', diff --git a/src/course-outline/OutlineAddChildButtons.tsx b/src/course-outline/OutlineAddChildButtons.tsx index ceaa2ad1f..e06409275 100644 --- a/src/course-outline/OutlineAddChildButtons.tsx +++ b/src/course-outline/OutlineAddChildButtons.tsx @@ -321,6 +321,7 @@ const LegacyOutlineAddChildButtons = ({ } const handleOnComponentSelected = (selected: SelectedComponent) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises onUseLibraryContent(selected); closeAddLibrarySectionModal(); }; diff --git a/src/course-outline/card-header/CardHeader.test.tsx b/src/course-outline/card-header/CardHeader.test.tsx index 869bda8b2..05d5c4386 100644 --- a/src/course-outline/card-header/CardHeader.test.tsx +++ b/src/course-outline/card-header/CardHeader.test.tsx @@ -229,7 +229,7 @@ describe('', () => { }); expect(await screen.findByTestId('subsection-edit-field')).toBeInTheDocument(); - waitFor(() => { + await waitFor(() => { expect(screen.queryByTestId('subsection-card-header__expanded-btn')).not.toBeInTheDocument(); expect(screen.queryByTestId('edit-button')).not.toBeInTheDocument(); }); diff --git a/src/course-outline/hooks.jsx b/src/course-outline/hooks.jsx index 1a486d9fd..43ce130d5 100644 --- a/src/course-outline/hooks.jsx +++ b/src/course-outline/hooks.jsx @@ -113,6 +113,7 @@ const useCourseOutline = ({ courseId }) => { const headerNavigationsActions = { handleNewSection: () => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises handleAddSection.mutateAsync({ type: ContainerType.Chapter, parentLocator: courseStructure?.id, diff --git a/src/course-outline/section-card/SectionCard.test.tsx b/src/course-outline/section-card/SectionCard.test.tsx index ae1b3c764..22d4c3082 100644 --- a/src/course-outline/section-card/SectionCard.test.tsx +++ b/src/course-outline/section-card/SectionCard.test.tsx @@ -318,12 +318,12 @@ describe('', () => { renderComponent(); const element = await screen.findByTestId('section-card'); const menu = await within(element).findByTestId('section-card-header__menu-button'); - await fireEvent.click(menu); + fireEvent.click(menu); const manageTagsBtn = await within(element).findByTestId('section-card-header__menu-manage-tags-button'); expect(manageTagsBtn).toBeInTheDocument(); - await fireEvent.click(manageTagsBtn); + fireEvent.click(manageTagsBtn); const drawer = await screen.findByRole('alert'); expect(within(drawer).getByText(/manage tags/i)); @@ -364,12 +364,12 @@ describe('', () => { renderComponent(); const element = await screen.findByTestId('section-card'); const menu = await within(element).findByTestId('section-card-header__menu-button'); - await fireEvent.click(menu); + fireEvent.click(menu); const manageTagsBtn = await within(element).findByTestId('section-card-header__menu-manage-tags-button'); expect(manageTagsBtn).toBeInTheDocument(); - await fireEvent.click(manageTagsBtn); + fireEvent.click(manageTagsBtn); await waitFor(() => { expect(mockSetCurrentPageKey).toHaveBeenCalledWith('align', section.id); diff --git a/src/course-outline/status-bar/hooks.ts b/src/course-outline/status-bar/hooks.ts index 9ea6ac0e8..833f2f9b6 100644 --- a/src/course-outline/status-bar/hooks.ts +++ b/src/course-outline/status-bar/hooks.ts @@ -32,6 +32,7 @@ export function useDynamicHookShim() { } } + // eslint-disable-next-line @typescript-eslint/no-floating-promises load(); return () => { diff --git a/src/course-outline/subsection-card/SubsectionCard.test.tsx b/src/course-outline/subsection-card/SubsectionCard.test.tsx index d3e425a86..180ccf307 100644 --- a/src/course-outline/subsection-card/SubsectionCard.test.tsx +++ b/src/course-outline/subsection-card/SubsectionCard.test.tsx @@ -428,12 +428,12 @@ describe('', () => { renderComponent(); const element = await screen.findByTestId('subsection-card'); const menu = await within(element).findByTestId('subsection-card-header__menu-button'); - await fireEvent.click(menu); + fireEvent.click(menu); const manageTagsBtn = await within(element).findByTestId('subsection-card-header__menu-manage-tags-button'); expect(manageTagsBtn).toBeInTheDocument(); - await fireEvent.click(manageTagsBtn); + fireEvent.click(manageTagsBtn); const drawer = await screen.findByRole('alert'); expect(within(drawer).getByText(/manage tags/i)); @@ -474,12 +474,12 @@ describe('', () => { renderComponent(); const element = await screen.findByTestId('subsection-card'); const menu = await within(element).findByTestId('subsection-card-header__menu-button'); - await fireEvent.click(menu); + fireEvent.click(menu); const manageTagsBtn = await within(element).findByTestId('subsection-card-header__menu-manage-tags-button'); expect(manageTagsBtn).toBeInTheDocument(); - await fireEvent.click(manageTagsBtn); + fireEvent.click(manageTagsBtn); await waitFor(() => { expect(mockSetCurrentPageKey).toHaveBeenCalledWith('align', subsection.id); diff --git a/src/course-outline/unit-card/UnitCard.test.tsx b/src/course-outline/unit-card/UnitCard.test.tsx index 964633641..cf29be757 100644 --- a/src/course-outline/unit-card/UnitCard.test.tsx +++ b/src/course-outline/unit-card/UnitCard.test.tsx @@ -286,12 +286,12 @@ describe('', () => { renderComponent(); const element = await screen.findByTestId('unit-card'); const menu = await within(element).findByTestId('unit-card-header__menu-button'); - await fireEvent.click(menu); + fireEvent.click(menu); const manageTagsBtn = await within(element).findByTestId('unit-card-header__menu-manage-tags-button'); expect(manageTagsBtn).toBeInTheDocument(); - await fireEvent.click(manageTagsBtn); + fireEvent.click(manageTagsBtn); const drawer = await screen.findByRole('alert'); expect(within(drawer).getByText(/manage tags/i)); @@ -332,12 +332,12 @@ describe('', () => { renderComponent(); const element = await screen.findByTestId('unit-card'); const menu = await within(element).findByTestId('unit-card-header__menu-button'); - await fireEvent.click(menu); + fireEvent.click(menu); const manageTagsBtn = await within(element).findByTestId('unit-card-header__menu-manage-tags-button'); expect(manageTagsBtn).toBeInTheDocument(); - await fireEvent.click(manageTagsBtn); + fireEvent.click(manageTagsBtn); await waitFor(() => { expect(mockSetCurrentPageKey).toHaveBeenCalledWith('align', unit.id); diff --git a/src/course-outline/unit-card/UnitCard.tsx b/src/course-outline/unit-card/UnitCard.tsx index d8f092765..922a6ab38 100644 --- a/src/course-outline/unit-card/UnitCard.tsx +++ b/src/course-outline/unit-card/UnitCard.tsx @@ -157,6 +157,7 @@ const UnitCard = ({ }; const handleCopyClick = () => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises copyToClipboard(id); }; diff --git a/src/course-rerun/CourseRerun.test.jsx b/src/course-rerun/CourseRerun.test.jsx index cc1373bfa..bda92ffea 100644 --- a/src/course-rerun/CourseRerun.test.jsx +++ b/src/course-rerun/CourseRerun.test.jsx @@ -17,6 +17,13 @@ jest.mock('react-redux', () => ({ useSelector: jest.fn(), })); +const mockNavigate = jest.fn(); + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), // use actual for all non-hook parts + useNavigate: () => mockNavigate, +})); + describe('', () => { beforeEach(() => { const { axiosMock } = initializeMocks(); @@ -30,13 +37,13 @@ describe('', () => { expect(getAllByRole('button', { name: messages.cancelButton.defaultMessage }).length).toBe(2); }); - it('should navigate to /home on cancel button click', () => { + it('should navigate to /home on cancel button click', async () => { const { getAllByRole } = render(); const cancelButton = getAllByRole('button', { name: messages.cancelButton.defaultMessage })[0]; fireEvent.click(cancelButton); - waitFor(() => { - expect(window.location.pathname).toBe('/home'); + await waitFor(() => { + expect(mockNavigate).toHaveBeenCalledWith('/home'); }); }); diff --git a/src/course-unit/CourseUnit.test.jsx b/src/course-unit/CourseUnit.test.jsx index fcfc0b33b..377a8197d 100644 --- a/src/course-unit/CourseUnit.test.jsx +++ b/src/course-unit/CourseUnit.test.jsx @@ -7,7 +7,14 @@ import { import { cloneDeep, set } from 'lodash'; import { - act, fireEvent, render, waitFor, within, screen, initializeMocks, + act, + cleanup, + fireEvent, + initializeMocks, + render, + waitFor, + within, + screen, } from '@src/testUtils'; import { IFRAME_FEATURE_POLICY } from '@src/constants'; import { mockWaffleFlags } from '@src/data/apiHooks.mock'; @@ -790,9 +797,10 @@ describe('', () => { .reply(200, { ...updatedCourseSectionVerticalData, }); + cleanup(); // clear the first render before we create the second. render(); // to wait for loading - screen.findByTestId('unit-header-title'); + await screen.findByTestId('unit-header-title'); // The new unit button should not be visible when childAddable is false expect( screen.queryByRole('button', { name: courseSequenceMessages.newUnitBtnText.defaultMessage }), diff --git a/src/course-unit/unit-sidebar/unit-info/UnitInfoSidebar.tsx b/src/course-unit/unit-sidebar/unit-info/UnitInfoSidebar.tsx index 446a6fc6d..9ab706963 100644 --- a/src/course-unit/unit-sidebar/unit-info/UnitInfoSidebar.tsx +++ b/src/course-unit/unit-sidebar/unit-info/UnitInfoSidebar.tsx @@ -88,6 +88,7 @@ const UnitInfoSettings = () => { groupAccess: Object | null, isDiscussionEnabled: boolean, ) => { + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. await dispatch(editCourseUnitVisibilityAndData( id, PUBLISH_TYPES.republish, diff --git a/src/course-updates/update-form/UpdateForm.jsx b/src/course-updates/update-form/UpdateForm.jsx index f31109bdc..dfe9b1d70 100644 --- a/src/course-updates/update-form/UpdateForm.jsx +++ b/src/course-updates/update-form/UpdateForm.jsx @@ -83,8 +83,10 @@ const UpdateForm = ({ showPopperArrow={false} onChange={(value) => { if (!isValidDate(value)) { + /* istanbul ignore next */ return; } + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue('date', convertToStringFromDate(value)); }} /> @@ -103,8 +105,8 @@ const UpdateForm = ({ data-testid="course-updates-wisiwyg-editor" name={contentFieldName} minHeight={300} - onChange={(value) => { - setFieldValue(contentFieldName, value || DEFAULT_EMPTY_WYSIWYG_VALUE); + onChange={/* istanbul ignore next: we can't test WYSIWYG editors */async (value) => { + await setFieldValue(contentFieldName, value || DEFAULT_EMPTY_WYSIWYG_VALUE); }} /> diff --git a/src/files-and-videos/files-page/data/api.js b/src/files-and-videos/files-page/data/api.js index 4614a946d..fe34ff8db 100644 --- a/src/files-and-videos/files-page/data/api.js +++ b/src/files-and-videos/files-page/data/api.js @@ -70,7 +70,7 @@ export async function getDownload(selectedRows, courseId) { definedAssets.forEach((assetBlob, index) => { folder.file(assetNames[index], assetBlob.value, { blob: true }); }); - zip.generateAsync({ type: 'blob' }).then(content => { + await zip.generateAsync({ type: 'blob' }).then(content => { saveAs(content, `${courseId}-assets-${date}.zip`); }); } diff --git a/src/files-and-videos/generic/table-components/table-custom-columns/MoreInfoColumn.jsx b/src/files-and-videos/generic/table-components/table-custom-columns/MoreInfoColumn.jsx index 9f5476c2e..c389ec5fd 100644 --- a/src/files-and-videos/generic/table-components/table-custom-columns/MoreInfoColumn.jsx +++ b/src/files-and-videos/generic/table-components/table-custom-columns/MoreInfoColumn.jsx @@ -58,6 +58,7 @@ const MoreInfoColumn = ({ as={Button} variant="tertiary" onClick={() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises navigator.clipboard.writeText(id); close(); }} @@ -70,6 +71,7 @@ const MoreInfoColumn = ({ as={Button} variant="tertiary" onClick={() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises navigator.clipboard.writeText(portableUrl); close(); }} @@ -80,6 +82,7 @@ const MoreInfoColumn = ({ as={Button} variant="tertiary" onClick={() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises navigator.clipboard.writeText(externalUrl); close(); }} diff --git a/src/files-and-videos/videos-page/data/thunks.js b/src/files-and-videos/videos-page/data/thunks.js index cfc94ca4a..d9e94ca16 100644 --- a/src/files-and-videos/videos-page/data/thunks.js +++ b/src/files-and-videos/videos-page/data/thunks.js @@ -55,6 +55,7 @@ export function cancelAllUploads(courseId, uploadData) { }); Object.entries(uploadData).forEach(([key, value]) => { if (value.status === RequestStatus.IN_PROGRESS) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises updateVideoUploadStatus( courseId, key, @@ -178,6 +179,7 @@ export function markVideoUploadsInProgressAsFailed({ uploadingIdsRef, courseId } return (dispatch) => { Object.keys(uploadingIdsRef.current.uploadData).forEach((edxVideoId) => { try { + // eslint-disable-next-line @typescript-eslint/no-floating-promises updateVideoUploadStatus( courseId, edxVideoId || '', @@ -246,7 +248,7 @@ const uploadToBucket = async ({ ...currentVideoData, status: RequestStatus.SUCCESSFUL, }; - updateVideoUploadStatus( + await updateVideoUploadStatus( courseId, edxVideoId, 'Upload completed', @@ -270,7 +272,7 @@ const uploadToBucket = async ({ status: RequestStatus.FAILED, }; } - updateVideoUploadStatus( + await updateVideoUploadStatus( courseId, edxVideoId || '', 'Upload failed', diff --git a/src/generic/create-or-rerun-course/CreateOrRerunCourseForm.jsx b/src/generic/create-or-rerun-course/CreateOrRerunCourseForm.jsx index 36bafc597..71f9f7577 100644 --- a/src/generic/create-or-rerun-course/CreateOrRerunCourseForm.jsx +++ b/src/generic/create-or-rerun-course/CreateOrRerunCourseForm.jsx @@ -155,6 +155,7 @@ const CreateOrRerunCourseForm = ({ const handleCustomBlurForDropdown = (e) => { // it needs to correct handleOnChange Form.Autosuggest const { value, name } = e.target; + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue(name, value); handleBlur(e); }; diff --git a/src/generic/data/api.test.js b/src/generic/data/api.test.js index eeac9c65c..6c544f06e 100644 --- a/src/generic/data/api.test.js +++ b/src/generic/data/api.test.js @@ -88,7 +88,7 @@ describe('generic api calls', () => { it('should throw an error if no pattern is provided', async () => { const pattern = undefined; - expect(getTagsCount(pattern)).rejects.toThrow('contentPattern is required'); + await expect(getTagsCount(pattern)).rejects.toThrow('contentPattern is required'); expect(axiosMock.history.get.length).toEqual(0); }); }); diff --git a/src/generic/inplace-text-editor/index.tsx b/src/generic/inplace-text-editor/index.tsx index 8378269a4..0023dafe7 100644 --- a/src/generic/inplace-text-editor/index.tsx +++ b/src/generic/inplace-text-editor/index.tsx @@ -58,6 +58,7 @@ export const InplaceTextEditor: React.FC = ({ const handleOnKeyDown = (event: React.KeyboardEvent) => { if (event.key === 'Enter') { + // eslint-disable-next-line @typescript-eslint/no-floating-promises handleOnChangeText(event); } else if (event.key === 'Escape') { setIsActive(false); diff --git a/src/legacy-libraries-migration/LegacyLibMigrationPage.tsx b/src/legacy-libraries-migration/LegacyLibMigrationPage.tsx index 3f402c20f..ebd6637d8 100644 --- a/src/legacy-libraries-migration/LegacyLibMigrationPage.tsx +++ b/src/legacy-libraries-migration/LegacyLibMigrationPage.tsx @@ -114,6 +114,7 @@ export const LegacyLibMigrationPage = () => { break; case 'confirmation-view': setConfirmationButtonState('pending'); + // eslint-disable-next-line @typescript-eslint/no-floating-promises handleMigrate(); break; default: diff --git a/src/library-authoring/LibraryAuthoringPage.test.tsx b/src/library-authoring/LibraryAuthoringPage.test.tsx index b590ace94..9406cc7f0 100644 --- a/src/library-authoring/LibraryAuthoringPage.test.tsx +++ b/src/library-authoring/LibraryAuthoringPage.test.tsx @@ -431,7 +431,7 @@ describe('', () => { expect(mockResult0.display_name).toStrictEqual(displayName); await renderLibraryPage(); - waitFor(() => expect(screen.getAllByTestId('component-card-menu-toggle').length).toBeGreaterThan(0)); + await waitFor(() => expect(screen.getAllByTestId('component-card-menu-toggle').length).toBeGreaterThan(0)); // Open menu fireEvent.click((await screen.findAllByTestId('component-card-menu-toggle'))[0]); @@ -455,7 +455,7 @@ describe('', () => { const displayName = 'Test Unit'; await renderLibraryPage(); - waitFor(() => expect(screen.getAllByTestId('container-card-menu-toggle').length).toBeGreaterThan(0)); + await waitFor(() => expect(screen.getAllByTestId('container-card-menu-toggle').length).toBeGreaterThan(0)); // Open menu fireEvent.click((await screen.findAllByTestId('container-card-menu-toggle'))[0]); diff --git a/src/library-authoring/add-content/AddContent.test.tsx b/src/library-authoring/add-content/AddContent.test.tsx index 58c06490d..e352a5813 100644 --- a/src/library-authoring/add-content/AddContent.test.tsx +++ b/src/library-authoring/add-content/AddContent.test.tsx @@ -93,7 +93,7 @@ describe('', () => { expect(screen.queryByRole('button', { name: /video/i })).toBeInTheDocument(); expect(screen.queryByRole('button', { name: /copy from clipboard/i })).not.toBeInTheDocument(); expect(await screen.findByRole('button', { name: /advanced \/ other/i })).toBeInTheDocument(); - expect(await screen.queryByRole('button', { name: /existing library content/i })).not.toBeInTheDocument(); + expect(screen.queryByRole('button', { name: /existing library content/i })).not.toBeInTheDocument(); }); it('should render advanced content buttons', async () => { diff --git a/src/library-authoring/component-info/ComponentAdvancedAssets.tsx b/src/library-authoring/component-info/ComponentAdvancedAssets.tsx index cddac1aa6..5e42fc63b 100644 --- a/src/library-authoring/component-info/ComponentAdvancedAssets.tsx +++ b/src/library-authoring/component-info/ComponentAdvancedAssets.tsx @@ -59,6 +59,7 @@ export const ComponentAdvancedAssets: React.FC> = () => { const deleter = useDeleteXBlockAsset(usageKey); const [filePathToDelete, setConfirmDeleteAsset] = React.useState(''); const deleteFile = React.useCallback(() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises deleter.mutateAsync(filePathToDelete); // Don't wait for this before clearing the modal on the next line setConfirmDeleteAsset(''); }, [filePathToDelete, usageKey]); diff --git a/src/library-authoring/component-info/ComponentInfo.test.tsx b/src/library-authoring/component-info/ComponentInfo.test.tsx index 695c59764..168fdc2a2 100644 --- a/src/library-authoring/component-info/ComponentInfo.test.tsx +++ b/src/library-authoring/component-info/ComponentInfo.test.tsx @@ -143,7 +143,7 @@ describe(' Sidebar', () => { // Should show the confirmation box expect(await screen.findByText(/Confirm Publish/i)).toBeInTheDocument(); - const secondPublishButton = await screen.getByRole('button', { name: /publish/i }); + const secondPublishButton = screen.getByRole('button', { name: /publish/i }); secondPublishButton.click(); }); @@ -160,7 +160,7 @@ describe(' Sidebar', () => { // Should show the confirmation box expect(await screen.findByText(/Confirm Publish/i)).toBeInTheDocument(); - const secondPublishButton = await screen.getByRole('button', { name: /publish/i }); + const secondPublishButton = screen.getByRole('button', { name: /publish/i }); secondPublishButton.click(); }); @@ -177,7 +177,7 @@ describe(' Sidebar', () => { // Should show the confirmation box expect(await screen.findByText(/Confirm Publish/i)).toBeInTheDocument(); - const secondPublishButton = await screen.getByRole('button', { name: /publish/i }); + const secondPublishButton = screen.getByRole('button', { name: /publish/i }); secondPublishButton.click(); }); @@ -195,7 +195,7 @@ describe(' Sidebar', () => { // Should show the confirmation box expect(await screen.findByText(/Confirm Publish/i)).toBeInTheDocument(); - const secondPublishButton = await screen.getByRole('button', { name: /publish/i }); + const secondPublishButton = screen.getByRole('button', { name: /publish/i }); secondPublishButton.click(); await waitFor(() => { @@ -217,7 +217,7 @@ describe(' Sidebar', () => { // Should show the confirmation box expect(await screen.findByText(/Confirm Publish/i)).toBeInTheDocument(); - const secondPublishButton = await screen.getByRole('button', { name: /publish/i }); + const secondPublishButton = screen.getByRole('button', { name: /publish/i }); secondPublishButton.click(); await waitFor(() => { diff --git a/src/library-authoring/component-info/ComponentInfo.tsx b/src/library-authoring/component-info/ComponentInfo.tsx index 55c2a8983..ff2ea379b 100644 --- a/src/library-authoring/component-info/ComponentInfo.tsx +++ b/src/library-authoring/component-info/ComponentInfo.tsx @@ -62,6 +62,7 @@ const AddComponentWidget = () => { variant="outline-primary" className="m-1 text-nowrap flex-grow-1" onClick={() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises onComponentSelected({ usageKey, blockType: getBlockType(usageKey) }); }} > @@ -78,8 +79,10 @@ const AddComponentWidget = () => { blockType: getBlockType(usageKey), }; if (!isChecked) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises addComponentToSelectedComponents(selectedComponent); } else { + // eslint-disable-next-line @typescript-eslint/no-floating-promises removeComponentFromSelectedComponents(selectedComponent); } }; diff --git a/src/library-authoring/component-info/ComponentUsageTab.test.tsx b/src/library-authoring/component-info/ComponentUsageTab.test.tsx index c6de97fc4..81ab37457 100644 --- a/src/library-authoring/component-info/ComponentUsageTab.test.tsx +++ b/src/library-authoring/component-info/ComponentUsageTab.test.tsx @@ -50,8 +50,8 @@ describe('', () => { render(mockLibraryBlockMetadata.usageKeyPublished); expect(await screen.findByText('text block 0')).toBeInTheDocument(); - expect(await screen.getByText('4 Units')).toBeInTheDocument(); - expect(await screen.getByText('3 Subsections')).toBeInTheDocument(); - expect(await screen.getByText('2 Sections')).toBeInTheDocument(); + expect(screen.getByText('4 Units')).toBeInTheDocument(); + expect(screen.getByText('3 Subsections')).toBeInTheDocument(); + expect(screen.getByText('2 Sections')).toBeInTheDocument(); }); }); diff --git a/src/library-authoring/components/AddComponentWidget.tsx b/src/library-authoring/components/AddComponentWidget.tsx index 05bcfd194..30715b05f 100644 --- a/src/library-authoring/components/AddComponentWidget.tsx +++ b/src/library-authoring/components/AddComponentWidget.tsx @@ -69,8 +69,10 @@ const AddComponentWidget = ({ usageKey, blockType }: AddComponentWidgetProps) => blockType, }; if (!isChecked) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises addComponentToSelectedComponents(selectedComponent); } else { + // eslint-disable-next-line @typescript-eslint/no-floating-promises removeComponentFromSelectedComponents(selectedComponent); } }; diff --git a/src/library-authoring/components/ComponentMenu.tsx b/src/library-authoring/components/ComponentMenu.tsx index 940b9c5bf..6e07dc6d7 100644 --- a/src/library-authoring/components/ComponentMenu.tsx +++ b/src/library-authoring/components/ComponentMenu.tsx @@ -54,6 +54,7 @@ export const ComponentMenu = ({ usageKey, index }: Props) => { const { copyToClipboard } = useClipboard(); const updateClipboardClick = () => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises copyToClipboard(usageKey); }; diff --git a/src/library-authoring/containers/ContainerCard.tsx b/src/library-authoring/containers/ContainerCard.tsx index 4726e21ab..14a224cdc 100644 --- a/src/library-authoring/containers/ContainerCard.tsx +++ b/src/library-authoring/containers/ContainerCard.tsx @@ -95,6 +95,7 @@ export const ContainerMenu = ({ containerKey, displayName, index } : ContainerMe }, [navigateTo, containerKey]); const handleCopy = useCallback(() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises copyToClipboard(containerKey); }, [copyToClipboard, containerKey]); diff --git a/src/library-authoring/containers/ContainerInfo.tsx b/src/library-authoring/containers/ContainerInfo.tsx index 7ea723b57..07c245158 100644 --- a/src/library-authoring/containers/ContainerInfo.tsx +++ b/src/library-authoring/containers/ContainerInfo.tsx @@ -44,6 +44,7 @@ const ContainerMenu = ({ containerId }: ContainerPreviewProps) => { const { copyToClipboard } = useClipboard(); const handleCopy = useCallback(() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises copyToClipboard(containerId); }, [copyToClipboard, containerId]); diff --git a/src/library-authoring/hierarchy/ItemHierarchyPublisher.tsx b/src/library-authoring/hierarchy/ItemHierarchyPublisher.tsx index 6df4b418b..a70af3752 100644 --- a/src/library-authoring/hierarchy/ItemHierarchyPublisher.tsx +++ b/src/library-authoring/hierarchy/ItemHierarchyPublisher.tsx @@ -123,10 +123,10 @@ export const ItemHierarchyPublisher = ({ {intl.formatMessage(messages.publishCancel)} { + onClick={(e) => { e.preventDefault(); e.stopPropagation(); - await handlePublish(); + handlePublish(); }} variant="primary rounded-0" label={intl.formatMessage(messages.publishConfirm)} diff --git a/src/library-authoring/import-course/ImportDetailsPage.test.tsx b/src/library-authoring/import-course/ImportDetailsPage.test.tsx index 757d71a7a..34d10d626 100644 --- a/src/library-authoring/import-course/ImportDetailsPage.test.tsx +++ b/src/library-authoring/import-course/ImportDetailsPage.test.tsx @@ -104,7 +104,7 @@ describe('', () => { name: /view imported content/i, }); - await viewImportedContentBtn.click(); + viewImportedContentBtn.click(); await waitFor(() => expect(mockNavigate).toHaveBeenCalledWith('/library/lib:Axim:TEST/collection/coll')); }); diff --git a/src/library-authoring/import-course/ImportDetailsPage.tsx b/src/library-authoring/import-course/ImportDetailsPage.tsx index 770b56862..763712cfb 100644 --- a/src/library-authoring/import-course/ImportDetailsPage.tsx +++ b/src/library-authoring/import-course/ImportDetailsPage.tsx @@ -132,6 +132,7 @@ const ImportDetailsContent = () => { migrationStatus = 'Failed'; } else if (migrationStatusData?.state === 'Succeeded') { // refetch migrationBlockInfo data once the import is complete + // eslint-disable-next-line @typescript-eslint/no-floating-promises refetchMigrationBlockInfo(); // Currently, bulk migrate is being used to migrate courses because // it has the ability to create collections. diff --git a/src/optimizer-page/scan-results/ScanResults.tsx b/src/optimizer-page/scan-results/ScanResults.tsx index b91e38e39..2ca8d1e53 100644 --- a/src/optimizer-page/scan-results/ScanResults.tsx +++ b/src/optimizer-page/scan-results/ScanResults.tsx @@ -460,6 +460,7 @@ const ScanResults: FC = ({ const handleUpdateCompletion = async () => { if (rerunLinkUpdateInProgress === false && isUpdateAllInProgress) { try { + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. const updateStatusResponse = await dispatch(fetchRerunLinkUpdateStatus(courseId)) as any; if (!updateStatusResponse) { @@ -506,6 +507,7 @@ const ScanResults: FC = ({ } }; + // eslint-disable-next-line @typescript-eslint/no-floating-promises handleUpdateCompletion(); }, [rerunLinkUpdateInProgress, isUpdateAllInProgress, @@ -590,6 +592,7 @@ const ScanResults: FC = ({ try { setUpdatingLinkIds(prev => ({ ...prev, [uniqueId]: true })); const contentType = getContentType(sectionId || ''); + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. await dispatch(updateSinglePreviousRunLink(courseId, link, blockId, contentType)); const pollForSingleLinkResult = async (attempts = 0): Promise => { @@ -597,6 +600,7 @@ const ScanResults: FC = ({ throw new Error('Timeout waiting for link update result'); } + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. const updateStatusResponse = await dispatch(fetchRerunLinkUpdateStatus(courseId)) as any; const pollStatus = updateStatusResponse?.status || updateStatusResponse?.updateStatus; @@ -755,6 +759,7 @@ const ScanResults: FC = ({ try { setProcessedResponseIds(new Set()); setIsUpdateAllInProgress(true); + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. await dispatch(updateAllPreviousRunLinks(courseId)); return true; diff --git a/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx b/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx index 429a9677f..1251394e1 100644 --- a/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx +++ b/src/pages-and-resources/app-settings-modal/AppSettingsModal.jsx @@ -72,13 +72,14 @@ const AppSettingsModal = ({ const handleFormSubmit = async (values) => { let success = true; if (appInfo.enabled !== values.enabled) { + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. success = await dispatch(updateAppStatus(courseId, appInfo.id, values.enabled)); } // Call the submit handler for the settings component to save its settings if (onSettingsSave) { success = success && await onSettingsSave(values); } - await setSaveError(!success); + setSaveError(!success); !success && alertRef?.current.scrollIntoView(); // eslint-disable-line @typescript-eslint/no-unused-expressions }; @@ -86,7 +87,8 @@ const AppSettingsModal = ({ // If submitting the form with errors, show the alert and scroll to it. await handleSubmit(event); if (Object.keys(errors).length > 0) { - await setSaveError(true); + /* istanbul ignore next: temp to unblock lint cleanup. We probably should test this. */ + setSaveError(true); alertRef?.current.scrollIntoView?.(); // eslint-disable-line no-unused-expressions } }; diff --git a/src/pages-and-resources/discussions/app-config-form/AppConfigForm.jsx b/src/pages-and-resources/discussions/app-config-form/AppConfigForm.jsx index b921ed901..1358f997a 100644 --- a/src/pages-and-resources/discussions/app-config-form/AppConfigForm.jsx +++ b/src/pages-and-resources/discussions/app-config-form/AppConfigForm.jsx @@ -46,7 +46,9 @@ const AppConfigForm = ({ const [confirmationDialogVisible, setConfirmationDialogVisible] = useState(false); useEffect(() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises (async () => { + // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. await dispatch(fetchDiscussionSettings(courseId, selectedAppId)); setLoading(false); })(); diff --git a/src/pages-and-resources/discussions/app-config-form/apps/shared/DiscussionRestriction.jsx b/src/pages-and-resources/discussions/app-config-form/apps/shared/DiscussionRestriction.jsx index 3fbee41c1..66691d0f1 100644 --- a/src/pages-and-resources/discussions/app-config-form/apps/shared/DiscussionRestriction.jsx +++ b/src/pages-and-resources/discussions/app-config-form/apps/shared/DiscussionRestriction.jsx @@ -24,12 +24,14 @@ const DiscussionRestriction = () => { setSelectedRestrictionOption(value); if (value !== discussionRestriction.ENABLED) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue('postingRestrictions', value); } }, []); const handleConfirmation = useCallback(() => { setSelectedRestrictionOption(discussionRestriction.ENABLED); + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue('postingRestrictions', discussionRestriction.ENABLED); }, []); diff --git a/src/pages-and-resources/discussions/app-config-form/apps/shared/DivisionByGroupFields.jsx b/src/pages-and-resources/discussions/app-config-form/apps/shared/DivisionByGroupFields.jsx index b85c9b289..cb39ff67b 100644 --- a/src/pages-and-resources/discussions/app-config-form/apps/shared/DivisionByGroupFields.jsx +++ b/src/pages-and-resources/discussions/app-config-form/apps/shared/DivisionByGroupFields.jsx @@ -36,10 +36,13 @@ const DivisionByGroupFields = () => { useEffect(() => { if (divideByCohorts) { if (!divideCourseTopicsByCohorts && size(discussionTopics) !== size(divideDiscussionIds)) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue('divideDiscussionIds', discussionTopics.map(topic => topic.id)); } } else { + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue('divideDiscussionIds', []); + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue('divideCourseTopicsByCohorts', false); } }, [ @@ -59,6 +62,7 @@ const DivisionByGroupFields = () => { const handleDivideCourseTopicsByCohortsToggle = (event) => { const { checked } = event.target; if (!checked) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue('divideDiscussionIds', []); } handleChange(event); diff --git a/src/pages-and-resources/discussions/app-config-form/apps/shared/InContextDiscussionFields.jsx b/src/pages-and-resources/discussions/app-config-form/apps/shared/InContextDiscussionFields.jsx index ed825ffee..38efa6fd6 100644 --- a/src/pages-and-resources/discussions/app-config-form/apps/shared/InContextDiscussionFields.jsx +++ b/src/pages-and-resources/discussions/app-config-form/apps/shared/InContextDiscussionFields.jsx @@ -19,6 +19,7 @@ const InContextDiscussionFields = ({ const [showPopup, setShowPopup] = useState(false); const handleConfirmation = () => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue('enableGradedUnits', !values.enableGradedUnits); setShowPopup(false); }; diff --git a/src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-restrictions/RestrictionSchedules.jsx b/src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-restrictions/RestrictionSchedules.jsx index 3a61dfa00..d0f135433 100644 --- a/src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-restrictions/RestrictionSchedules.jsx +++ b/src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-restrictions/RestrictionSchedules.jsx @@ -29,6 +29,7 @@ const RestrictionSchedules = () => { ...updatedRestrictedDates[index], status: checkStatus(denormalizeRestrictedDate(updatedRestrictedDates[index])), }; + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue('restrictedDates', updatedRestrictedDates); }, [restrictedDates]); @@ -43,7 +44,7 @@ const RestrictionSchedules = () => { const onAddNewItem = useCallback(async (push) => { await push(newRestrictedDateItem); - validateForm(); + await validateForm(); }, []); return ( diff --git a/src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-topics/DiscussionTopics.jsx b/src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-topics/DiscussionTopics.jsx index 1fed01969..15b392ad2 100644 --- a/src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-topics/DiscussionTopics.jsx +++ b/src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-topics/DiscussionTopics.jsx @@ -26,13 +26,14 @@ const DiscussionTopics = () => { const handleTopicDelete = async (topicIndex, topicId, remove) => { await remove(topicIndex); - validateForm(); + await validateForm(); setValidDiscussionTopics(filterItemFromObject(validDiscussionTopics, 'id', topicId)); }; const handleOnFocus = useCallback((id, hasError) => { if (hasError) { setValidDiscussionTopics(currentValidTopics => filterItemFromObject(currentValidTopics, 'id', id)); + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue('divideDiscussionIds', filterItemFromObject(divideDiscussionIds, 'id', id)); } else { setValidDiscussionTopics(currentValidTopics => { @@ -40,6 +41,7 @@ const DiscussionTopics = () => { const allValidTopics = removeElements(allDiscussionTopics, topic => topic.name !== ''); return uniqBy(allValidTopics, 'id'); }); + // eslint-disable-next-line @typescript-eslint/no-floating-promises setFieldValue('divideDiscussionIds', uniq([...divideDiscussionIds, id])); } }, [divideDiscussionIds, discussionTopics]); diff --git a/src/search-manager/data/api.mock.ts b/src/search-manager/data/api.mock.ts index 8ddd3738e..f1332a992 100644 --- a/src/search-manager/data/api.mock.ts +++ b/src/search-manager/data/api.mock.ts @@ -107,7 +107,7 @@ mockFetchIndexDocuments.applyMock = () => { /** * Mock the useGetContentHits */ -export async function mockGetContentHits( +export function mockGetContentHits( mockResponse: 'noHits' | 'someHits', ) { fetchMock.post(mockContentSearchConfig.searchEndpointUrl, () => { diff --git a/src/search-manager/data/apiHooks.ts b/src/search-manager/data/apiHooks.ts index 34a785393..5ef76580e 100644 --- a/src/search-manager/data/apiHooks.ts +++ b/src/search-manager/data/apiHooks.ts @@ -187,7 +187,12 @@ export const useContentSearchResults = ({ // Call this to load more pages. We include some "safety" features recommended by the docs: this should never be // called while already fetching a page, and parameters (like 'event') should not be passed into fetchNextPage(). // See https://tanstack.com/query/v4/docs/framework/react/guides/infinite-queries - fetchNextPage: () => { if (!query.isFetching && !query.isFetchingNextPage) { query.fetchNextPage(); } }, + fetchNextPage: /* istanbul ignore next */ () => { + if (!query.isFetching && !query.isFetchingNextPage) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + query.fetchNextPage(); + } + }, hasNextPage: query.hasNextPage, // The last page has the most accurate count of total hits totalHits: pages?.[pages.length - 1]?.totalHits ?? 0, diff --git a/src/taxonomy/TaxonomyListPage.test.tsx b/src/taxonomy/TaxonomyListPage.test.tsx index be71ea5f9..0f2dac845 100644 --- a/src/taxonomy/TaxonomyListPage.test.tsx +++ b/src/taxonomy/TaxonomyListPage.test.tsx @@ -175,7 +175,7 @@ describe('', () => { } = render(); // Open the taxonomies org filter select menu - const taxonomiesFilterSelectMenu = await getByRole('button', { name: 'All taxonomies' }); + const taxonomiesFilterSelectMenu = getByRole('button', { name: 'All taxonomies' }); fireEvent.click(taxonomiesFilterSelectMenu); // Check that the 'Unassigned' option is correctly called diff --git a/src/taxonomy/taxonomy-menu/TaxonomyMenu.jsx b/src/taxonomy/taxonomy-menu/TaxonomyMenu.jsx index fce069a95..8d7144056 100644 --- a/src/taxonomy/taxonomy-menu/TaxonomyMenu.jsx +++ b/src/taxonomy/taxonomy-menu/TaxonomyMenu.jsx @@ -41,6 +41,7 @@ const TaxonomyMenu = ({ const { setToastMessage } = useContext(TaxonomyContext); const onDeleteTaxonomy = useCallback(() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises deleteTaxonomy({ pk: taxonomy.id }, { onSuccess: () => { if (setToastMessage) { diff --git a/src/textbooks/textbook-card/TextbooksCard.test.jsx b/src/textbooks/textbook-card/TextbooksCard.test.jsx index 4cd334db9..c6cd41e7f 100644 --- a/src/textbooks/textbook-card/TextbooksCard.test.jsx +++ b/src/textbooks/textbook-card/TextbooksCard.test.jsx @@ -175,7 +175,7 @@ describe('', () => { .onDelete(getEditTextbooksApiUrl(courseId, textbookId)) .reply(200); - executeThunk(deleteTextbookQuery(courseId, textbookId), store.dispatch); + await executeThunk(deleteTextbookQuery(courseId, textbookId), store.dispatch); }); }); });