Skip to content

Commit 5c95740

Browse files
Diegoalbagbartoszherba
authored andcommitted
test: categorynavbar component
1 parent 5b73fda commit 5c95740

File tree

5 files changed

+120
-0
lines changed

5 files changed

+120
-0
lines changed

packages/theme/components/SkeletonLoader/index.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<div
33
:class="componentClass"
44
:style="componentStyle"
5+
data-testid="skeletonLoader"
56
>
67
<slot v-if="!isLoading" />
78
</div>
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import userEvent from '@testing-library/user-event';
2+
import { render } from '~/test-utils';
3+
import CategoryNavbar from '../CategoryNavbar.vue';
4+
import { paginationData, sortByData } from '~/test-utils/mocks/categoryNavbarMock';
5+
import { useUiHelpers, useUiState } from '~/composables';
6+
import useUiHelpersMock from '~/test-utils/mocks/useUiHelpersMock';
7+
import useUiStateMock from '~/test-utils/mocks/useUiState';
8+
9+
jest.mock('~/composables', () => ({
10+
...jest.requireActual('~/composables'),
11+
useUiHelpers: jest.fn(),
12+
useUiState: jest.fn(),
13+
}));
14+
15+
const categoryNavbarProps = { props: { pagination: paginationData, sortBy: sortByData } };
16+
const loadingCategoryNavbarProps = { props: { pagination: paginationData, sortBy: sortByData, isLoading: true } };
17+
18+
describe('CategoryNavbar.vue', () => {
19+
it('Should render Skeleton when loading is true', () => {
20+
const uiStateMock = useUiStateMock();
21+
useUiState.mockReturnValue(uiStateMock);
22+
const { getAllByTestId } = render(CategoryNavbar, loadingCategoryNavbarProps);
23+
24+
const skeletonLoaders = getAllByTestId('skeletonLoader');
25+
26+
skeletonLoaders.forEach((skeletonLoader) => {
27+
expect(skeletonLoader).toBeInTheDocument();
28+
});
29+
});
30+
31+
it('Should render "Filters" button and call "toggleFilterSidebar" when clicked', async () => {
32+
const uiStateMock = useUiStateMock();
33+
useUiState.mockReturnValue(uiStateMock);
34+
const { getByText } = render(CategoryNavbar, categoryNavbarProps);
35+
const button = getByText('Filters');
36+
37+
await userEvent.click(button);
38+
39+
expect(uiStateMock.toggleFilterSidebar).toHaveBeenCalledTimes(1);
40+
});
41+
42+
it('Should render "sort by" select and change selection and select has all expected options based on its data', async () => {
43+
const uiHelperMock = useUiHelpersMock();
44+
useUiHelpers.mockReturnValue(uiHelperMock);
45+
46+
const {
47+
getByRole, getByText, getAllByRole, emitted,
48+
} = render(CategoryNavbar, categoryNavbarProps);
49+
const sortSelect = getByRole('combobox');
50+
const options = getAllByRole('option');
51+
expect(options).toHaveLength(categoryNavbarProps.props.sortBy.options.length);
52+
53+
await userEvent.selectOptions(sortSelect, ['name_ASC']);
54+
expect(getByText('Sort: Name A-Z').value).toBe(sortSelect.value);
55+
expect(emitted().reloadProducts).toHaveProperty('length', 1);
56+
});
57+
58+
it('Should render list view icon and change to "List view" when clicked.', async () => {
59+
const uiStateMock = useUiStateMock();
60+
useUiState.mockReturnValue(uiStateMock);
61+
62+
const { getByLabelText } = render(CategoryNavbar, categoryNavbarProps);
63+
const listViewIcon = getByLabelText(/change to list view/i);
64+
65+
await userEvent.click(listViewIcon);
66+
expect(uiStateMock.changeToCategoryListView).toHaveBeenCalledTimes(1);
67+
});
68+
69+
it('Should render grid view icon and change to "Grid view" when clicked.', async () => {
70+
const uiStateMock = useUiStateMock();
71+
useUiState.mockReturnValue(uiStateMock);
72+
73+
const { getByLabelText } = render(CategoryNavbar, categoryNavbarProps);
74+
const gridViewIcon = getByLabelText(/change to grid view/i);
75+
76+
await userEvent.click(gridViewIcon);
77+
78+
expect(uiStateMock.changeToCategoryGridView).toHaveBeenCalledTimes(1);
79+
});
80+
});
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { AgnosticPagination } from '~/composables/types';
2+
3+
export const paginationData: AgnosticPagination = {
4+
currentPage: 1,
5+
totalPages: 2,
6+
totalItems: 11,
7+
itemsPerPage: 10,
8+
pageOptions: [10, 50, 100],
9+
};
10+
11+
export const sortByData = {
12+
options: [
13+
{
14+
label: 'Sort: Default',
15+
value: '',
16+
},
17+
{
18+
label: 'Sort: Name A-Z',
19+
value: 'name_ASC',
20+
},
21+
{
22+
label: 'Sort: Name Z-A',
23+
value: 'name_DESC',
24+
},
25+
{
26+
label: 'Sort: Price from low to high',
27+
value: 'price_ASC',
28+
},
29+
{
30+
label: 'Sort: Price from high to low',
31+
value: 'price_DESC',
32+
},
33+
],
34+
selected: 'name_DESC',
35+
};

packages/theme/test-utils/mocks/useUiHelpersMock.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export const useUiHelpersMock = (extend = {}) => ({
22
getCatLink: jest.fn((val) => val),
3+
changeSorting: jest.fn(),
34
...extend,
45
});
56

packages/theme/test-utils/mocks/useUiState.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
export const useUiStateMock = (extend = {}) => ({
22
isCartSidebarOpen: false,
3+
changeToCategoryGridView: jest.fn(),
4+
changeToCategoryListView: jest.fn(),
35
toggleCartSidebar: jest.fn(),
6+
toggleFilterSidebar: jest.fn(),
47
...extend,
58
});
69

0 commit comments

Comments
 (0)