mirror of
https://github.com/Dispatcharr/Dispatcharr.git
synced 2026-01-23 02:35:14 +00:00
commit df18a89d0562edc8fd8fb5bc4cac702aefb5272c
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Sat Jan 10 19:18:23 2026 -0800
Updated tests
commit 90240344b89717fbad0e16fe209dbf00c567b1a8
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Sun Jan 4 03:18:41 2026 -0800
Updated tests
commit 525b7cb32bc8d235613706d6795795a0177ea24b
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Sun Jan 4 03:18:31 2026 -0800
Extracted component and util logic
commit e54ea2c3173c0ce3cfb0a2d70d76fdd0a66accc8
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Wed Dec 31 11:55:40 2025 -0800
Updated tests
commit 5cbe164cb9818d8eab607af037da5faee2c1556f
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Wed Dec 31 11:55:14 2025 -0800
Minor changes
Exporting UiSettingsForm as default
Reverted admin level type check
commit f9ab0d2a06091a2eed3ee6f34268c81bfd746f1e
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Tue Dec 30 23:31:29 2025 -0800
Extracted component and util logic
commit a705a4db4a32d0851d087a984111837a0a83f722
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Sun Dec 28 00:47:29 2025 -0800
Updated tests
commit a72c6720a3980d0f279edf050b6b51eaae11cdbd
Merge: e8dcab6f 43525ca3
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Sun Dec 28 00:04:24 2025 -0800
Merge branch 'enhancement/component-cleanup' into test/component-cleanup
commit e8dcab6f832570cb986f114cfa574db4994b3aab
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Sat Dec 27 22:35:59 2025 -0800
Updated tests
commit 0fd230503844fba0c418ab0a03c46dc878697a55
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Sat Dec 27 22:35:53 2025 -0800
Added plugins store
commit d987f2de72272f24e26b1ed5bc04bb5c83033868
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Sat Dec 27 22:35:43 2025 -0800
Extracted component and util logic
commit 5a3138370a468a99c9f1ed0a36709a173656d809
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Wed Dec 24 23:13:07 2025 -0800
Lazy-loading button modals
commit ac6945b5b55e0e16d050d4412a20c82f19250c4b
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Wed Dec 24 22:41:51 2025 -0800
Extracted notification util
commit befe159fc06b67ee415f7498b5400fee0dc82528
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Wed Dec 24 22:28:12 2025 -0800
Extracted component and util logic
commit ec10a3a4200a0c94cae29691a9fe06e5c4317bb7
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Wed Dec 24 22:22:09 2025 -0800
Updated tests
commit c1c7214c8589c0ce7645ea24418d9dd978ac8c1f
Merge: eba6dce7 9c9cbab9
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Tue Dec 23 12:41:25 2025 -0800
Merge branch 'enhancement/component-cleanup' into test/component-cleanup
commit eba6dce786495e352d4696030500db41d028036e
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Sun Dec 21 10:12:19 2025 -0800
Updated style props
commit 2024b0b267b849a5f100e5543b9188e8ad6dd3d9
Merge: b3700956 1029eb5b
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Sun Dec 21 09:27:21 2025 -0800
Merge branch 'enhancement/component-cleanup' into test/component-cleanup
commit b3700956a4c2f473f1e977826f9537d27ea018ae
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Thu Dec 18 07:45:36 2025 -0800
Reverted Channels change
commit 137cbb02473b7f2f41488601e3b64e5ff45ac656
Merge: 644ed001 2a0df81c
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Wed Dec 17 13:36:05 2025 -0800
Merge branch 'enhancement/component-cleanup' into test/component-cleanup
commit 644ed00196c41eaa44df1b98236b7e5cc3124d82
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Wed Dec 17 13:29:13 2025 -0800
Updated tests
commit c62d1bd0534aa19be99b8f87232ba872420111a0
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Tue Dec 16 14:12:31 2025 -0800
Updated tests
commit 0cc0ee31d5ad84c59d8eba9fc4424f118f5e0ee2
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Tue Dec 16 13:44:55 2025 -0800
Extracted component and util logic
commit 25d1b112af250b5ccebb1006511bff8e4387fc76
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Tue Dec 16 13:44:11 2025 -0800
Added correct import for Text component
commit d8a04c6c09edf158220d3073939c9fb60069745c
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Tue Dec 16 13:43:55 2025 -0800
Fixed component syntax
commit 59e35d3a4d0da8ed8476560cedacadf76162ea43
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Tue Dec 16 13:43:39 2025 -0800
Fixed cache_url fallback
commit d2a170d2efd3d2b0e6078c9eebeb8dcea237be3b
Merge: b8f7e435 6c1b0f9a
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Tue Dec 16 12:00:45 2025 -0800
Merge branch 'enhancement/component-cleanup' into test/component-cleanup
commit b8f7e4358a23f2e3a902929b57ab7a7d115241c5
Merge: 5b12c68a d97f0c90
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Mon Dec 15 07:42:06 2025 -0800
Merge branch 'enhancement/component-cleanup' into test/component-cleanup
commit 5b12c68ab8ce429adc8d1355632aa411007d365b
Merge: eff58126 c63cb75b
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Mon Dec 8 16:56:14 2025 -0800
Merge branch 'enhancement/unit-tests' into stage
commit eff58126fb6aba4ebe9a0c67eee65773bffb8ae9
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Mon Dec 8 16:49:43 2025 -0800
Update .gitignore
commit c63cb75b8cad204d48a392a28d8a5bdf8c270496
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Mon Dec 8 16:28:03 2025 -0800
Added unit tests for pages
commit 75306a6181ddeb2eaeb306387ba2b44c7fcfd5e3
Author: Nick Sandstrom <32273437+nick4810@users.noreply.github.com>
Date: Mon Dec 8 16:27:19 2025 -0800
Added Actions workflow
468 lines
13 KiB
JavaScript
468 lines
13 KiB
JavaScript
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
import VODsPage from '../VODs';
|
|
import useVODStore from '../../store/useVODStore';
|
|
import {
|
|
filterCategoriesToEnabled,
|
|
getCategoryOptions,
|
|
} from '../../utils/pages/VODsUtils.js';
|
|
|
|
vi.mock('../../store/useVODStore');
|
|
|
|
vi.mock('../../components/SeriesModal', () => ({
|
|
default: ({ opened, series, onClose }) =>
|
|
opened ? (
|
|
<div data-testid="series-modal">
|
|
<div data-testid="series-name">{series?.name}</div>
|
|
<button onClick={onClose}>Close</button>
|
|
</div>
|
|
) : null
|
|
}));
|
|
vi.mock('../../components/VODModal', () => ({
|
|
default: ({ opened, vod, onClose }) =>
|
|
opened ? (
|
|
<div data-testid="vod-modal">
|
|
<div data-testid="vod-name">{vod?.name}</div>
|
|
<button onClick={onClose}>Close</button>
|
|
</div>
|
|
) : null
|
|
}));
|
|
vi.mock('../../components/cards/VODCard', () => ({
|
|
default: ({ vod, onClick }) => (
|
|
<div data-testid="vod-card" onClick={() => onClick(vod)}>
|
|
<div>{vod.name}</div>
|
|
</div>
|
|
)
|
|
}));
|
|
vi.mock('../../components/cards/SeriesCard', () => ({
|
|
default: ({ series, onClick }) => (
|
|
<div data-testid="series-card" onClick={() => onClick(series)}>
|
|
<div>{series.name}</div>
|
|
</div>
|
|
)
|
|
}));
|
|
|
|
vi.mock('@mantine/core', () => {
|
|
const gridComponent = ({ children, ...props }) => <div {...props}>{children}</div>;
|
|
gridComponent.Col = ({ children, ...props }) => <div {...props}>{children}</div>;
|
|
|
|
return {
|
|
Box: ({ children, ...props }) => <div {...props}>{children}</div>,
|
|
Stack: ({ children, ...props }) => <div {...props}>{children}</div>,
|
|
Group: ({ children, ...props }) => <div {...props}>{children}</div>,
|
|
Flex: ({ children, ...props }) => <div {...props}>{children}</div>,
|
|
Title: ({ children, ...props }) => <h2 {...props}>{children}</h2>,
|
|
TextInput: ({ value, onChange, placeholder, icon }) => (
|
|
<div>
|
|
{icon}
|
|
<input
|
|
type="text"
|
|
value={value}
|
|
onChange={onChange}
|
|
placeholder={placeholder}
|
|
/>
|
|
</div>
|
|
),
|
|
Select: ({ value, onChange, data, label, placeholder }) => (
|
|
<div>
|
|
{label && <label>{label}</label>}
|
|
<select
|
|
value={value}
|
|
onChange={(e) => onChange?.(e.target.value)}
|
|
aria-label={placeholder || label}
|
|
>
|
|
{data?.map((option) => (
|
|
<option key={option.value} value={option.value}>
|
|
{option.label}
|
|
</option>
|
|
))}
|
|
</select>
|
|
</div>
|
|
),
|
|
SegmentedControl: ({ value, onChange, data }) => (
|
|
<div>
|
|
{data.map((item) => (
|
|
<button
|
|
key={item.value}
|
|
onClick={() => onChange(item.value)}
|
|
data-active={value === item.value}
|
|
>
|
|
{item.label}
|
|
</button>
|
|
))}
|
|
</div>
|
|
),
|
|
Pagination: ({ page, onChange, total }) => (
|
|
<div data-testid="pagination">
|
|
<button onClick={() => onChange(page - 1)} disabled={page === 1}>
|
|
Prev
|
|
</button>
|
|
<span>{page} of {total}</span>
|
|
<button onClick={() => onChange(page + 1)} disabled={page === total}>
|
|
Next
|
|
</button>
|
|
</div>
|
|
),
|
|
Grid: gridComponent,
|
|
GridCol: gridComponent.Col,
|
|
Loader: () => <div data-testid="loader">Loading...</div>,
|
|
LoadingOverlay: ({ visible }) =>
|
|
visible ? <div data-testid="loading-overlay">Loading...</div> : null,
|
|
};
|
|
});
|
|
|
|
vi.mock('../../utils/pages/VODsUtils.js', () => {
|
|
return {
|
|
filterCategoriesToEnabled: vi.fn(),
|
|
getCategoryOptions: vi.fn(),
|
|
};
|
|
});
|
|
|
|
describe('VODsPage', () => {
|
|
const mockFetchContent = vi.fn();
|
|
const mockFetchCategories = vi.fn();
|
|
const mockSetFilters = vi.fn();
|
|
const mockSetPage = vi.fn();
|
|
const mockSetPageSize = vi.fn();
|
|
|
|
const defaultStoreState = {
|
|
currentPageContent: [],
|
|
categories: {},
|
|
filters: { type: 'all', search: '', category: '' },
|
|
currentPage: 1,
|
|
totalCount: 0,
|
|
pageSize: 12,
|
|
setFilters: mockSetFilters,
|
|
setPage: mockSetPage,
|
|
setPageSize: mockSetPageSize,
|
|
fetchContent: mockFetchContent,
|
|
fetchCategories: mockFetchCategories,
|
|
};
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
mockFetchContent.mockResolvedValue();
|
|
mockFetchCategories.mockResolvedValue();
|
|
filterCategoriesToEnabled.mockReturnValue({});
|
|
getCategoryOptions.mockReturnValue([]);
|
|
useVODStore.mockImplementation((selector) => selector(defaultStoreState));
|
|
localStorage.clear();
|
|
});
|
|
|
|
it('renders the page title', async () => {
|
|
render(<VODsPage />);
|
|
await screen.findByText('Video on Demand');
|
|
});
|
|
|
|
it('fetches categories on mount', async () => {
|
|
render(<VODsPage />);
|
|
await waitFor(() => {
|
|
expect(mockFetchCategories).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|
|
|
|
it('fetches content on mount', async () => {
|
|
render(<VODsPage />);
|
|
await waitFor(() => {
|
|
expect(mockFetchContent).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|
|
|
|
it('displays loader during initial load', async () => {
|
|
render(<VODsPage />);
|
|
await screen.findByTestId('loader');
|
|
});
|
|
|
|
it('displays content after loading', async () => {
|
|
const stateWithContent = {
|
|
...defaultStoreState,
|
|
currentPageContent: [
|
|
{ id: 1, name: 'Movie 1', contentType: 'movie' },
|
|
{ id: 2, name: 'Series 1', contentType: 'series' },
|
|
],
|
|
};
|
|
useVODStore.mockImplementation((selector) => selector(stateWithContent));
|
|
|
|
render(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByText('Movie 1')).toBeInTheDocument();
|
|
expect(screen.getByText('Series 1')).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it('renders VOD cards for movies', async () => {
|
|
const stateWithMovies = {
|
|
...defaultStoreState,
|
|
currentPageContent: [{ id: 1, name: 'Movie 1', contentType: 'movie' }],
|
|
};
|
|
useVODStore.mockImplementation((selector) => selector(stateWithMovies));
|
|
|
|
render(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByTestId('vod-card')).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it('renders series cards for series', async () => {
|
|
const stateWithSeries = {
|
|
...defaultStoreState,
|
|
currentPageContent: [
|
|
{ id: 1, name: 'Series 1', contentType: 'series' },
|
|
],
|
|
};
|
|
useVODStore.mockImplementation((selector) => selector(stateWithSeries));
|
|
|
|
render(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByTestId('series-card')).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it('opens VOD modal when VOD card is clicked', async () => {
|
|
const stateWithMovies = {
|
|
...defaultStoreState,
|
|
currentPageContent: [
|
|
{ id: 1, name: 'Test Movie', contentType: 'movie' },
|
|
],
|
|
};
|
|
useVODStore.mockImplementation((selector) => selector(stateWithMovies));
|
|
|
|
render(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
fireEvent.click(screen.getByTestId('vod-card'));
|
|
});
|
|
|
|
expect(screen.getByTestId('vod-modal')).toBeInTheDocument();
|
|
expect(screen.getByTestId('vod-name')).toHaveTextContent('Test Movie');
|
|
});
|
|
|
|
it('opens series modal when series card is clicked', async () => {
|
|
const stateWithSeries = {
|
|
...defaultStoreState,
|
|
currentPageContent: [
|
|
{ id: 1, name: 'Test Series', contentType: 'series' },
|
|
],
|
|
};
|
|
useVODStore.mockImplementation((selector) => selector(stateWithSeries));
|
|
|
|
render(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
fireEvent.click(screen.getByTestId('series-card'));
|
|
});
|
|
|
|
expect(screen.getByTestId('series-modal')).toBeInTheDocument();
|
|
expect(screen.getByTestId('series-name')).toHaveTextContent('Test Series');
|
|
});
|
|
|
|
it('closes VOD modal when close button is clicked', async () => {
|
|
const stateWithMovies = {
|
|
...defaultStoreState,
|
|
currentPageContent: [
|
|
{ id: 1, name: 'Test Movie', contentType: 'movie' },
|
|
],
|
|
};
|
|
useVODStore.mockImplementation((selector) => selector(stateWithMovies));
|
|
|
|
render(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
fireEvent.click(screen.getByTestId('vod-card'));
|
|
});
|
|
|
|
fireEvent.click(screen.getByText('Close'));
|
|
|
|
expect(screen.queryByTestId('vod-modal')).not.toBeInTheDocument();
|
|
});
|
|
|
|
it('closes series modal when close button is clicked', async () => {
|
|
const stateWithSeries = {
|
|
...defaultStoreState,
|
|
currentPageContent: [
|
|
{ id: 1, name: 'Test Series', contentType: 'series' },
|
|
],
|
|
};
|
|
useVODStore.mockImplementation((selector) => selector(stateWithSeries));
|
|
|
|
render(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
fireEvent.click(screen.getByTestId('series-card'));
|
|
});
|
|
|
|
fireEvent.click(screen.getByText('Close'));
|
|
|
|
expect(screen.queryByTestId('series-modal')).not.toBeInTheDocument();
|
|
});
|
|
|
|
it('updates filters when search input changes', async () => {
|
|
render(<VODsPage />);
|
|
|
|
const searchInput = screen.getByPlaceholderText('Search VODs...');
|
|
fireEvent.change(searchInput, { target: { value: 'test search' } });
|
|
|
|
await waitFor(() => {
|
|
expect(mockSetFilters).toHaveBeenCalledWith({ search: 'test search' });
|
|
});
|
|
});
|
|
|
|
it('updates filters and resets page when type changes', async () => {
|
|
render(<VODsPage />);
|
|
|
|
const moviesButton = screen.getByText('Movies');
|
|
fireEvent.click(moviesButton);
|
|
|
|
await waitFor(() => {
|
|
expect(mockSetFilters).toHaveBeenCalledWith({
|
|
type: 'movies',
|
|
category: '',
|
|
});
|
|
expect(mockSetPage).toHaveBeenCalledWith(1);
|
|
});
|
|
});
|
|
|
|
it('updates filters and resets page when category changes', async () => {
|
|
getCategoryOptions.mockReturnValue([
|
|
{ value: 'action', label: 'Action' },
|
|
]);
|
|
|
|
render(<VODsPage />);
|
|
|
|
const categorySelect = screen.getByLabelText('Category');
|
|
fireEvent.change(categorySelect, { target: { value: 'action' } });
|
|
|
|
await waitFor(() => {
|
|
expect(mockSetFilters).toHaveBeenCalledWith({ category: 'action' });
|
|
expect(mockSetPage).toHaveBeenCalledWith(1);
|
|
});
|
|
});
|
|
|
|
it('updates page size and saves to localStorage', async () => {
|
|
render(<VODsPage />);
|
|
|
|
const pageSizeSelect = screen.getByLabelText('Page Size');
|
|
fireEvent.change(pageSizeSelect, { target: { value: '24' } });
|
|
|
|
await waitFor(() => {
|
|
expect(mockSetPageSize).toHaveBeenCalledWith(24);
|
|
expect(localStorage.getItem('vodsPageSize')).toBe('24');
|
|
});
|
|
});
|
|
|
|
it('loads page size from localStorage on mount', async () => {
|
|
localStorage.setItem('vodsPageSize', '48');
|
|
|
|
render(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
expect(mockSetPageSize).toHaveBeenCalledWith(48);
|
|
});
|
|
});
|
|
|
|
it('displays pagination when total pages > 1', async () => {
|
|
const stateWithPagination = {
|
|
...defaultStoreState,
|
|
currentPageContent: [{ id: 1, name: 'Movie 1', contentType: 'movie' }],
|
|
totalCount: 25,
|
|
pageSize: 12,
|
|
};
|
|
useVODStore.mockImplementation((selector) =>
|
|
selector(stateWithPagination)
|
|
);
|
|
|
|
render(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByTestId('pagination')).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it('does not display pagination when total pages <= 1', async () => {
|
|
const stateNoPagination = {
|
|
...defaultStoreState,
|
|
currentPageContent: [{ id: 1, name: 'Movie 1', contentType: 'movie' }],
|
|
totalCount: 5,
|
|
pageSize: 12,
|
|
};
|
|
useVODStore.mockImplementation((selector) => selector(stateNoPagination));
|
|
|
|
render(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
expect(screen.queryByTestId('pagination')).not.toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it('changes page when pagination is clicked', async () => {
|
|
const stateWithPagination = {
|
|
...defaultStoreState,
|
|
currentPageContent: [{ id: 1, name: 'Movie 1', contentType: 'movie' }],
|
|
totalCount: 25,
|
|
pageSize: 12,
|
|
currentPage: 1,
|
|
};
|
|
useVODStore.mockImplementation((selector) =>
|
|
selector(stateWithPagination)
|
|
);
|
|
|
|
render(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
fireEvent.click(screen.getByText('Next'));
|
|
});
|
|
|
|
expect(mockSetPage).toHaveBeenCalledWith(2);
|
|
});
|
|
|
|
it('refetches content when filters change', async () => {
|
|
const { rerender } = render(<VODsPage />);
|
|
|
|
const updatedState = {
|
|
...defaultStoreState,
|
|
filters: { type: 'movies', search: '', category: '' },
|
|
};
|
|
useVODStore.mockImplementation((selector) => selector(updatedState));
|
|
|
|
rerender(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
expect(mockFetchContent).toHaveBeenCalledTimes(2);
|
|
});
|
|
});
|
|
|
|
it('refetches content when page changes', async () => {
|
|
const { rerender } = render(<VODsPage />);
|
|
|
|
const updatedState = {
|
|
...defaultStoreState,
|
|
currentPage: 2,
|
|
};
|
|
useVODStore.mockImplementation((selector) => selector(updatedState));
|
|
|
|
rerender(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
expect(mockFetchContent).toHaveBeenCalledTimes(2);
|
|
});
|
|
});
|
|
|
|
it('refetches content when page size changes', async () => {
|
|
const { rerender } = render(<VODsPage />);
|
|
|
|
const updatedState = {
|
|
...defaultStoreState,
|
|
pageSize: 24,
|
|
};
|
|
useVODStore.mockImplementation((selector) => selector(updatedState));
|
|
|
|
rerender(<VODsPage />);
|
|
|
|
await waitFor(() => {
|
|
expect(mockFetchContent).toHaveBeenCalledTimes(2);
|
|
});
|
|
});
|
|
});
|