Skip to content

Commit 3b13e69

Browse files
committed
test: improve test coverage
1 parent 9e5a880 commit 3b13e69

7 files changed

Lines changed: 776 additions & 1 deletion

src/authz-module/data/hooks.test.tsx

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
44
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
55
import {
66
useLibrary, usePermissionsByRole, useTeamMembers, useAssignTeamMembersRole, useRevokeUserRoles,
7+
useValidateUsers,
78
} from './hooks';
89

910
jest.mock('@edx/frontend-platform/auth', () => ({
@@ -241,6 +242,54 @@ describe('usePermissionsByRole', () => {
241242
});
242243
});
243244

245+
describe('useValidateUsers', () => {
246+
beforeEach(() => {
247+
jest.clearAllMocks();
248+
});
249+
250+
it('successfully validates users', async () => {
251+
const mockResponse = {
252+
validUsers: ['jdoe'],
253+
invalidUsers: ['unknown_user'],
254+
};
255+
256+
getAuthenticatedHttpClient.mockReturnValue({
257+
post: jest.fn().mockResolvedValue({ data: mockResponse }),
258+
});
259+
260+
const { result } = renderHook(() => useValidateUsers(), {
261+
wrapper: createWrapper(),
262+
});
263+
264+
await act(async () => {
265+
result.current.mutate({ data: { users: ['jdoe', 'unknown_user'] } });
266+
});
267+
268+
await waitFor(() => expect(result.current.isSuccess).toBe(true));
269+
270+
expect(getAuthenticatedHttpClient).toHaveBeenCalled();
271+
expect(result.current.data).toEqual(mockResponse);
272+
});
273+
274+
it('handles error when validation fails', async () => {
275+
getAuthenticatedHttpClient.mockReturnValue({
276+
post: jest.fn().mockRejectedValue(new Error('Validation failed')),
277+
});
278+
279+
const { result } = renderHook(() => useValidateUsers(), {
280+
wrapper: createWrapper(),
281+
});
282+
283+
await act(async () => {
284+
result.current.mutate({ data: { users: ['jdoe'] } });
285+
});
286+
287+
await waitFor(() => expect(result.current.isError).toBe(true));
288+
289+
expect(result.current.error).toEqual(new Error('Validation failed'));
290+
});
291+
});
292+
244293
describe('useRevokeUserRoles', () => {
245294
beforeEach(() => {
246295
jest.clearAllMocks();

src/authz-module/libraries-manager/LibrariesTeamManager.test.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@ import userEvent from '@testing-library/user-event';
33
import { renderWrapper } from '@src/setupTest';
44
import { initializeMockApp } from '@edx/frontend-platform/testing';
55
import { useLibrary, useUpdateLibrary } from '@src/authz-module/data/hooks';
6+
import { useNavigate, useLocation } from 'react-router-dom';
67
import { useLibraryAuthZ } from './context';
78
import LibrariesTeamManager from './LibrariesTeamManager';
89
import { ToastManagerProvider } from './ToastManagerContext';
910
import { CONTENT_LIBRARY_PERMISSIONS } from './constants';
1011

12+
jest.mock('react-router-dom', () => ({
13+
...jest.requireActual('react-router-dom'),
14+
useNavigate: jest.fn(),
15+
useLocation: jest.fn().mockReturnValue({ hash: '' }),
16+
}));
17+
1118
jest.mock('./context', () => {
1219
const actual = jest.requireActual('./context');
1320
return {
@@ -53,6 +60,7 @@ describe('LibrariesTeamManager', () => {
5360
allowPublicRead: false,
5461
};
5562
const mutate = jest.fn();
63+
const mockNavigate = jest.fn();
5664
const libraryAuthZContext = {
5765
libraryId: libraryData.id,
5866
libraryName: libraryData.title,
@@ -90,6 +98,8 @@ describe('LibrariesTeamManager', () => {
9098
mutate,
9199
isPending: false,
92100
});
101+
(useNavigate as jest.Mock).mockReturnValue(mockNavigate);
102+
(useLocation as jest.Mock).mockReturnValue({ hash: '' });
93103
});
94104

95105
it('renders tabs and layout content correctly', () => {
@@ -136,7 +146,7 @@ describe('LibrariesTeamManager', () => {
136146
const permissionsTab = await screen.findByRole('tab', { name: /permissions/i });
137147
await user.click(permissionsTab);
138148

139-
const tablePermissionMatrix = await screen.getByRole('table');
149+
const tablePermissionMatrix = screen.getByRole('table');
140150
const matrixScope = within(tablePermissionMatrix);
141151

142152
expect(matrixScope.getByText('Library')).toBeInTheDocument();
@@ -152,4 +162,11 @@ describe('LibrariesTeamManager', () => {
152162
// TODO: Update expected URL when dedicated Manage Access page is created
153163
expect(navLink).toHaveAttribute('href', '/authz/libraries/lib-001');
154164
});
165+
166+
it('navigates to assign role wizard when "Assign Role" button is clicked', async () => {
167+
const user = userEvent.setup();
168+
renderTeamManager();
169+
await user.click(screen.getByRole('button', { name: 'Assign Role' }));
170+
expect(mockNavigate).toHaveBeenCalledWith('/authz/assign-role?scope=lib-001');
171+
});
155172
});

0 commit comments

Comments
 (0)