Skip to content

Commit 4285e07

Browse files
feat: adds pending tasks and close modal button (#205)
* feat: adds pending tasks and close modal button * fix: tests * feat: increase test coverage * fix: linting * feat: increase test coverage
1 parent a1d315c commit 4285e07

3 files changed

Lines changed: 36 additions & 2 deletions

File tree

src/certificates/CertificatesPage.test.tsx

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { screen, waitFor } from '@testing-library/react';
22
import userEvent from '@testing-library/user-event';
33
import CertificatesPage from '@src/certificates/CertificatesPage';
44
import { renderWithAlertAndIntl } from '@src/testUtils';
5-
import { useCourseInfo } from '@src/data/apiHook';
5+
import { useCourseInfo, usePendingTasks } from '@src/data/apiHook';
66
import {
77
useCertificateGenerationHistory,
88
useGrantBulkExceptions,
@@ -25,9 +25,22 @@ jest.mock('react-router-dom', () => ({
2525
jest.mock('@src/certificates/data/apiHook');
2626
jest.mock('@src/data/apiHook', () => ({
2727
useCourseInfo: jest.fn(),
28+
usePendingTasks: jest.fn(),
29+
}));
30+
31+
jest.mock('@src/components/PendingTasks', () => ({
32+
PendingTasks: function MockPendingTasks({ onToggle }: { isOpen: boolean, onToggle: () => void }) {
33+
return (
34+
<div data-testid="pending-tasks">
35+
Pending Tasks
36+
<button onClick={onToggle}>Toggle</button>
37+
</div>
38+
);
39+
},
2840
}));
2941

3042
const mockUseCourseInfo = useCourseInfo as jest.MockedFunction<typeof useCourseInfo>;
43+
const mockUsePendingTasks = usePendingTasks as jest.MockedFunction<typeof usePendingTasks>;
3144
const mockUseCertificateGenerationHistory = useCertificateGenerationHistory as jest.MockedFunction<typeof useCertificateGenerationHistory>;
3245
const mockUseInstructorTasks = useInstructorTasks as jest.MockedFunction<typeof useInstructorTasks>;
3346
const mockUseIssuedCertificates = useIssuedCertificates as jest.MockedFunction<typeof useIssuedCertificates>;
@@ -56,6 +69,12 @@ describe('CertificatesPage', () => {
5669
error: null,
5770
} as any);
5871

72+
mockUsePendingTasks.mockReturnValue({
73+
data: [],
74+
isLoading: false,
75+
refetch: jest.fn(),
76+
} as any);
77+
5978
mockUseCertificateGenerationHistory.mockReturnValue({
6079
data: {
6180
results: [],
@@ -181,6 +200,17 @@ describe('CertificatesPage', () => {
181200
expect(screen.getByText(messages.generationHistoryTab.defaultMessage)).toBeInTheDocument();
182201
});
183202

203+
it('renders pending tasks component', async () => {
204+
renderWithAlertAndIntl(<CertificatesPage />);
205+
const user = userEvent.setup();
206+
207+
expect(screen.getByTestId('pending-tasks')).toBeInTheDocument();
208+
209+
// Test toggle functionality
210+
const toggleButton = screen.getByText('Toggle');
211+
await user.click(toggleButton);
212+
});
213+
184214
it('renders issued certificates tab by default', () => {
185215
renderWithAlertAndIntl(<CertificatesPage />);
186216

src/certificates/CertificatesPage.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Card, Container, Button, ButtonGroup, Alert } from '@openedx/paragon';
44
import { useIntl } from '@openedx/frontend-base';
55
import { useAlert } from '@src/providers/AlertProvider';
66
import { useCourseInfo } from '@src/data/apiHook';
7+
import { PendingTasks } from '@src/components/PendingTasks';
78
import CertificatesPageHeader from '@src/certificates/components/CertificatesPageHeader';
89
import IssuedCertificatesTab from '@src/certificates/components/IssuedCertificatesTab';
910
import GenerationHistoryTable from '@src/certificates/components/GenerationHistoryTable';
@@ -53,6 +54,7 @@ const CertificatesPage = () => {
5354
const [isDisableCertificatesOpen, setIsDisableCertificatesOpen] = useState(false);
5455
const [isRegenerateModalOpen, setIsRegenerateModalOpen] = useState(false);
5556
const [isGenerateModalOpen, setIsGenerateModalOpen] = useState(false);
57+
const [isPendingTasksOpen, setIsPendingTasksOpen] = useState(false);
5658

5759
const {
5860
data: certificatesData,
@@ -150,6 +152,7 @@ const CertificatesPage = () => {
150152
title: intl.formatMessage(messages.errorModalTitle),
151153
message: `Some invalidations failed:\n${errorMessages}`,
152154
variant: ALERT_VARIANTS.WARNING,
155+
confirmText: intl.formatMessage(messages.close),
153156
});
154157
}
155158
if (data.success && data.success.length > 0) {
@@ -504,6 +507,7 @@ const CertificatesPage = () => {
504507
isSubmitting={false}
505508
learnerCount={certificatesData?.count || 0}
506509
/>
510+
<PendingTasks isOpen={isPendingTasksOpen} onToggle={() => setIsPendingTasksOpen(prev => !prev)} />
507511
</Container>
508512
);
509513
};

src/providers/AlertProvider.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ export const AlertProvider: FC<AlertProviderProps> = ({ children }) => {
229229
{modal.confirmText && (
230230
<Button
231231
variant={modal.variant === 'danger' ? 'danger' : 'primary'}
232-
onClick={() => confirmModal(modal.id)}
232+
onClick={() => modal.onConfirm ? confirmModal(modal.id) : closeModal(modal.id, false)}
233233
>
234234
{modal.confirmText}
235235
</Button>

0 commit comments

Comments
 (0)