From 48baab94e9958b94d44dcb116a748554655f139c Mon Sep 17 00:00:00 2001
From: Lutz Helm <helm@ub.uni-leipzig.de>
Date: Tue, 30 Mar 2021 15:16:12 +0200
Subject: [PATCH] Add tests for localstorage annotation export

---
 __tests__/AnnotationExportDialog.test.js  | 53 +++++++++++++++++++++++
 __tests__/miradorAnnotationPlugin.test.js | 35 +++++++++++++++
 src/AnnotationExportDialog.js             |  4 +-
 3 files changed, 90 insertions(+), 2 deletions(-)
 create mode 100644 __tests__/AnnotationExportDialog.test.js

diff --git a/__tests__/AnnotationExportDialog.test.js b/__tests__/AnnotationExportDialog.test.js
new file mode 100644
index 0000000..21d9e5c
--- /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 6695636..c77189f 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 9f67ddd..9202209 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({
-- 
GitLab