From ac27df06010fc23fd5e19ac4b79d67d24c113770 Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Tue, 15 Apr 2025 15:40:26 -0700 Subject: [PATCH 1/2] fix: merge errors in previous commit --- src/library-authoring/create-unit/CreateUnitModal.tsx | 4 ++-- src/library-authoring/data/api.mocks.ts | 2 +- src/library-authoring/units/LibraryUnitPage.tsx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/library-authoring/create-unit/CreateUnitModal.tsx b/src/library-authoring/create-unit/CreateUnitModal.tsx index 9902948e2a..0d83303d30 100644 --- a/src/library-authoring/create-unit/CreateUnitModal.tsx +++ b/src/library-authoring/create-unit/CreateUnitModal.tsx @@ -36,10 +36,10 @@ const CreateUnitModal = () => { ...values, }); if (collectionId) { - await updateItemsMutation.mutateAsync([container.containerKey]); + await updateItemsMutation.mutateAsync([container.id]); } // Navigate to the new unit - navigate(`/library/${libraryId}/unit/${container.containerKey}`); + navigate(`/library/${libraryId}/unit/${container.id}`); showToast(intl.formatMessage(messages.createUnitSuccess)); } catch (error) { showToast(intl.formatMessage(messages.createUnitError)); diff --git a/src/library-authoring/data/api.mocks.ts b/src/library-authoring/data/api.mocks.ts index 9a71c8aa84..a3eb2c4c39 100644 --- a/src/library-authoring/data/api.mocks.ts +++ b/src/library-authoring/data/api.mocks.ts @@ -500,7 +500,7 @@ mockGetContainerMetadata.containerData = { } satisfies api.Container; mockGetContainerMetadata.containerDataWithCollections = { ...mockGetContainerMetadata.containerData, - containerKey: mockGetContainerMetadata.containerIdWithCollections, + id: mockGetContainerMetadata.containerIdWithCollections, collections: [{ title: 'My first collection', key: 'my-first-collection' }], } satisfies api.Container; /** Apply this mock. Returns a spy object that can tell you if it's been called. */ diff --git a/src/library-authoring/units/LibraryUnitPage.tsx b/src/library-authoring/units/LibraryUnitPage.tsx index 64183d4305..fc1eb67161 100644 --- a/src/library-authoring/units/LibraryUnitPage.tsx +++ b/src/library-authoring/units/LibraryUnitPage.tsx @@ -34,9 +34,9 @@ interface EditableTitleProps { const EditableTitle = ({ unitId }: EditableTitleProps) => { const intl = useIntl(); - const { libraryId, readOnly } = useLibraryContext(); + const { readOnly } = useLibraryContext(); - const { data: container } = useContainer(libraryId, unitId); + const { data: container } = useContainer(unitId); const updateMutation = useUpdateContainer(unitId); const { showToast } = useContext(ToastContext); From c76acda68b71af1a1b29b29645c1a84f39263ae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B4mulo=20Penido?= Date: Tue, 15 Apr 2025 20:24:01 -0300 Subject: [PATCH 2/2] test: improve coverage --- .../LibraryCollectionPage.test.tsx | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/src/library-authoring/collections/LibraryCollectionPage.test.tsx b/src/library-authoring/collections/LibraryCollectionPage.test.tsx index 32efc69884..17d5a4b5b1 100644 --- a/src/library-authoring/collections/LibraryCollectionPage.test.tsx +++ b/src/library-authoring/collections/LibraryCollectionPage.test.tsx @@ -21,7 +21,10 @@ import { mockContentSearchConfig, mockGetBlockTypes } from '../../search-manager import { mockClipboardEmpty } from '../../generic/data/api.mock'; import { LibraryLayout } from '..'; import { ContentTagsDrawer } from '../../content-tags-drawer'; -import { getLibraryCollectionItemsApiUrl } from '../data/api'; +import { + getLibraryCollectionItemsApiUrl, + getLibraryContainersApiUrl, +} from '../data/api'; let axiosMock: MockAdapter; let mockShowToast; @@ -406,4 +409,56 @@ describe('', () => { // Should close sidebar as component was removed await waitFor(() => expect(screen.queryByTestId('library-sidebar')).not.toBeInTheDocument()); }); + + it('should create a unit inside a collection', async () => { + await renderLibraryCollectionPage(); + const unitTitle = 'This is a Test'; + const containerUrl = getLibraryContainersApiUrl(mockContentLibrary.libraryId); + axiosMock.onPost(containerUrl).reply(200, { + id: 'unit-1', + slug: 'this-is-a-test', + title: unitTitle, + }); + const collectionUrl = getLibraryCollectionItemsApiUrl( + mockContentLibrary.libraryId, + mockCollection.collectionId, + ); + axiosMock.onPatch(collectionUrl).reply(200); + + expect(await screen.findByRole('heading')).toBeInTheDocument(); + expect(screen.queryByText(/add content/i)).not.toBeInTheDocument(); + + // Open Add content sidebar + const newButton = screen.getByRole('button', { name: /new/i }); + fireEvent.click(newButton); + expect(screen.getByText(/add content/i)).toBeInTheDocument(); + + // Open New unit Modal + const sidebar = screen.getByTestId('library-sidebar'); + const newUnitButton = within(sidebar).getAllByRole('button', { name: /unit/i })[0]; + fireEvent.click(newUnitButton); + const unitModalHeading = await screen.findByRole('heading', { name: /new unit/i }); + expect(unitModalHeading).toBeInTheDocument(); + + // Fill the form + const createButton = screen.getByRole('button', { name: /create/i }); + const nameField = screen.getByRole('textbox', { name: /name your unit/i }); + + fireEvent.change(nameField, { target: { value: unitTitle } }); + fireEvent.click(createButton); + + // Check success + await waitFor(() => expect(axiosMock.history.post.length).toBe(1)); + + // Check that the unit was created + expect(axiosMock.history.post[0].url).toBe(containerUrl); + expect(axiosMock.history.post[0].data).toContain(`"display_name":"${unitTitle}"`); + expect(axiosMock.history.post[0].data).toContain('"container_type":"unit"'); + expect(mockShowToast).toHaveBeenCalledWith('Unit created successfully'); + + // Check that the unit was added to the collection + expect(axiosMock.history.patch.length).toBe(1); + expect(axiosMock.history.patch[0].url).toBe(collectionUrl); + expect(axiosMock.history.patch[0].data).toContain('"usage_keys":["unit-1"]'); + }); });