fix(frontend): confirm modal, settings display, race guard, and test coverage
- S1: Replace window.confirm() with AppConfirmModal for delete actions - S4: Add formatHours helper to avoid ugly decimals in settings hints - W5: Add generation counter to SettingsAdminPanel to prevent stale async results when section changes rapidly - S7: Remove unused ApiRequestError import from useScholarBulkActions - S2: Add error-path tests for bulk delete/toggle network failures - S3: Add CSRF boundary tests for bulk-delete and bulk-toggle endpoints
This commit is contained in:
parent
f8e3098fc3
commit
f501ea4f94
8 changed files with 181 additions and 33 deletions
|
|
@ -109,4 +109,40 @@ describe("useScholarBulkActions", () => {
|
|||
await bulk.onApplyBulkAction();
|
||||
expect(bulk.selectedIds.value.size).toBe(0);
|
||||
});
|
||||
|
||||
it("bulk delete calls assignError on network failure", async () => {
|
||||
const { bulkDeleteScholars } = await import("@/features/scholars");
|
||||
vi.mocked(bulkDeleteScholars).mockRejectedValueOnce(new Error("Network error"));
|
||||
|
||||
const { bulk, callbacks } = setup([makeProfile(1, "Alice")]);
|
||||
bulk.onToggleRow(1, { target: { checked: true } } as unknown as Event);
|
||||
bulk.bulkAction.value = "delete_selected" as ScholarBulkAction;
|
||||
await bulk.onApplyBulkAction();
|
||||
|
||||
// Trigger the confirm callback
|
||||
expect(bulk.confirmState.value.open).toBe(true);
|
||||
await bulk.confirmState.value.onConfirm();
|
||||
|
||||
expect(callbacks.assignError).toHaveBeenCalledWith(
|
||||
expect.any(Error),
|
||||
"Unable to bulk delete scholars.",
|
||||
);
|
||||
expect(bulk.bulkBusy.value).toBe(false);
|
||||
});
|
||||
|
||||
it("bulk toggle calls assignError on network failure", async () => {
|
||||
const { bulkToggleScholars } = await import("@/features/scholars");
|
||||
vi.mocked(bulkToggleScholars).mockRejectedValueOnce(new Error("Network error"));
|
||||
|
||||
const { bulk, callbacks } = setup([makeProfile(1, "Alice")]);
|
||||
bulk.onToggleRow(1, { target: { checked: true } } as unknown as Event);
|
||||
bulk.bulkAction.value = "enable_selected" as ScholarBulkAction;
|
||||
await bulk.onApplyBulkAction();
|
||||
|
||||
expect(callbacks.assignError).toHaveBeenCalledWith(
|
||||
expect.any(Error),
|
||||
"Unable to bulk enable scholars.",
|
||||
);
|
||||
expect(bulk.bulkBusy.value).toBe(false);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue