forked from openedx/frontend-app-admin-console
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcontext.test.tsx
More file actions
128 lines (112 loc) · 3.83 KB
/
context.test.tsx
File metadata and controls
128 lines (112 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import { screen } from '@testing-library/react';
import { useParams } from 'react-router-dom';
import { useValidateUserPermissions } from '@src/data/hooks';
import { renderWrapper } from '@src/setupTest';
import { LibraryAuthZProvider, useLibraryAuthZ } from './context';
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
useParams: jest.fn(),
}));
jest.mock('@src/data/hooks', () => ({
useValidateUserPermissions: jest.fn(),
}));
jest.mock('@src/authz-module/data/hooks', () => ({
usePermissionsByRole: jest.fn().mockReturnValue({
data: [
{
role: 'library_author',
permissions: [
'view_library_team',
'edit_library',
],
user_count: 12,
},
],
}),
}));
const TestComponent = () => {
const context = useLibraryAuthZ();
return (
<div>
<div data-testid="username">{context.username}</div>
<div data-testid="libraryId">{context.libraryId}</div>
<div data-testid="canManageTeam">{context.canManageTeam ? 'true' : 'false'}</div>
<div data-testid="roles">{Array.isArray(context.roles) ? context.roles.length : 'undefined'}</div>
<div data-testid="permissions">{Array.isArray(context.permissions) ? context.permissions.length : 'undefined'}</div>
<div data-testid="resources">{Array.isArray(context.resources) ? context.resources.length : 'undefined'}</div>
</div>
);
};
describe('LibraryAuthZProvider', () => {
beforeEach(() => {
jest.clearAllMocks();
(useParams as jest.Mock).mockReturnValue({ libraryId: 'lib123' });
});
it('provides the correct context values to consumers', () => {
(useValidateUserPermissions as jest.Mock).mockReturnValue({
data: [
{ allowed: true }, // canViewTeam
{ allowed: true }, // canManageTeam
],
});
renderWrapper(
<LibraryAuthZProvider>
<TestComponent />
</LibraryAuthZProvider>,
);
expect(screen.getByTestId('username')).toHaveTextContent('testuser');
expect(screen.getByTestId('libraryId')).toHaveTextContent('lib123');
expect(screen.getByTestId('canManageTeam')).toHaveTextContent('true');
expect(Number(screen.getByTestId('roles').textContent)).not.toBeNaN();
expect(Number(screen.getByTestId('permissions').textContent)).not.toBeNaN();
expect(Number(screen.getByTestId('resources').textContent)).not.toBeNaN();
});
it('throws error when user lacks both view and manage permissions', () => {
(useValidateUserPermissions as jest.Mock).mockReturnValue({
data: [
{ allowed: false }, // canViewTeam
{ allowed: false }, // canManageTeam
],
});
expect(() => {
renderWrapper(
<LibraryAuthZProvider>
<TestComponent />
</LibraryAuthZProvider>,
);
}).toThrow('NoAccess');
});
it('provides context when user can view but not manage team', () => {
(useValidateUserPermissions as jest.Mock).mockReturnValue({
data: [
{ allowed: true }, // canViewTeam
{ allowed: false }, // canManageTeam
],
});
renderWrapper(
<LibraryAuthZProvider>
<TestComponent />
</LibraryAuthZProvider>,
);
expect(screen.getByTestId('canManageTeam')).toHaveTextContent('false');
});
it('throws error when libraryId is missing', () => {
(useParams as jest.Mock).mockReturnValue({}); // No libraryId
expect(() => {
renderWrapper(
<LibraryAuthZProvider>
<TestComponent />
</LibraryAuthZProvider>,
);
}).toThrow('MissingLibrary');
});
it('throws error when useLibraryAuthZ is used outside provider', () => {
const BrokenComponent = () => {
useLibraryAuthZ();
return null;
};
expect(() => {
renderWrapper(<BrokenComponent />);
}).toThrow('useLibraryAuthZ must be used within an LibraryAuthZProvider');
});
});