2018-06-07 23:56:11 +00:00
|
|
|
import { shallowMount } from '@vue/test-utils';
|
|
|
|
import ExplorerNode from '../../../../src/components/ExplorerNode';
|
|
|
|
import store from '../../../../src/store';
|
2018-07-03 23:41:24 +00:00
|
|
|
import workspaceSvc from '../../../../src/services/workspaceSvc';
|
2018-06-07 23:56:11 +00:00
|
|
|
import explorerSvc from '../../../../src/services/explorerSvc';
|
|
|
|
import specUtils from '../specUtils';
|
|
|
|
|
|
|
|
const makeFileNode = async () => {
|
2018-07-03 23:41:24 +00:00
|
|
|
const file = await workspaceSvc.createFile({}, true);
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = store.getters['explorer/nodeMap'][file.id];
|
|
|
|
expect(node.item.id).toEqual(file.id);
|
|
|
|
return node;
|
|
|
|
};
|
|
|
|
|
|
|
|
const makeFolderNode = async () => {
|
2018-07-03 23:41:24 +00:00
|
|
|
const folder = await workspaceSvc.storeItem({ type: 'folder' });
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = store.getters['explorer/nodeMap'][folder.id];
|
|
|
|
expect(node.item.id).toEqual(folder.id);
|
|
|
|
return node;
|
|
|
|
};
|
|
|
|
|
|
|
|
const mount = node => shallowMount(ExplorerNode, {
|
|
|
|
store,
|
|
|
|
propsData: { node, depth: 1 },
|
|
|
|
});
|
|
|
|
const mountAndSelect = (node) => {
|
|
|
|
const wrapper = mount(node);
|
|
|
|
wrapper.find('.explorer-node__item').trigger('click');
|
|
|
|
expect(store.getters['explorer/selectedNode'].item.id).toEqual(node.item.id);
|
|
|
|
expect(wrapper.classes()).toContain('explorer-node--selected');
|
|
|
|
return wrapper;
|
|
|
|
};
|
|
|
|
|
|
|
|
const dragAndDrop = (sourceItem, targetItem) => {
|
|
|
|
const sourceNode = store.getters['explorer/nodeMap'][sourceItem.id];
|
|
|
|
mountAndSelect(sourceNode).find('.explorer-node__item').trigger('dragstart', {
|
|
|
|
dataTransfer: { setData: () => {} },
|
|
|
|
});
|
|
|
|
expect(store.state.explorer.dragSourceId).toEqual(sourceItem.id);
|
|
|
|
const targetNode = store.getters['explorer/nodeMap'][targetItem.id];
|
|
|
|
const wrapper = mount(targetNode);
|
|
|
|
wrapper.trigger('dragenter');
|
|
|
|
expect(store.state.explorer.dragTargetId).toEqual(targetItem.id);
|
|
|
|
wrapper.trigger('drop');
|
|
|
|
const expectedParentId = targetItem.type === 'file' ? targetItem.parentId : targetItem.id;
|
|
|
|
expect(store.getters['explorer/selectedNode'].item.parentId).toEqual(expectedParentId);
|
|
|
|
};
|
|
|
|
|
|
|
|
describe('ExplorerNode.vue', () => {
|
|
|
|
const modifiedName = 'Name';
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should open file on select after a timeout', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = await makeFileNode();
|
|
|
|
mountAndSelect(node);
|
|
|
|
expect(store.getters['file/current'].id).not.toEqual(node.item.id);
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 10));
|
|
|
|
expect(store.getters['file/current'].id).toEqual(node.item.id);
|
2019-06-29 16:33:21 +00:00
|
|
|
await specUtils.expectBadge('switchFile');
|
2018-06-07 23:56:11 +00:00
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should not open already open file', async () => {
|
|
|
|
const node = await makeFileNode();
|
|
|
|
store.commit('file/setCurrentId', node.item.id);
|
|
|
|
mountAndSelect(node);
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 10));
|
|
|
|
expect(store.getters['file/current'].id).toEqual(node.item.id);
|
|
|
|
await specUtils.expectBadge('switchFile', false);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should open folder on select after a timeout', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = await makeFolderNode();
|
|
|
|
const wrapper = mountAndSelect(node);
|
|
|
|
expect(wrapper.classes()).not.toContain('explorer-node--open');
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 10));
|
|
|
|
expect(wrapper.classes()).toContain('explorer-node--open');
|
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should open folder on new child', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = await makeFolderNode();
|
|
|
|
const wrapper = mountAndSelect(node);
|
|
|
|
// Close the folder
|
|
|
|
wrapper.find('.explorer-node__item').trigger('click');
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 10));
|
|
|
|
expect(wrapper.classes()).not.toContain('explorer-node--open');
|
|
|
|
explorerSvc.newItem();
|
|
|
|
expect(wrapper.classes()).toContain('explorer-node--open');
|
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should create new file in a folder', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = await makeFolderNode();
|
|
|
|
const wrapper = mount(node);
|
|
|
|
wrapper.trigger('contextmenu');
|
|
|
|
await specUtils.resolveContextMenu('New file');
|
2018-08-09 15:42:17 +00:00
|
|
|
expect(wrapper.contains('.explorer-node__new-child')).toBe(true);
|
2018-06-07 23:56:11 +00:00
|
|
|
store.commit('explorer/setNewItemName', modifiedName);
|
2018-08-09 15:42:17 +00:00
|
|
|
wrapper.find('.explorer-node__new-child .text-input').trigger('blur');
|
2018-06-07 23:56:11 +00:00
|
|
|
await new Promise(resolve => setTimeout(resolve, 1));
|
|
|
|
expect(store.getters['explorer/selectedNode'].item).toMatchObject({
|
|
|
|
name: modifiedName,
|
|
|
|
type: 'file',
|
|
|
|
parentId: node.item.id,
|
|
|
|
});
|
2018-08-09 15:42:17 +00:00
|
|
|
expect(wrapper.contains('.explorer-node__new-child')).toBe(false);
|
2019-06-29 16:33:21 +00:00
|
|
|
await specUtils.expectBadge('createFile');
|
2018-06-07 23:56:11 +00:00
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should cancel file creation on escape', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = await makeFolderNode();
|
|
|
|
const wrapper = mount(node);
|
|
|
|
wrapper.trigger('contextmenu');
|
|
|
|
await specUtils.resolveContextMenu('New file');
|
2018-08-09 15:42:17 +00:00
|
|
|
expect(wrapper.contains('.explorer-node__new-child')).toBe(true);
|
2018-06-07 23:56:11 +00:00
|
|
|
store.commit('explorer/setNewItemName', modifiedName);
|
2018-08-09 15:42:17 +00:00
|
|
|
wrapper.find('.explorer-node__new-child .text-input').trigger('keydown', {
|
2018-06-07 23:56:11 +00:00
|
|
|
keyCode: 27,
|
|
|
|
});
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 1));
|
|
|
|
expect(store.getters['explorer/selectedNode'].item).not.toMatchObject({
|
|
|
|
name: 'modifiedName',
|
|
|
|
type: 'file',
|
|
|
|
parentId: node.item.id,
|
|
|
|
});
|
2018-08-09 15:42:17 +00:00
|
|
|
expect(wrapper.contains('.explorer-node__new-child')).toBe(false);
|
2019-06-29 16:33:21 +00:00
|
|
|
await specUtils.expectBadge('createFile', false);
|
2018-06-07 23:56:11 +00:00
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should not create new file in a file', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = await makeFileNode();
|
|
|
|
mount(node).trigger('contextmenu');
|
|
|
|
expect(specUtils.getContextMenuItem('New file').disabled).toBe(true);
|
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should not create new file in the trash folder', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = store.getters['explorer/nodeMap'].trash;
|
|
|
|
mount(node).trigger('contextmenu');
|
|
|
|
expect(specUtils.getContextMenuItem('New file').disabled).toBe(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should create new folder in folder', async () => {
|
|
|
|
const node = await makeFolderNode();
|
|
|
|
const wrapper = mount(node);
|
|
|
|
wrapper.trigger('contextmenu');
|
|
|
|
await specUtils.resolveContextMenu('New folder');
|
|
|
|
expect(wrapper.contains('.explorer-node__new-child--folder')).toBe(true);
|
|
|
|
store.commit('explorer/setNewItemName', modifiedName);
|
|
|
|
wrapper.find('.explorer-node__new-child--folder .text-input').trigger('blur');
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 1));
|
|
|
|
expect(store.getters['explorer/selectedNode'].item).toMatchObject({
|
|
|
|
name: modifiedName,
|
|
|
|
type: 'folder',
|
|
|
|
parentId: node.item.id,
|
|
|
|
});
|
|
|
|
expect(wrapper.contains('.explorer-node__new-child--folder')).toBe(false);
|
2019-06-29 16:33:21 +00:00
|
|
|
await specUtils.expectBadge('createFolder');
|
2018-06-07 23:56:11 +00:00
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should cancel folder creation on escape', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = await makeFolderNode();
|
|
|
|
const wrapper = mount(node);
|
|
|
|
wrapper.trigger('contextmenu');
|
|
|
|
await specUtils.resolveContextMenu('New folder');
|
|
|
|
expect(wrapper.contains('.explorer-node__new-child--folder')).toBe(true);
|
|
|
|
store.commit('explorer/setNewItemName', modifiedName);
|
|
|
|
wrapper.find('.explorer-node__new-child--folder .text-input').trigger('keydown', {
|
|
|
|
keyCode: 27,
|
|
|
|
});
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 1));
|
|
|
|
expect(store.getters['explorer/selectedNode'].item).not.toMatchObject({
|
|
|
|
name: modifiedName,
|
|
|
|
type: 'folder',
|
|
|
|
parentId: node.item.id,
|
|
|
|
});
|
|
|
|
expect(wrapper.contains('.explorer-node__new-child--folder')).toBe(false);
|
2019-06-29 16:33:21 +00:00
|
|
|
await specUtils.expectBadge('createFolder', false);
|
2018-06-07 23:56:11 +00:00
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should not create new folder in a file', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = await makeFileNode();
|
|
|
|
mount(node).trigger('contextmenu');
|
|
|
|
expect(specUtils.getContextMenuItem('New folder').disabled).toBe(true);
|
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should not create new folder in the trash folder', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = store.getters['explorer/nodeMap'].trash;
|
|
|
|
mount(node).trigger('contextmenu');
|
|
|
|
expect(specUtils.getContextMenuItem('New folder').disabled).toBe(true);
|
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should not create new folder in the temp folder', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = store.getters['explorer/nodeMap'].temp;
|
|
|
|
mount(node).trigger('contextmenu');
|
|
|
|
expect(specUtils.getContextMenuItem('New folder').disabled).toBe(true);
|
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should rename file', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = await makeFileNode();
|
|
|
|
const wrapper = mount(node);
|
|
|
|
wrapper.trigger('contextmenu');
|
|
|
|
await specUtils.resolveContextMenu('Rename');
|
|
|
|
expect(wrapper.contains('.explorer-node__item-editor')).toBe(true);
|
|
|
|
wrapper.setData({ editingValue: modifiedName });
|
|
|
|
wrapper.find('.explorer-node__item-editor .text-input').trigger('blur');
|
|
|
|
expect(store.getters['explorer/selectedNode'].item.name).toEqual(modifiedName);
|
2019-06-29 16:33:21 +00:00
|
|
|
await specUtils.expectBadge('renameFile');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should cancel rename file on escape', async () => {
|
|
|
|
const node = await makeFileNode();
|
|
|
|
const wrapper = mount(node);
|
|
|
|
wrapper.trigger('contextmenu');
|
|
|
|
await specUtils.resolveContextMenu('Rename');
|
|
|
|
expect(wrapper.contains('.explorer-node__item-editor')).toBe(true);
|
|
|
|
wrapper.setData({ editingValue: modifiedName });
|
|
|
|
wrapper.find('.explorer-node__item-editor .text-input').trigger('keydown', {
|
|
|
|
keyCode: 27,
|
|
|
|
});
|
|
|
|
expect(store.getters['explorer/selectedNode'].item.name).not.toEqual(modifiedName);
|
|
|
|
await specUtils.expectBadge('renameFile', false);
|
2018-06-07 23:56:11 +00:00
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should rename folder', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const node = await makeFolderNode();
|
|
|
|
const wrapper = mount(node);
|
|
|
|
wrapper.trigger('contextmenu');
|
|
|
|
await specUtils.resolveContextMenu('Rename');
|
|
|
|
expect(wrapper.contains('.explorer-node__item-editor')).toBe(true);
|
|
|
|
wrapper.setData({ editingValue: modifiedName });
|
|
|
|
wrapper.find('.explorer-node__item-editor .text-input').trigger('blur');
|
|
|
|
expect(store.getters['explorer/selectedNode'].item.name).toEqual(modifiedName);
|
2019-06-29 16:33:21 +00:00
|
|
|
await specUtils.expectBadge('renameFolder');
|
2018-06-07 23:56:11 +00:00
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should cancel rename folder on escape', async () => {
|
|
|
|
const node = await makeFolderNode();
|
2018-06-07 23:56:11 +00:00
|
|
|
const wrapper = mount(node);
|
|
|
|
wrapper.trigger('contextmenu');
|
|
|
|
await specUtils.resolveContextMenu('Rename');
|
|
|
|
expect(wrapper.contains('.explorer-node__item-editor')).toBe(true);
|
|
|
|
wrapper.setData({ editingValue: modifiedName });
|
|
|
|
wrapper.find('.explorer-node__item-editor .text-input').trigger('keydown', {
|
|
|
|
keyCode: 27,
|
|
|
|
});
|
|
|
|
expect(store.getters['explorer/selectedNode'].item.name).not.toEqual(modifiedName);
|
2019-06-29 16:33:21 +00:00
|
|
|
await specUtils.expectBadge('renameFolder', false);
|
2018-06-07 23:56:11 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it('should not rename the trash folder', async () => {
|
|
|
|
const node = store.getters['explorer/nodeMap'].trash;
|
|
|
|
mount(node).trigger('contextmenu');
|
|
|
|
expect(specUtils.getContextMenuItem('Rename').disabled).toBe(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should not rename the temp folder', async () => {
|
|
|
|
const node = store.getters['explorer/nodeMap'].temp;
|
|
|
|
mount(node).trigger('contextmenu');
|
|
|
|
expect(specUtils.getContextMenuItem('Rename').disabled).toBe(true);
|
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should move file into a folder', async () => {
|
2018-07-03 23:41:24 +00:00
|
|
|
const sourceItem = await workspaceSvc.createFile({}, true);
|
|
|
|
const targetItem = await workspaceSvc.storeItem({ type: 'folder' });
|
2018-06-07 23:56:11 +00:00
|
|
|
dragAndDrop(sourceItem, targetItem);
|
2019-06-29 16:33:21 +00:00
|
|
|
await specUtils.expectBadge('moveFile');
|
2018-06-07 23:56:11 +00:00
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should move folder into a folder', async () => {
|
2018-07-03 23:41:24 +00:00
|
|
|
const sourceItem = await workspaceSvc.storeItem({ type: 'folder' });
|
|
|
|
const targetItem = await workspaceSvc.storeItem({ type: 'folder' });
|
2018-06-07 23:56:11 +00:00
|
|
|
dragAndDrop(sourceItem, targetItem);
|
2019-06-29 16:33:21 +00:00
|
|
|
await specUtils.expectBadge('moveFolder');
|
2018-06-07 23:56:11 +00:00
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should move file into a file parent folder', async () => {
|
2018-07-03 23:41:24 +00:00
|
|
|
const targetItem = await workspaceSvc.storeItem({ type: 'folder' });
|
|
|
|
const file = await workspaceSvc.createFile({ parentId: targetItem.id }, true);
|
|
|
|
const sourceItem = await workspaceSvc.createFile({}, true);
|
2018-06-07 23:56:11 +00:00
|
|
|
dragAndDrop(sourceItem, file);
|
2019-06-29 16:33:21 +00:00
|
|
|
await specUtils.expectBadge('moveFile');
|
2018-06-07 23:56:11 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it('should not move the trash folder', async () => {
|
|
|
|
const sourceNode = store.getters['explorer/nodeMap'].trash;
|
|
|
|
mountAndSelect(sourceNode).find('.explorer-node__item').trigger('dragstart');
|
|
|
|
expect(store.state.explorer.dragSourceId).not.toEqual('trash');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should not move the temp folder', async () => {
|
|
|
|
const sourceNode = store.getters['explorer/nodeMap'].temp;
|
|
|
|
mountAndSelect(sourceNode).find('.explorer-node__item').trigger('dragstart');
|
|
|
|
expect(store.state.explorer.dragSourceId).not.toEqual('temp');
|
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should not move file to the temp folder', async () => {
|
2018-06-07 23:56:11 +00:00
|
|
|
const targetNode = store.getters['explorer/nodeMap'].temp;
|
|
|
|
const wrapper = mount(targetNode);
|
|
|
|
wrapper.trigger('dragenter');
|
|
|
|
expect(store.state.explorer.dragTargetId).not.toEqual('temp');
|
|
|
|
});
|
|
|
|
|
2019-06-29 16:33:21 +00:00
|
|
|
it('should not move file to a file in the temp folder', async () => {
|
2018-07-03 23:41:24 +00:00
|
|
|
const file = await workspaceSvc.createFile({ parentId: 'temp' }, true);
|
2018-06-07 23:56:11 +00:00
|
|
|
const targetNode = store.getters['explorer/nodeMap'][file.id];
|
|
|
|
const wrapper = mount(targetNode);
|
|
|
|
wrapper.trigger('dragenter');
|
|
|
|
expect(store.state.explorer.dragTargetId).not.toEqual(file.id);
|
|
|
|
});
|
|
|
|
});
|