diff --git a/src/authz-module/libraries-manager/LibrariesAuthZManager.test.tsx b/src/authz-module/libraries-manager/LibrariesAuthZManager.test.tsx
new file mode 100644
index 0000000..991c740
--- /dev/null
+++ b/src/authz-module/libraries-manager/LibrariesAuthZManager.test.tsx
@@ -0,0 +1,55 @@
+import { screen } from '@testing-library/react';
+import LibrariesAuthZManager from './LibrariesAuthZManager';
+import { useLibraryAuthZ } from './context';
+import { renderWrapper } from '@src/setupTest';
+import { initializeMockApp } from '@edx/frontend-platform/testing';
+
+jest.mock('./context', () => {
+ const actual = jest.requireActual('./context');
+ return {
+ ...actual,
+ useLibraryAuthZ: jest.fn(),
+ LibraryAuthZProvider: ({ children }: { children: React.ReactNode }) =>
{children}
,
+ };
+});
+const mockedUseLibraryAuthZ = useLibraryAuthZ as jest.Mock;
+
+jest.mock('./components/TeamTable', () => ({
+ __esModule: true,
+ default: () => MockTeamTable
,
+}));
+
+describe('LibrariesAuthZManager', () => {
+ beforeEach(() => {
+ initializeMockApp({
+ authenticatedUser: {
+ username: 'admin'
+ }
+ })
+ mockedUseLibraryAuthZ.mockReturnValue({
+ libraryId: 'lib-001',
+ libraryName: 'Mock Library',
+ libraryOrg: 'MockOrg',
+ username: 'mockuser',
+ roles: ['admin'],
+ permissions: [],
+ canManageTeam: true,
+ });
+ });
+
+ it('renders tabs and layout content correctly', () => {
+ renderWrapper(hola
);
+
+ // Tabs
+ expect(screen.getByRole('tab', { name: /Team Members/i })).toBeInTheDocument();
+ expect(screen.getByRole('tab', { name: /Roles/i })).toBeInTheDocument();
+ expect(screen.getByRole('tab', { name: /Permissions/i })).toBeInTheDocument();
+
+ // Breadcrumb/page title
+ expect(screen.getByText('Manage Access')).toBeInTheDocument(); // from intl.formatMessage
+ expect(screen.getByText('lib-001')).toBeInTheDocument(); // subtitle
+
+ // TeamTable is rendered
+ expect(screen.getByTestId('team-table')).toBeInTheDocument();
+ });
+});
diff --git a/src/authz-module/libraries-manager/LibrariesAuthZManager.tsx b/src/authz-module/libraries-manager/LibrariesAuthZManager.tsx
new file mode 100644
index 0000000..202b2db
--- /dev/null
+++ b/src/authz-module/libraries-manager/LibrariesAuthZManager.tsx
@@ -0,0 +1,49 @@
+import { useIntl } from '@edx/frontend-platform/i18n';
+import { Tab, Tabs } from '@openedx/paragon';
+import TeamTable from './components/TeamTable';
+import AuthZLayout from '../components/AuthZLayout';
+import { LibraryAuthZProvider, useLibraryAuthZ } from './context';
+
+import messages from './messages';
+
+const LibrariesAuthZView = () => {
+ const intl = useIntl();
+ const { libraryId, libraryName, libraryOrg } = useLibraryAuthZ();
+ const rootBradecrumb = intl.formatMessage(messages['library.authz.breadcrumb.root']) || '';
+ const pageTitle = intl.formatMessage(messages['library.authz.manage.page.title']);
+ return (
+
+
+
+
+
+
+
+ Role tab.
+
+
+ Permissions tab.
+
+
+
+
+ );
+};
+const LibrariesAuthZManager = () => (
+
+
+
+);
+
+export default LibrariesAuthZManager;
diff --git a/src/authz-module/libraries-manager/messages.ts b/src/authz-module/libraries-manager/messages.ts
new file mode 100644
index 0000000..acba544
--- /dev/null
+++ b/src/authz-module/libraries-manager/messages.ts
@@ -0,0 +1,31 @@
+import { defineMessages } from '@edx/frontend-platform/i18n';
+
+const messages = defineMessages({
+ 'library.authz.manage.page.title': {
+ id: 'library.authz.manage.page.title',
+ defaultMessage: 'Library Team Management',
+ description: 'Libreries AuthZ page title',
+ },
+ 'library.authz.breadcrumb.root': {
+ id: 'library.authz.breadcrumb.root',
+ defaultMessage: 'Manage Access',
+ description: 'Libreries AuthZ root breafcrumb',
+ },
+ 'library.authz.tabs.team': {
+ id: 'library.authz.tabs.team',
+ defaultMessage: 'Team Members',
+ description: 'Libreries AuthZ title for the team management tab',
+ },
+ 'library.authz.tabs.roles': {
+ id: 'library.authz.tabs.roles',
+ defaultMessage: 'Roles',
+ description: 'Libreries AuthZ title for the roles tab',
+ },
+ 'library.authz.tabs.permissions': {
+ id: 'library.authz.tabs.permissions',
+ defaultMessage: 'Permissions',
+ description: 'Libreries AuthZ title for the permissions tab',
+ },
+});
+
+export default messages;