import { render, screen } from '@testing-library/react';
import { useIsCollapsed } from './hooks';
import CourseList from '.';
jest.mock('./hooks', () => ({
useIsCollapsed: jest.fn(),
}));
jest.mock('containers/CourseCard', () => jest.fn(() =>
CourseCard
));
jest.mock('containers/CourseFilterControls', () => ({
ActiveCourseFilters: jest.fn(() => ActiveCourseFilters
),
}));
describe('CourseList', () => {
const defaultCourseListData = {
filterOptions: {},
numPages: 1,
setPageNumber: jest.fn().mockName('setPageNumber'),
showFilters: false,
visibleList: [],
};
useIsCollapsed.mockReturnValue(false);
const renderList = (courseListData = defaultCourseListData) => (
render()
);
describe('no courses or filters', () => {
it('should not render related components', () => {
renderList();
const filterControls = screen.queryByText('ActiveCourseFilters');
const courseCard = screen.queryByText('CourseCard');
const prevButton = screen.queryByRole('button', { name: 'Previous' });
expect(filterControls).toBeNull();
expect(courseCard).toBeNull();
expect(prevButton).toBeNull();
});
});
describe('with filters', () => {
it('should render filter component', () => {
renderList({
...defaultCourseListData,
showFilters: true,
});
const filterControls = screen.getByText('ActiveCourseFilters');
expect(filterControls).toBeInTheDocument();
});
});
describe('with multiple courses and pages', () => {
it('render Course Cards and pagination', () => {
const visibleList = [{ cardId: 'foo' }, { cardId: 'bar' }, { cardId: 'baz' }];
const numPages = 3;
renderList({
...defaultCourseListData,
visibleList,
numPages,
});
const courseCards = screen.getAllByText('CourseCard');
expect(courseCards.length).toEqual(visibleList.length);
const pageButtons = screen.getAllByRole('button', { name: /^Page/i });
expect(pageButtons.length).toBe(numPages);
});
});
describe('collapsed with multiple courses and pages', () => {
it('should render correct components', () => {
const visibleList = [{ cardId: 'foo' }, { cardId: 'bar' }, { cardId: 'baz' }];
useIsCollapsed.mockReturnValueOnce(true);
renderList({
...defaultCourseListData,
visibleList,
numPages: 3,
showFilters: true,
});
const courseCards = screen.getAllByText('CourseCard');
expect(courseCards.length).toEqual(visibleList.length);
const reducedPagination = screen.getByRole('button', { name: '1 of 3' });
expect(reducedPagination).toBeInTheDocument();
});
});
});