Skip to content

Commit 3bf34cb

Browse files
committed
feat: add the libraries authz management view
1 parent 215a1c4 commit 3bf34cb

3 files changed

Lines changed: 135 additions & 0 deletions

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { screen } from '@testing-library/react';
2+
import LibrariesAuthZManager from './LibrariesAuthZManager';
3+
import { useLibraryAuthZ } from './context';
4+
import { renderWrapper } from '@src/setupTest';
5+
import { initializeMockApp } from '@edx/frontend-platform/testing';
6+
7+
jest.mock('./context', () => {
8+
const actual = jest.requireActual('./context');
9+
return {
10+
...actual,
11+
useLibraryAuthZ: jest.fn(),
12+
LibraryAuthZProvider: ({ children }: { children: React.ReactNode }) => <div>{children}</div>,
13+
};
14+
});
15+
const mockedUseLibraryAuthZ = useLibraryAuthZ as jest.Mock;
16+
17+
jest.mock('./components/TeamTable', () => ({
18+
__esModule: true,
19+
default: () => <div data-testid="team-table">MockTeamTable</div>,
20+
}));
21+
22+
describe('LibrariesAuthZManager', () => {
23+
beforeEach(() => {
24+
initializeMockApp({
25+
authenticatedUser: {
26+
username: 'admin'
27+
}
28+
})
29+
mockedUseLibraryAuthZ.mockReturnValue({
30+
libraryId: 'lib-001',
31+
libraryName: 'Mock Library',
32+
libraryOrg: 'MockOrg',
33+
username: 'mockuser',
34+
roles: ['admin'],
35+
permissions: [],
36+
canManageTeam: true,
37+
});
38+
});
39+
40+
it('renders tabs and layout content correctly', () => {
41+
renderWrapper(<div>hola<LibrariesAuthZManager /></div>);
42+
43+
// Tabs
44+
expect(screen.getByRole('tab', { name: /Team Members/i })).toBeInTheDocument();
45+
expect(screen.getByRole('tab', { name: /Roles/i })).toBeInTheDocument();
46+
expect(screen.getByRole('tab', { name: /Permissions/i })).toBeInTheDocument();
47+
48+
// Breadcrumb/page title
49+
expect(screen.getByText('Manage Access')).toBeInTheDocument(); // from intl.formatMessage
50+
expect(screen.getByText('lib-001')).toBeInTheDocument(); // subtitle
51+
52+
// TeamTable is rendered
53+
expect(screen.getByTestId('team-table')).toBeInTheDocument();
54+
});
55+
});
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { useIntl } from '@edx/frontend-platform/i18n';
2+
import { Tab, Tabs } from '@openedx/paragon';
3+
import TeamTable from './components/TeamTable';
4+
import AuthZLayout from '../components/AuthZLayout';
5+
import { LibraryAuthZProvider, useLibraryAuthZ } from './context';
6+
7+
import messages from './messages';
8+
9+
const LibrariesAuthZView = () => {
10+
const intl = useIntl();
11+
const { libraryId, libraryName, libraryOrg } = useLibraryAuthZ();
12+
const rootBradecrumb = intl.formatMessage(messages['library.authz.breadcrumb.root']) || '';
13+
const pageTitle = intl.formatMessage(messages['library.authz.manage.page.title']);
14+
return (
15+
<div className="authz-libraries">
16+
<AuthZLayout
17+
context={{ id: libraryId, title: libraryName, org: libraryOrg }}
18+
navLinks={[{ label: rootBradecrumb }]}
19+
activeLabel={pageTitle}
20+
pageTitle={pageTitle}
21+
pageSubtitle={libraryId}
22+
actions={[]}
23+
>
24+
<Tabs
25+
variant="tabs"
26+
defaultActiveKey="team"
27+
className="bg-light-100 px-5"
28+
>
29+
<Tab eventKey="team" title={intl.formatMessage(messages['library.authz.tabs.team'])} className="p-5">
30+
<TeamTable />
31+
</Tab>
32+
<Tab eventKey="roles" title={intl.formatMessage(messages['library.authz.tabs.roles'])}>
33+
Role tab.
34+
</Tab>
35+
<Tab eventKey="permissions" title={intl.formatMessage(messages['library.authz.tabs.permissions'])}>
36+
Permissions tab.
37+
</Tab>
38+
</Tabs>
39+
</AuthZLayout>
40+
</div>
41+
);
42+
};
43+
const LibrariesAuthZManager = () => (
44+
<LibraryAuthZProvider>
45+
<LibrariesAuthZView />
46+
</LibraryAuthZProvider>
47+
);
48+
49+
export default LibrariesAuthZManager;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { defineMessages } from '@edx/frontend-platform/i18n';
2+
3+
const messages = defineMessages({
4+
'library.authz.manage.page.title': {
5+
id: 'library.authz.manage.page.title',
6+
defaultMessage: 'Library Team Management',
7+
description: 'Libreries AuthZ page title',
8+
},
9+
'library.authz.breadcrumb.root': {
10+
id: 'library.authz.breadcrumb.root',
11+
defaultMessage: 'Manage Access',
12+
description: 'Libreries AuthZ root breafcrumb',
13+
},
14+
'library.authz.tabs.team': {
15+
id: 'library.authz.tabs.team',
16+
defaultMessage: 'Team Members',
17+
description: 'Libreries AuthZ title for the team management tab',
18+
},
19+
'library.authz.tabs.roles': {
20+
id: 'library.authz.tabs.roles',
21+
defaultMessage: 'Roles',
22+
description: 'Libreries AuthZ title for the roles tab',
23+
},
24+
'library.authz.tabs.permissions': {
25+
id: 'library.authz.tabs.permissions',
26+
defaultMessage: 'Permissions',
27+
description: 'Libreries AuthZ title for the permissions tab',
28+
},
29+
});
30+
31+
export default messages;

0 commit comments

Comments
 (0)