16037: Added filtering for directories when downloading
authorDaniel Kutyła <daniel.kutyla@contractors.roche.com>
Tue, 6 Oct 2020 20:33:39 +0000 (22:33 +0200)
committerDaniel Kutyła <daniel.kutyla@contractors.roche.com>
Tue, 6 Oct 2020 20:33:39 +0000 (22:33 +0200)
Arvados-DCO-1.1-Signed-off-by: Daniel Kutyła <daniel.kutyla@contractors.roche.com>

src/views-components/context-menu/actions/download-action.test.tsx [new file with mode: 0644]
src/views-components/context-menu/actions/download-action.tsx

diff --git a/src/views-components/context-menu/actions/download-action.test.tsx b/src/views-components/context-menu/actions/download-action.test.tsx
new file mode 100644 (file)
index 0000000..88791d4
--- /dev/null
@@ -0,0 +1,73 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import * as React from 'react';
+import axios from 'axios';
+import { configure, shallow } from "enzyme";
+import * as Adapter from 'enzyme-adapter-react-16';
+import { ListItem } from '@material-ui/core';
+import * as JSZip from 'jszip';
+import { DownloadAction } from './download-action';
+
+configure({ adapter: new Adapter() });
+
+jest.mock('axios');
+
+jest.mock('file-saver', () => ({
+    saveAs: jest.fn(),
+}));
+
+const mock = {
+    file: jest.fn(),
+    generateAsync: jest.fn().mockImplementation(() => Promise.resolve('test')),
+};
+
+jest.mock('jszip', () => jest.fn().mockImplementation(() => mock));
+
+describe('<DownloadAction />', () => {
+    let props;
+    let zip;
+
+    beforeEach(() => {
+        props = {};
+        zip = new JSZip();
+        (axios as any).get.mockImplementationOnce(() => Promise.resolve({ data: '1234' }));
+    });
+
+    it('should return null if missing href or kind of file in props', () => {
+        // when
+        const wrapper = shallow(<DownloadAction {...props} />);
+
+        // then
+        expect(wrapper.html()).toBeNull();
+    });
+
+    it('should return a element', () => {
+        // setup
+        props.href = '#';
+
+        // when
+        const wrapper = shallow(<DownloadAction {...props} />);
+
+        // then
+        expect(wrapper.html()).not.toBeNull();
+    });
+
+    it('should handle download', () => {
+        // setup
+        props = {
+            href: ['file1'],
+            kind: 'files',
+            download: [],
+            currentCollectionUuid: '123412-123123'
+        };
+        const wrapper = shallow(<DownloadAction {...props} />);
+
+        // when
+        wrapper.find(ListItem).simulate('click');
+
+        // then
+        expect(axios.get).toHaveBeenCalledWith(props.href[0]);
+    });
+});
\ No newline at end of file
index 7fcf7c2cbd215fa186f7c75a8fca61f461420726..7468954fdd97d293837dd8edfebbc0d5a62a241a 100644 (file)
@@ -2,10 +2,10 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import * as React from "react";
-import { ListItemIcon, ListItemText, ListItem } from "@material-ui/core";
-import { DownloadIcon } from "../../../components/icon/icon";
-import * as JSZip from "jszip";
+import * as React from 'react';
+import { ListItemIcon, ListItemText, ListItem } from '@material-ui/core';
+import { DownloadIcon } from '../../../components/icon/icon';
+import * as JSZip from 'jszip';
 import * as FileSaver from 'file-saver';
 import axios from 'axios';
 
@@ -13,28 +13,35 @@ export const DownloadAction = (props: { href?: any, download?: any, onClick?: ()
     const downloadProps = props.download ? { download: props.download } : {};
 
     const createZip = (fileUrls: string[], download: string[]) => {
-        const zip = new JSZip();
         let id = 1;
-        fileUrls.map((href: string) => {
-            axios.get(href).then(response => response).then(({ data }: any) => {
-                const splittedByDot = href.split('.');
-                if (splittedByDot[splittedByDot.length - 1] !== 'json') {
-                    if (fileUrls.length === id) {
-                        zip.file(download[id - 1], data);
-                        zip.generateAsync({ type: 'blob' }).then((content) => {
-                            FileSaver.saveAs(content, `download-${props.currentCollectionUuid}.zip`);
-                        });
+        const zip = new JSZip();
+        const filteredFileUrls = fileUrls
+            .filter((href: string) => {
+                const letter = href.split('').pop();
+                return letter !== '/';
+            });
+
+        filteredFileUrls
+            .map((href: string) => {
+                axios.get(href).then(response => response).then(({ data }: any) => {
+                    const splittedByDot = href.split('.');
+                    if (splittedByDot[splittedByDot.length - 1] !== 'json') {
+                        if (filteredFileUrls.length === id) {
+                            zip.file(download[id - 1], data);
+                            zip.generateAsync({ type: 'blob' }).then((content) => {
+                                FileSaver.saveAs(content, `download-${props.currentCollectionUuid}.zip`);
+                            });
+                        } else {
+                            zip.file(download[id - 1], data);
+                            zip.generateAsync({ type: 'blob' });
+                        }
                     } else {
-                        zip.file(download[id - 1], data);
+                        zip.file(download[id - 1], JSON.stringify(data));
                         zip.generateAsync({ type: 'blob' });
                     }
-                } else {
-                    zip.file(download[id - 1], JSON.stringify(data));
-                    zip.generateAsync({ type: 'blob' });
-                }
-                id++;
+                    id++;
+                });
             });
-        });
     };
 
     return props.href || props.kind === 'files'