diff --git a/src/library-authoring/add-content/AddContentContainer.test.tsx b/src/library-authoring/add-content/AddContentContainer.test.tsx index a67c4f995..5832b6f66 100644 --- a/src/library-authoring/add-content/AddContentContainer.test.tsx +++ b/src/library-authoring/add-content/AddContentContainer.test.tsx @@ -77,7 +77,7 @@ describe('', () => { }); it('should handle failure to paste content', async () => { - const { axiosMock } = initializeMocks(); + const { axiosMock, mockShowToast } = initializeMocks(); // Simulate having an HTML block in the clipboard: mockClipboardHtml.applyMock(); @@ -89,8 +89,36 @@ describe('', () => { const pasteButton = await screen.findByRole('button', { name: /paste from clipboard/i }); fireEvent.click(pasteButton); - await waitFor(() => expect(axiosMock.history.post[0].url).toEqual(pasteUrl)); + await waitFor(() => { + expect(axiosMock.history.post[0].url).toEqual(pasteUrl); + expect(mockShowToast).toHaveBeenCalledWith('There was an error pasting the content.'); + }); + }); + + it('should handle failure to paste content and show server error if available', async () => { + const { axiosMock, mockShowToast } = initializeMocks(); + // Simulate having an HTML block in the clipboard: + mockClipboardHtml.applyMock(); + + const errMsg = 'Libraries do not support this type of content yet.'; + const pasteUrl = getLibraryPasteClipboardUrl(libraryId); + + // eslint-disable-next-line prefer-promise-reject-errors + axiosMock.onPost(pasteUrl).reply(() => Promise.reject({ + customAttributes: { + httpErrorStatus: 400, + httpErrorResponseData: JSON.stringify({ block_type: errMsg }), + }, + })); + + render(); + + const pasteButton = await screen.findByRole('button', { name: /paste from clipboard/i }); + fireEvent.click(pasteButton); - // TODO: check that an actual error message is shown?! + await waitFor(() => { + expect(axiosMock.history.post[0].url).toEqual(pasteUrl); + expect(mockShowToast).toHaveBeenCalledWith(errMsg); + }); }); }); diff --git a/src/library-authoring/add-content/AddContentContainer.tsx b/src/library-authoring/add-content/AddContentContainer.tsx index d37fd75f0..ab1956320 100644 --- a/src/library-authoring/add-content/AddContentContainer.tsx +++ b/src/library-authoring/add-content/AddContentContainer.tsx @@ -73,6 +73,17 @@ const AddContentContainer = () => { openComponentEditor, } = useLibraryContext(); + const parsePasteErrorMsg = (error) => { + let errMsg: string; + try { + const { customAttributes: { httpErrorResponseData } } = error; + errMsg = JSON.parse(httpErrorResponseData).block_type; + } catch (_err) { + errMsg = intl.formatMessage(messages.errorPasteClipboardMessage); + } + return errMsg; + }; + const collectionButtonData = { name: intl.formatMessage(messages.collectionButton), disabled: false, @@ -138,8 +149,8 @@ const AddContentContainer = () => { blockId: `${uuid4()}`, }).then(() => { showToast(intl.formatMessage(messages.successPasteClipboardMessage)); - }).catch(() => { - showToast(intl.formatMessage(messages.errorPasteClipboardMessage)); + }).catch((error) => { + showToast(parsePasteErrorMsg(error)); }); } else if (blockType === 'collection') { openCreateCollectionModal();