Files
frontend-app-gradebook/src/components/GradesView/PageButtons/hooks.test.js
2025-09-08 14:57:00 -04:00

90 lines
2.7 KiB
JavaScript

import { useIntl } from '@edx/frontend-platform/i18n';
import { formatMessage } from 'testUtils';
import { selectors, thunkActions } from 'data/redux/hooks';
import usePageButtonsData from './hooks';
import messages from './messages';
jest.mock('data/redux/hooks', () => ({
selectors: {
grades: { useGradeData: jest.fn() },
},
thunkActions: {
grades: { useFetchPrevNextGrades: jest.fn() },
},
}));
jest.mock('react', () => ({
...jest.requireActual('react'),
useContext: jest.fn(context => context),
}));
jest.mock('@edx/frontend-platform/i18n', () => ({
...jest.requireActual('@edx/frontend-platform/i18n'),
useIntl: jest.fn(() => ({
formatMessage: (message) => message.defaultMessage,
})),
}));
const gradeData = { nextPage: 'test-next-page', prevPage: 'test-prev-page' };
selectors.grades.useGradeData.mockReturnValue(gradeData);
const fetchGrades = jest.fn();
thunkActions.grades.useFetchPrevNextGrades.mockReturnValue(fetchGrades);
let out;
describe('usePageButtonsData', () => {
beforeEach(() => {
jest.clearAllMocks();
out = usePageButtonsData();
});
describe('behavior', () => {
it('initializes intl hook', () => {
expect(useIntl).toHaveBeenCalled();
});
it('initializes redux hooks', () => {
expect(selectors.grades.useGradeData).toHaveBeenCalled();
expect(thunkActions.grades.useFetchPrevNextGrades).toHaveBeenCalled();
});
});
describe('output', () => {
describe('prev button entry', () => {
it('is disabled iff prevPage is not provided', () => {
expect(out.prev.disabled).toEqual(false);
selectors.grades.useGradeData.mockReturnValueOnce({
...gradeData,
prevPage: undefined,
});
out = usePageButtonsData();
expect(out.prev.disabled).toEqual(true);
});
it('calls fetch with prevPage on click', () => {
out.prev.onClick();
expect(fetchGrades).toHaveBeenCalledWith(gradeData.prevPage);
});
test('text display', () => {
expect(out.prev.text).toEqual(formatMessage(messages.prevPage));
});
});
describe('next button entry', () => {
it('is disabled iff nextPage is not provided', () => {
expect(out.next.disabled).toEqual(false);
selectors.grades.useGradeData.mockReturnValueOnce({
...gradeData,
nextPage: undefined,
});
out = usePageButtonsData();
expect(out.next.disabled).toEqual(true);
});
it('calls fetch with prevPage on click', () => {
out.next.onClick();
expect(fetchGrades).toHaveBeenCalledWith(gradeData.nextPage);
});
test('text display', () => {
expect(out.next.text).toEqual(formatMessage(messages.nextPage));
});
});
});
});