diff --git a/__tests__/AnnotationExportDialog.test.js b/__tests__/AnnotationExportDialog.test.js new file mode 100644 index 0000000000000000000000000000000000000000..21d9e5c2373c5be35675ce29ddd74e684e605bdc --- /dev/null +++ b/__tests__/AnnotationExportDialog.test.js @@ -0,0 +1,53 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import MenuItem from '@material-ui/core/MenuItem'; +import AnnotationExportDialog from '../src/AnnotationExportDialog'; + +window.URL.createObjectURL = jest.fn((data) => ('downloadurl')); + +const adapter = jest.fn(() => ( + { + all: jest.fn().mockResolvedValue( + { + id: 'pageId/3', + items: [ + { id: 'anno/2' }, + ], + type: 'AnnotationPage', + }, + ), + annotationPageId: 'pageId/3', + } +)); + +/** */ +function createWrapper(props) { + return shallow( + <AnnotationExportDialog + canvases={[]} + config={{ annotation: { adapter } }} + handleClose={jest.fn()} + open + {...props} + />, + ); +} + +describe('AnnotationExportDialog', () => { + it('renders download link for every annotation page', async () => { + let wrapper = createWrapper({ + canvases: [ + { id: 'canvas/1' }, + { id: 'canvas/2' }, + ], + }).dive(); + expect(wrapper.text()).toEqual(expect.stringContaining('No annotations stored yet.')); + + wrapper.instance().componentDidUpdate({ open: false }); + await new Promise((resolve) => setTimeout(resolve, 50)); + wrapper = wrapper.update(); + expect(wrapper.text()).toEqual(expect.not.stringContaining('No annotations stored yet.')); + expect(wrapper.find(MenuItem).some({ 'aria-label': 'Export annotations for canvas/1' })).toBe(true); + expect(wrapper.find(MenuItem).some({ 'aria-label': 'Export annotations for canvas/2' })).toBe(true); + }); +}); diff --git a/__tests__/miradorAnnotationPlugin.test.js b/__tests__/miradorAnnotationPlugin.test.js index 66956369e7dbbb1f000bec3a6b5145a84bf69b97..c77189fe2c07566acf90d7880f7fde7a0bd4bad7 100644 --- a/__tests__/miradorAnnotationPlugin.test.js +++ b/__tests__/miradorAnnotationPlugin.test.js @@ -1,6 +1,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { MiradorMenuButton } from 'mirador/dist/es/src/components/MiradorMenuButton'; +import LocalStorageAdapter from '../src/LocalStorageAdapter'; import miradorAnnotationPlugin from '../src/plugins/miradorAnnotationPlugin'; /** */ @@ -39,4 +40,38 @@ describe('MiradorAnnotation', () => { }, ); }); + it('renders no export button if export or LocalStorageAdapter are not configured', () => { + wrapper = createWrapper(); + expect(wrapper.find(MiradorMenuButton).some({ 'aria-label': 'Export local annotations for visible items' })).toBe(false); + + wrapper = createWrapper({ + config: { + annotation: { + adapter: () => () => {}, + exportLocalStorageAnnotations: true, + }, + }, + }); + expect(wrapper.find(MiradorMenuButton).some({ 'aria-label': 'Export local annotations for visible items' })).toBe(false); + + wrapper = createWrapper({ + config: { + annotation: { + adapter: (canvasId) => new LocalStorageAdapter(`test://?canvasId=${canvasId}`), + }, + }, + }); + expect(wrapper.find(MiradorMenuButton).some({ 'aria-label': 'Export local annotations for visible items' })).toBe(false); + }); + it('renders export button if export and LocalStorageAdapter are configured', () => { + wrapper = createWrapper({ + config: { + annotation: { + adapter: (canvasId) => new LocalStorageAdapter(`test://?canvasId=${canvasId}`), + exportLocalStorageAnnotations: true, + }, + }, + }); + expect(wrapper.find(MiradorMenuButton).some({ 'aria-label': 'Export local annotations for visible items' })).toBe(true); + }); }); diff --git a/src/AnnotationExportDialog.js b/src/AnnotationExportDialog.js index 9f67ddd940b5dbd5e5e208862d161a8c92d69273..9202209b55518038cf67acb5cd3b40c0b973ccaa 100644 --- a/src/AnnotationExportDialog.js +++ b/src/AnnotationExportDialog.js @@ -46,7 +46,7 @@ class AnnotationExportDialog extends Component { const content = await store.all(); if (content) { // eslint-disable-next-line no-underscore-dangle - const label = canvas.__jsonld.label || canvas.id; + const label = (canvas.__jsonld && canvas.__jsonld.label) || canvas.id; const data = new Blob([JSON.stringify(content)], { type: 'application/json' }); const url = window.URL.createObjectURL(data); return [...resolvedAcc, { @@ -121,7 +121,7 @@ class AnnotationExportDialog extends Component { AnnotationExportDialog.propTypes = { canvases: PropTypes.arrayOf( - PropTypes.shape({ id: PropTypes.string, index: PropTypes.number }), + PropTypes.shape({ id: PropTypes.string }), ).isRequired, classes: PropTypes.objectOf(PropTypes.string), config: PropTypes.shape({