Skip to content

Commit 5cc6ba1

Browse files
committed
fixup! feat: improve collection sidebar
1 parent 576ec4a commit 5cc6ba1

File tree

3 files changed

+75
-1
lines changed

3 files changed

+75
-1
lines changed

src/library-authoring/collections/CollectionDetails.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ const CollectionDetails = ({ library, collection }: CollectionDetailsProps) => {
9797

9898
// istanbul ignore if: this should never happen
9999
if (!collection) {
100-
return null;
100+
throw new Error('A collection must be provided to CollectionDetails');
101101
}
102102

103103
const onSubmit = (e: React.FocusEvent<HTMLTextAreaElement>) => {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { mockCollectionHit } from '../../search-manager/data/api.mock';
2+
import {
3+
initializeMocks,
4+
fireEvent,
5+
render,
6+
screen,
7+
waitFor,
8+
} from '../../testUtils';
9+
import { mockContentLibrary } from '../data/api.mocks';
10+
import * as api from '../data/api';
11+
import CollectionInfoHeader from './CollectionInfoHeader';
12+
13+
describe('<CollectionInfoHeader />', () => {
14+
it('should render Collection info Header', async () => {
15+
initializeMocks();
16+
const library = await mockContentLibrary(mockContentLibrary.libraryId);
17+
render(<CollectionInfoHeader library={library} collection={mockCollectionHit} />);
18+
19+
expect(screen.getByText(mockCollectionHit.displayName)).toBeInTheDocument();
20+
expect(screen.getByRole('button', { name: /edit collection title/i })).toBeInTheDocument();
21+
});
22+
23+
it('should not render edit title button without permission', async () => {
24+
const readOnlyLibrary = await mockContentLibrary(mockContentLibrary.libraryIdReadOnly);
25+
render(<CollectionInfoHeader library={readOnlyLibrary} collection={mockCollectionHit} />);
26+
expect(screen.queryByRole('button', { name: /edit collection title/i })).not.toBeInTheDocument();
27+
});
28+
29+
it('should update collection title', async () => {
30+
const { axiosMock, mockShowToast } = initializeMocks();
31+
const library = await mockContentLibrary(mockContentLibrary.libraryId);
32+
render(<CollectionInfoHeader library={library} collection={mockCollectionHit} />);
33+
const url = api.getLibraryCollectionApiUrl(library.id, mockCollectionHit.blockId);
34+
axiosMock.onPatch(url).reply(200);
35+
36+
fireEvent.click(screen.getByRole('button', { name: /edit collection title/i }));
37+
38+
const textBox = screen.getByRole('textbox', { name: /title input/i });
39+
40+
fireEvent.change(textBox, { target: { value: 'New Collection Title' } });
41+
fireEvent.keyDown(textBox, { key: 'Enter', code: 'Enter', charCode: 13 });
42+
43+
await waitFor(() => {
44+
expect(axiosMock.history.patch[0].url).toEqual(url);
45+
expect(axiosMock.history.patch[0].data).toEqual(JSON.stringify({ title: 'New Collection Title' }));
46+
});
47+
48+
expect(textBox).not.toBeInTheDocument();
49+
expect(mockShowToast).toHaveBeenCalledWith('Collection updated successfully.');
50+
});
51+
});

src/search-manager/data/api.mock.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,26 @@ export function mockSearchResult(mockResponse: MultiSearchResponse) {
4040
return newMockResponse;
4141
}, { overwriteRoutes: true });
4242
}
43+
44+
export const mockCollectionHit = {
45+
displayName: 'Collection 1',
46+
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque et mi ac nisi accumsan imperdiet vitae at odio. Vivamus tempor nec lorem eget lacinia. Vivamus efficitur lacus non dapibus porta. Nulla venenatis luctus nisi id posuere. Sed sollicitudin magna a sem ultrices accumsan. Praesent volutpat tortor vitae luctus rutrum. Integer.',
47+
id: '1',
48+
type: 'collection',
49+
usageKey: 'lib:OpenedX:CSPROB2:collection:coll1',
50+
blockId: 'coll1',
51+
tags: {},
52+
breadcrumbs: [
53+
{
54+
displayName: 'CS problems 2',
55+
},
56+
],
57+
created: 1725534795.628254,
58+
modified: 1725878053.420395,
59+
contextKey: 'lib:OpenedX:CSPROB2',
60+
org: 'OpenedX',
61+
formatted: {
62+
displayName: 'Collection 1',
63+
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque et mi ac nisi accumsan imperdiet…',
64+
},
65+
} satisfies api.CollectionHit;

0 commit comments

Comments
 (0)