Skip to content

Commit 4e15265

Browse files
committed
feat: integrate tjhe LibrariesUserManagement view in the application
1 parent 0494ee6 commit 4e15265

8 files changed

Lines changed: 52 additions & 22 deletions

File tree

src/authz-module/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
export const ROUTES = {
22
LIBRARIES_TEAM_PATH: '/libraries/:libraryId',
3-
LIBRARIES_USER_PATH: '/libraries/user/:username',
3+
LIBRARIES_USER_PATH: '/libraries/:libraryId/:username',
44
};

src/authz-module/index.test.tsx

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import { ComponentType, lazy } from 'react';
22
import { render, screen, waitFor } from '@testing-library/react';
3-
import { MemoryRouter } from 'react-router-dom';
3+
import { MemoryRouter, Outlet } from 'react-router-dom';
44
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
5+
import { initializeMockApp } from '@edx/frontend-platform/testing';
56
import AuthZModule from './index';
67

7-
// eslint-disable-next-line no-promise-executor-return
8-
jest.mock('./libraries-manager/LibrariesTeamManager', () => lazy(() => new Promise<{ default: ComponentType<any> }>(resolve => setTimeout(() => resolve({ default: () => <div data-testid="libraries-manager">Loaded</div> }), 100))));
8+
jest.mock('./libraries-manager', () => ({
9+
// eslint-disable-next-line no-promise-executor-return
10+
LibrariesLayout: lazy(() => new Promise<{ default: ComponentType<any> }>(resolve => setTimeout(() => resolve({ default: () => <div data-testid="layout"><Outlet /></div> }), 100))),
11+
LibrariesTeamManager: () => <div data-testid="libraries-manager">Libraries Team Page</div>,
12+
LibrariesUserManager: () => <div data-testid="libraries-user-manager">Libraries User Page</div>,
13+
}));
914

1015
const createTestQueryClient = () => new QueryClient({
1116
defaultOptions: {
@@ -16,6 +21,12 @@ const createTestQueryClient = () => new QueryClient({
1621
});
1722

1823
describe('AuthZModule', () => {
24+
beforeEach(() => {
25+
jest.clearAllMocks();
26+
initializeMockApp({
27+
authenticatedUser: { username: 'testuser' },
28+
});
29+
});
1930
it('renders LoadingPage then LibrariesTeamManager when route matches', async () => {
2031
const queryClient = createTestQueryClient();
2132
const path = '/libraries/lib:123';
@@ -34,4 +45,20 @@ describe('AuthZModule', () => {
3445
expect(screen.getByTestId('libraries-manager')).toBeInTheDocument();
3546
});
3647
});
48+
49+
it('renders LoadingPage then LibrariesUserManager when user route matches', async () => {
50+
const queryClient = createTestQueryClient();
51+
const path = '/libraries/lib:123/testuser';
52+
53+
render(
54+
<QueryClientProvider client={queryClient}>
55+
<MemoryRouter initialEntries={[path]}>
56+
<AuthZModule />
57+
</MemoryRouter>
58+
</QueryClientProvider>,
59+
);
60+
await waitFor(() => {
61+
expect(screen.getByTestId('libraries-user-manager')).toBeInTheDocument();
62+
});
63+
});
3764
});

src/authz-module/index.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Suspense } from 'react';
22
import { Routes, Route } from 'react-router-dom';
33
import { ErrorBoundary } from '@edx/frontend-platform/react';
44
import LoadingPage from '@src/components/LoadingPage';
5-
import { LibrariesTeamManager } from './libraries-manager';
5+
import { LibrariesTeamManager, LibrariesUserManager, LibrariesLayout } from './libraries-manager';
66
import { ROUTES } from './constants';
77

88
import './index.scss';
@@ -11,7 +11,10 @@ const AuthZModule = () => (
1111
<ErrorBoundary>
1212
<Suspense fallback={<LoadingPage />}>
1313
<Routes>
14-
<Route path={ROUTES.LIBRARIES_TEAM_PATH} element={<LibrariesTeamManager />} />
14+
<Route element={<LibrariesLayout />}>
15+
<Route path={ROUTES.LIBRARIES_TEAM_PATH} element={<LibrariesTeamManager />} />
16+
<Route path={ROUTES.LIBRARIES_USER_PATH} element={<LibrariesUserManager />} />
17+
</Route>
1518
</Routes>
1619
</Suspense>
1720
</ErrorBoundary>

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { Tab, Tabs } from '@openedx/paragon';
33
import { useLibrary } from '@src/authz-module/data/hooks';
44
import TeamTable from './components/TeamTable';
55
import AuthZLayout from '../components/AuthZLayout';
6-
import { LibraryAuthZProvider, useLibraryAuthZ } from './context';
6+
import { useLibraryAuthZ } from './context';
77

88
import messages from './messages';
99

10-
const LibrariesAuthZTeamView = () => {
10+
const LibrariesTeamManager = () => {
1111
const intl = useIntl();
1212
const { libraryId } = useLibraryAuthZ();
1313
const { data: library } = useLibrary(libraryId);
@@ -42,10 +42,5 @@ const LibrariesAuthZTeamView = () => {
4242
</div>
4343
);
4444
};
45-
const LibrariesTeamManager = () => (
46-
<LibraryAuthZProvider>
47-
<LibrariesAuthZTeamView />
48-
</LibraryAuthZProvider>
49-
);
5045

5146
export default LibrariesTeamManager;

src/authz-module/libraries-manager/components/TeamTable.test.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { screen } from '@testing-library/react';
22
import userEvent from '@testing-library/user-event';
3-
import { ROUTES } from '@src/authz-module/constants';
43
import { renderWrapper } from '@src/setupTest';
54
import { useTeamMembers } from '@src/authz-module/data/hooks';
65
import TeamTable from './TeamTable';
@@ -91,7 +90,7 @@ describe('TeamTable', () => {
9190

9291
await userEvent.click(editButtons[0]);
9392
expect(mockNavigate).toHaveBeenCalledWith(
94-
`/authz/${ROUTES.LIBRARIES_USER_PATH.replace(':username', 'bob')}`,
93+
`/authz/libraries/${mockAuthZ.libraryId}/bob`,
9594
);
9695
});
9796

src/authz-module/libraries-manager/components/TeamTable.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
} from '@openedx/paragon';
66
import { Edit } from '@openedx/paragon/icons';
77
import { TableCellValue, TeamMember } from '@src/types';
8-
import { ROUTES } from '@src/authz-module/constants';
98
import { useTeamMembers } from '@src/authz-module/data/hooks';
109
import { useLibraryAuthZ } from '../context';
1110
import messages from './messages';
@@ -82,7 +81,7 @@ const TeamTable = () => {
8281
variant="link"
8382
size="sm"
8483
// TODO: update the view with the team member view
85-
onClick={() => navigate(`/authz/${ROUTES.LIBRARIES_USER_PATH.replace(':username', row.original.username)}`)}
84+
onClick={() => navigate(`/authz/libraries/${libraryId}/${row.original.username}`)}
8685
>
8786
{intl.formatMessage(messages['authz.libraries.team.table.edit.action'])}
8887
</Button>

src/authz-module/libraries-manager/index.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Outlet } from 'react-router-dom';
2+
import LibrariesTeamManager from './LibrariesTeamManager';
3+
import LibrariesUserManager from './LibrariesUserManager';
4+
import { LibraryAuthZProvider } from './context';
5+
6+
const LibrariesLayout = () => (<LibraryAuthZProvider><Outlet /></LibraryAuthZProvider>);
7+
8+
export {
9+
LibrariesLayout,
10+
LibrariesTeamManager,
11+
LibrariesUserManager,
12+
};

0 commit comments

Comments
 (0)