cy.get('[data-cy=collection-files-panel-options-btn]')
.click()
cy.get('[data-cy=context-menu]')
- .should('contain', 'Download selected')
- .and(`${isWritable ? '' : 'not.'}contain`, 'Remove selected')
+ // .should('contain', 'Download selected')
+ .should(`${isWritable ? '' : 'not.'}contain`, 'Remove selected')
.type('{esc}'); // Collapse the options menu
// File item 'more options' button
cy.get('[data-cy=file-item-options-btn')
})
})
})
-})
\ No newline at end of file
+})
import { ContextMenuActionSet } from "~/views-components/context-menu/context-menu-action-set";
import { collectionPanelFilesAction, openMultipleFilesRemoveDialog } from "~/store/collection-panel/collection-panel-files/collection-panel-files-actions";
import { openCollectionPartialCopyDialog, openCollectionPartialCopyToSelectedCollectionDialog } from '~/store/collections/collection-partial-copy-actions';
-import { DownloadCollectionFileAction } from "~/views-components/context-menu/actions/download-collection-file-action";
+// import { DownloadCollectionFileAction } from "~/views-components/context-menu/actions/download-collection-file-action";
export const readOnlyCollectionFilesActionSet: ContextMenuActionSet = [[
{
dispatch(collectionPanelFilesAction.UNSELECT_ALL_COLLECTION_FILES());
}
},
- {
- component: DownloadCollectionFileAction,
- execute: () => { return; }
- },
+ // { // Disabled for now as we need to create backend version of this feature which will be less buggy
+ // component: DownloadCollectionFileAction,
+ // execute: () => { return; }
+ // },
{
name: "Create a new collection with selected",
execute: dispatch => {
--- /dev/null
+// 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
//
// 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';
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'