import { CourseAuthoringProvider } from '@src/CourseAuthoringContext';
import {
initializeMocks, waitFor, render, screen,
} from '../testUtils';
import SubsectionUnitRedirect from './SubsectionUnitRedirect';
import { getXBlockApiUrl } from '../course-outline/data/api';
let axiosMock;
const courseId = '123';
const subsectionId = 'block-v1+edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5';
const path = '/subsection/:subsectionId';
const expectedCourseItemDataWithUnit = {
childInfo: {
children: [
{
id: 'unitId',
},
],
},
};
const expectedCourseItemDataWithoutUnit = [{
childInfo: {
children: [],
},
}];
const renderSubsectionRedirectPage = () => {
render(
,
{
path,
routerProps: {
initialEntries: [`/subsection/${subsectionId}`],
},
},
);
};
jest.mock('react-router-dom', () => {
const originalModule = jest.requireActual('react-router-dom');
return {
...originalModule,
Navigate: ({ to }: { to: string }) =>
Mocked Navigate
,
};
});
describe('SubsectionUnitRedirect', () => {
beforeEach(() => {
const mocks = initializeMocks();
axiosMock = mocks.axiosMock;
});
it('navigates to first unit if available', async () => {
axiosMock
.onGet(getXBlockApiUrl(subsectionId))
.reply(200, expectedCourseItemDataWithUnit);
renderSubsectionRedirectPage();
await waitFor(() => {
// Confirm redirection by checking the final URL
const mockNavigate = screen.getByTestId('mock-navigate');
expect(mockNavigate).toBeInTheDocument();
expect(mockNavigate).toHaveAttribute('data-to', `/course/${courseId}/container/unitId`);
});
});
it('navigates to course page with show param if no units present', async () => {
axiosMock
.onGet(getXBlockApiUrl(subsectionId))
.reply(200, expectedCourseItemDataWithoutUnit);
renderSubsectionRedirectPage();
await waitFor(() => {
// Confirm redirection by checking the final URL
const mockNavigate = screen.getByTestId('mock-navigate');
expect(mockNavigate).toBeInTheDocument();
expect(mockNavigate).toHaveAttribute('data-to', `/course/${courseId}?show=${encodeURIComponent(subsectionId)}`);
});
});
});