Skip to content

Commit 1fff27b

Browse files
feat: tests added to components
1 parent e254d8b commit 1fff27b

6 files changed

Lines changed: 445 additions & 0 deletions

File tree

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { screen } from '@testing-library/react';
2+
import userEvent from '@testing-library/user-event';
3+
import { renderWrapper } from '@src/setupTest';
4+
import MultipleChoiceFilter from './MultipleChoiceFilter';
5+
6+
describe('MultipleChoiceFilter', () => {
7+
const defaultProps = {
8+
filterButtonText: 'Test Filter',
9+
filterChoices: [
10+
{ displayName: 'Option 1', value: 'option1' },
11+
{ displayName: 'Option 2', value: 'option2' },
12+
],
13+
filterValue: [],
14+
setFilter: jest.fn(),
15+
};
16+
17+
const groupedChoices = [
18+
{ displayName: 'Group A Option', value: 'groupA1', groupName: 'Group A' },
19+
{ displayName: 'Group B Option', value: 'groupB1', groupName: 'Group B' },
20+
];
21+
22+
beforeEach(() => {
23+
jest.clearAllMocks();
24+
});
25+
26+
it('renders without crashing', () => {
27+
renderWrapper(<MultipleChoiceFilter {...defaultProps} />);
28+
expect(screen.getByText('Test Filter')).toBeInTheDocument();
29+
});
30+
31+
it('displays filter button text', () => {
32+
renderWrapper(<MultipleChoiceFilter {...defaultProps} filterButtonText="Custom Filter" />);
33+
expect(screen.getByText('Custom Filter')).toBeInTheDocument();
34+
});
35+
36+
it('shows count when items are selected', () => {
37+
renderWrapper(<MultipleChoiceFilter {...defaultProps} filterValue={['option1']} />);
38+
expect(screen.getByText('Test Filter (1)')).toBeInTheDocument();
39+
});
40+
41+
it('opens dropdown menu when clicked', async () => {
42+
const user = userEvent.setup();
43+
renderWrapper(<MultipleChoiceFilter {...defaultProps} />);
44+
const button = screen.getByText('Test Filter');
45+
await user.click(button);
46+
expect(screen.getByText('Option 1')).toBeInTheDocument();
47+
expect(screen.getByText('Option 2')).toBeInTheDocument();
48+
});
49+
50+
it('handles disabled state', () => {
51+
renderWrapper(<MultipleChoiceFilter {...defaultProps} disabled />);
52+
expect(screen.getByText('Test Filter')).toBeInTheDocument();
53+
});
54+
55+
it('displays search input when searchable', async () => {
56+
const user = userEvent.setup();
57+
renderWrapper(<MultipleChoiceFilter {...defaultProps} isSearchable onSearchChange={jest.fn()} />);
58+
const button = screen.getByText('Test Filter');
59+
await user.click(button);
60+
expect(screen.getByRole('textbox')).toBeInTheDocument();
61+
});
62+
63+
it('handles grouped choices', async () => {
64+
const user = userEvent.setup();
65+
renderWrapper(<MultipleChoiceFilter {...defaultProps} filterChoices={groupedChoices} isGrouped />);
66+
const button = screen.getByText('Test Filter');
67+
await user.click(button);
68+
expect(screen.getByText('Group A')).toBeInTheDocument();
69+
expect(screen.getByText('Group B')).toBeInTheDocument();
70+
});
71+
72+
it('calls setFilter when option is selected', async () => {
73+
const user = userEvent.setup();
74+
const mockSetFilter = jest.fn();
75+
renderWrapper(<MultipleChoiceFilter {...defaultProps} setFilter={mockSetFilter} />);
76+
const button = screen.getByText('Test Filter');
77+
await user.click(button);
78+
const option = screen.getByText('Option 1');
79+
await user.click(option);
80+
expect(mockSetFilter).toHaveBeenCalled();
81+
});
82+
});
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { screen } from '@testing-library/react';
2+
import userEvent from '@testing-library/user-event';
3+
import { renderWrapper } from '@src/setupTest';
4+
import OrgFilter from './OrgFilter';
5+
6+
jest.mock('@src/authz-module/data/hooks', () => ({
7+
useOrgs: () => ({
8+
data: {
9+
count: 2,
10+
next: null,
11+
previous: null,
12+
results: [
13+
{ id: 'org1', name: 'Organization 1' },
14+
{ id: 'org2', name: 'Organization 2' },
15+
],
16+
},
17+
}),
18+
}));
19+
20+
describe('OrgFilter', () => {
21+
const defaultProps = {
22+
filterButtonText: 'Organizations',
23+
filterValue: [],
24+
setFilter: jest.fn(),
25+
disabled: false,
26+
};
27+
28+
beforeEach(() => {
29+
jest.clearAllMocks();
30+
});
31+
32+
it('renders without crashing', () => {
33+
renderWrapper(<OrgFilter {...defaultProps} />);
34+
expect(screen.getByText('Organizations')).toBeInTheDocument();
35+
});
36+
37+
it('handles disabled state', () => {
38+
renderWrapper(<OrgFilter {...defaultProps} disabled />);
39+
expect(screen.getByText('Organizations')).toBeInTheDocument();
40+
});
41+
42+
it('displays filter options', () => {
43+
renderWrapper(<OrgFilter {...defaultProps} />);
44+
expect(screen.getByText('Organizations')).toBeInTheDocument();
45+
});
46+
47+
it('handles search input', async () => {
48+
const user = userEvent.setup();
49+
renderWrapper(<OrgFilter {...defaultProps} />);
50+
// Look for search input if it exists
51+
const searchInputs = screen.queryAllByRole('textbox');
52+
if (searchInputs.length > 0) {
53+
await user.type(searchInputs[0], 'test search');
54+
expect(screen.getByText('Organizations')).toBeInTheDocument();
55+
}
56+
});
57+
58+
it('calls setFilter when filter changes', () => {
59+
const mockSetFilter = jest.fn();
60+
renderWrapper(<OrgFilter {...defaultProps} setFilter={mockSetFilter} />);
61+
expect(screen.getByText('Organizations')).toBeInTheDocument();
62+
});
63+
});
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import React from 'react';
2+
import { screen } from '@testing-library/react';
3+
import { renderWrapper } from '@src/setupTest';
4+
import RolesFilter from './RolesFilter';
5+
6+
describe('RolesFilter', () => {
7+
const defaultProps = {
8+
filterButtonText: 'Roles',
9+
filterValue: [],
10+
setFilter: jest.fn(),
11+
disabled: false,
12+
};
13+
14+
beforeEach(() => {
15+
jest.clearAllMocks();
16+
});
17+
18+
it('renders without crashing', () => {
19+
renderWrapper(<RolesFilter {...defaultProps} />);
20+
expect(screen.getByText('Roles')).toBeInTheDocument();
21+
});
22+
23+
it('handles disabled state', () => {
24+
renderWrapper(<RolesFilter {...defaultProps} disabled />);
25+
expect(screen.getByText('Roles')).toBeInTheDocument();
26+
});
27+
28+
it('displays filter button text', () => {
29+
renderWrapper(<RolesFilter {...defaultProps} filterButtonText="Select Roles" />);
30+
expect(screen.getByText('Select Roles')).toBeInTheDocument();
31+
});
32+
33+
it('calls setFilter when filter changes', () => {
34+
const mockSetFilter = jest.fn();
35+
renderWrapper(<RolesFilter {...defaultProps} setFilter={mockSetFilter} />);
36+
expect(screen.getByText('Roles')).toBeInTheDocument();
37+
});
38+
});
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { screen } from '@testing-library/react';
2+
import userEvent from '@testing-library/user-event';
3+
import { renderWrapper } from '@src/setupTest';
4+
import ScopesFilter from './ScopesFilter';
5+
6+
jest.mock('@src/authz-module/data/hooks', () => ({
7+
useScopes: () => ({
8+
data: {
9+
scopes: [
10+
{
11+
key: 'course:123',
12+
name: 'Test Course',
13+
organization: { name: 'Test Org' },
14+
},
15+
{
16+
key: 'library:456',
17+
name: 'Test Library',
18+
organization: { name: 'Another Org' },
19+
},
20+
],
21+
},
22+
}),
23+
}));
24+
25+
describe('ScopesFilter', () => {
26+
const defaultProps = {
27+
filterButtonText: 'Scopes',
28+
filterValue: [],
29+
setFilter: jest.fn(),
30+
disabled: false,
31+
};
32+
33+
beforeEach(() => {
34+
jest.clearAllMocks();
35+
});
36+
37+
it('renders without crashing', () => {
38+
renderWrapper(<ScopesFilter {...defaultProps} />);
39+
expect(screen.getByText('Scopes')).toBeInTheDocument();
40+
});
41+
42+
it('handles disabled state', () => {
43+
renderWrapper(<ScopesFilter {...defaultProps} disabled />);
44+
expect(screen.getByText('Scopes')).toBeInTheDocument();
45+
});
46+
47+
it('displays filter button text', () => {
48+
renderWrapper(<ScopesFilter {...defaultProps} filterButtonText="Select Scopes" />);
49+
expect(screen.getByText('Select Scopes')).toBeInTheDocument();
50+
});
51+
52+
it('handles search input', async () => {
53+
const user = userEvent.setup();
54+
renderWrapper(<ScopesFilter {...defaultProps} />);
55+
const searchInputs = screen.queryAllByRole('textbox');
56+
if (searchInputs.length > 0) {
57+
await user.type(searchInputs[0], 'test search');
58+
expect(screen.getByText('Scopes')).toBeInTheDocument();
59+
}
60+
});
61+
62+
it('calls setFilter when filter changes', () => {
63+
const mockSetFilter = jest.fn();
64+
renderWrapper(<ScopesFilter {...defaultProps} setFilter={mockSetFilter} />);
65+
expect(screen.getByText('Scopes')).toBeInTheDocument();
66+
});
67+
});
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { screen } from '@testing-library/react';
2+
import userEvent from '@testing-library/user-event';
3+
import { renderWrapper } from '@src/setupTest';
4+
import SearchFilter from './SearchFilter';
5+
6+
describe('SearchFilter', () => {
7+
const defaultProps = {
8+
filterValue: '',
9+
setFilter: jest.fn(),
10+
placeholder: 'Search...',
11+
};
12+
13+
beforeEach(() => {
14+
jest.clearAllMocks();
15+
});
16+
17+
it('renders without crashing', () => {
18+
renderWrapper(<SearchFilter {...defaultProps} />);
19+
expect(screen.getByRole('textbox')).toBeInTheDocument();
20+
});
21+
22+
it('displays placeholder text', () => {
23+
renderWrapper(<SearchFilter {...defaultProps} placeholder="Search users..." />);
24+
expect(screen.getByPlaceholderText('Search users...')).toBeInTheDocument();
25+
});
26+
27+
it('displays current filter value', () => {
28+
renderWrapper(<SearchFilter {...defaultProps} filterValue="test query" />);
29+
expect(screen.getByDisplayValue('test query')).toBeInTheDocument();
30+
});
31+
32+
it('calls setFilter when input changes', async () => {
33+
const user = userEvent.setup();
34+
const mockSetFilter = jest.fn();
35+
renderWrapper(<SearchFilter {...defaultProps} setFilter={mockSetFilter} />);
36+
const input = screen.getByRole('textbox');
37+
await user.type(input, 'search text');
38+
expect(mockSetFilter).toHaveBeenCalled();
39+
});
40+
41+
it('handles empty filter value', () => {
42+
renderWrapper(<SearchFilter {...defaultProps} filterValue="" />);
43+
expect(screen.getByRole('textbox')).toHaveValue('');
44+
});
45+
46+
it('handles undefined filter value', () => {
47+
renderWrapper(<SearchFilter {...defaultProps} filterValue={undefined as any} />);
48+
expect(screen.getByRole('textbox')).toHaveValue('');
49+
});
50+
});

0 commit comments

Comments
 (0)