Fixed test
This commit is contained in:
parent
952ceaa76c
commit
bdb01f407b
@ -198,7 +198,7 @@ export default {
|
|||||||
.modal__inner-2 {
|
.modal__inner-2 {
|
||||||
margin: 40px 10px 100px;
|
margin: 40px 10px 100px;
|
||||||
background-color: #f8f8f8;
|
background-color: #f8f8f8;
|
||||||
padding: 40px 50px 30px;
|
padding: 50px 50px 40px;
|
||||||
border-radius: $border-radius-base;
|
border-radius: $border-radius-base;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
<menu-entry @click.native="addCouchdbWorkspace">
|
<menu-entry @click.native="addCouchdbWorkspace">
|
||||||
<icon-provider slot="icon" provider-id="couchdbWorkspace"></icon-provider>
|
<icon-provider slot="icon" provider-id="couchdbWorkspace"></icon-provider>
|
||||||
<div>CouchDB workspace</div>
|
<div>CouchDB workspace</div>
|
||||||
<span>Add a workspace synced with your CouchDB database.</span>
|
<span>Add a workspace synced with a CouchDB database.</span>
|
||||||
</menu-entry>
|
</menu-entry>
|
||||||
<menu-entry @click.native="addGithubWorkspace">
|
<menu-entry @click.native="addGithubWorkspace">
|
||||||
<icon-provider slot="icon" provider-id="githubWorkspace"></icon-provider>
|
<icon-provider slot="icon" provider-id="githubWorkspace"></icon-provider>
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal__info">
|
<div class="modal__info">
|
||||||
<b>ProTip:</b> Workspaces are accessible <b>offline</b> after their first use.
|
<b>ProTip:</b> A workspace is accessible <b>offline</b> once it has been opened for the first time.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal__button-bar">
|
<div class="modal__button-bar">
|
||||||
|
@ -51,11 +51,11 @@ export default {
|
|||||||
|
|
||||||
.modal__close-button {
|
.modal__close-button {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 7px;
|
top: 8px;
|
||||||
right: 7px;
|
right: 8px;
|
||||||
color: rgba(0, 0, 0, 0.5);
|
color: rgba(0, 0, 0, 0.5);
|
||||||
width: 30px;
|
width: 32px;
|
||||||
height: 30px;
|
height: 32px;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
|
|
||||||
&:active,
|
&:active,
|
||||||
|
@ -144,11 +144,11 @@ export default new Provider({
|
|||||||
let itemId = idsByPath[path];
|
let itemId = idsByPath[path];
|
||||||
if (!itemId) {
|
if (!itemId) {
|
||||||
const existingItemId = itemIdsByGitPath[path];
|
const existingItemId = itemIdsByGitPath[path];
|
||||||
// We can replace the item only if it was already synced
|
|
||||||
if (existingItemId
|
if (existingItemId
|
||||||
&& (syncDataByPath[path]
|
// Reuse a file ID only if it has already been synced
|
||||||
// Content may have already be synced
|
&& (!isFile || syncDataByPath[path]
|
||||||
|| (isFile && syncDataByPath[`/${path}`]))
|
// Content may have already been synced
|
||||||
|
|| syncDataByPath[`/${path}`])
|
||||||
) {
|
) {
|
||||||
itemId = existingItemId;
|
itemId = existingItemId;
|
||||||
} else {
|
} else {
|
||||||
@ -332,7 +332,7 @@ export default new Provider({
|
|||||||
|
|
||||||
// Files and folders are not in git, only contents
|
// Files and folders are not in git, only contents
|
||||||
if (item.type === 'file' || item.type === 'folder') {
|
if (item.type === 'file' || item.type === 'folder') {
|
||||||
return syncData;
|
return { syncData };
|
||||||
}
|
}
|
||||||
|
|
||||||
// locations are stored as paths, so we upload an empty file
|
// locations are stored as paths, so we upload an empty file
|
||||||
@ -346,9 +346,7 @@ export default new Provider({
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Return sync data to save
|
// Return sync data to save
|
||||||
return {
|
return { syncData };
|
||||||
syncData,
|
|
||||||
};
|
|
||||||
},
|
},
|
||||||
async removeWorkspaceItem({ syncData }) {
|
async removeWorkspaceItem({ syncData }) {
|
||||||
if (treeShaMap[syncData.id]) {
|
if (treeShaMap[syncData.id]) {
|
||||||
|
@ -649,19 +649,22 @@ const syncWorkspace = async (skipContents = false) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const syncDataByItemId = store.getters['data/syncDataByItemId'];
|
const syncDataByItemId = store.getters['data/syncDataByItemId'];
|
||||||
|
const isGit = !!store.getters['workspace/currentWorkspaceIsGit'];
|
||||||
const [changedItem, syncDataToUpdate] = utils.someResult(
|
const [changedItem, syncDataToUpdate] = utils.someResult(
|
||||||
Object.entries(storeItemMap),
|
Object.entries(storeItemMap),
|
||||||
([id, item]) => {
|
([id, item]) => {
|
||||||
const syncData = syncDataByItemId[id];
|
const syncData = syncDataByItemId[id];
|
||||||
if ((!syncData || syncData.hash !== item.hash)
|
if ((syncData && syncData.hash === item.hash)
|
||||||
// Add file/folder if parent has been added
|
// Add file/folder only if parent folder has been added
|
||||||
&& (!storeItemMap[item.parentId] || syncDataByItemId[item.parentId])
|
|| (!isGit && storeItemMap[item.parentId] && !syncDataByItemId[item.parentId])
|
||||||
// Add file if content has been added
|
// Don't create folder if it's a git workspace
|
||||||
&& (item.type !== 'file' || syncDataByItemId[`${id}/content`])
|
|| (isGit && item.type === 'folder')
|
||||||
|
// Add file only if content has been added
|
||||||
|
|| (item.type === 'file' && !syncDataByItemId[`${id}/content`])
|
||||||
) {
|
) {
|
||||||
return [item, syncData];
|
return null;
|
||||||
}
|
}
|
||||||
return null;
|
return [item, syncData];
|
||||||
},
|
},
|
||||||
) || [];
|
) || [];
|
||||||
|
|
||||||
@ -695,16 +698,15 @@ const syncWorkspace = async (skipContents = false) => {
|
|||||||
const syncDataToRemove = utils.deepCopy(utils.someResult(
|
const syncDataToRemove = utils.deepCopy(utils.someResult(
|
||||||
Object.values(syncDataById),
|
Object.values(syncDataById),
|
||||||
(syncData) => {
|
(syncData) => {
|
||||||
if (!getItem(syncData)
|
if (getItem(syncData)
|
||||||
// We don't want to delete data items, especially on first sync
|
// We don't want to delete data items, especially on first sync
|
||||||
&& syncData.type !== 'data'
|
|| syncData.type === 'data'
|
||||||
// Remove content only if file has been removed
|
// Remove content only if file has been removed
|
||||||
&& (syncData.type !== 'content'
|
|| (syncData.type === 'content' && getFileItem(syncData))
|
||||||
|| !getFileItem(syncData))
|
|
||||||
) {
|
) {
|
||||||
return syncData;
|
return null;
|
||||||
}
|
}
|
||||||
return null;
|
return syncData;
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
|
|
||||||
@ -714,9 +716,9 @@ const syncWorkspace = async (skipContents = false) => {
|
|||||||
syncData: syncDataToRemove,
|
syncData: syncDataToRemove,
|
||||||
ifNotTooLate,
|
ifNotTooLate,
|
||||||
});
|
});
|
||||||
const syncDataCopy = { ...store.getters['data/syncDataById'] };
|
const syncDataByIdCopy = { ...store.getters['data/syncDataById'] };
|
||||||
delete syncDataCopy[syncDataToRemove.id];
|
delete syncDataByIdCopy[syncDataToRemove.id];
|
||||||
store.dispatch('data/setSyncDataById', syncDataCopy);
|
store.dispatch('data/setSyncDataById', syncDataByIdCopy);
|
||||||
return true;
|
return true;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ const select = (id) => {
|
|||||||
};
|
};
|
||||||
const ensureExists = file => expect(store.getters.allItemsById).toHaveProperty(file.id);
|
const ensureExists = file => expect(store.getters.allItemsById).toHaveProperty(file.id);
|
||||||
const ensureNotExists = file => expect(store.getters.allItemsById).not.toHaveProperty(file.id);
|
const ensureNotExists = file => expect(store.getters.allItemsById).not.toHaveProperty(file.id);
|
||||||
|
const refreshItem = item => store.getters.allItemsById[item.id];
|
||||||
|
|
||||||
describe('Explorer.vue', () => {
|
describe('Explorer.vue', () => {
|
||||||
it('should create new files in the root folder', () => {
|
it('should create new files in the root folder', () => {
|
||||||
@ -25,7 +26,7 @@ describe('Explorer.vue', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should create new files in a folder', async () => {
|
it('should create new files in a folder', async () => {
|
||||||
const folder = await fileSvc.storeItem({ type: 'folder' });
|
const folder = await workspaceSvc.storeItem({ type: 'folder' });
|
||||||
const wrapper = mount();
|
const wrapper = mount();
|
||||||
select(folder.id);
|
select(folder.id);
|
||||||
wrapper.find('.side-title__button--new-file').trigger('click');
|
wrapper.find('.side-title__button--new-file').trigger('click');
|
||||||
@ -94,7 +95,7 @@ describe('Explorer.vue', () => {
|
|||||||
select(file.id);
|
select(file.id);
|
||||||
wrapper.find('.side-title__button--delete').trigger('click');
|
wrapper.find('.side-title__button--delete').trigger('click');
|
||||||
ensureExists(file);
|
ensureExists(file);
|
||||||
expect(file.parentId).toEqual('trash');
|
expect(refreshItem(file).parentId).toEqual('trash');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not delete the trash folder', async () => {
|
it('should not delete the trash folder', async () => {
|
||||||
@ -142,7 +143,7 @@ describe('Explorer.vue', () => {
|
|||||||
ensureNotExists(folder);
|
ensureNotExists(folder);
|
||||||
// Make sure file has been moved to Trash
|
// Make sure file has been moved to Trash
|
||||||
ensureExists(file);
|
ensureExists(file);
|
||||||
expect(file.parentId).toEqual('trash');
|
expect(refreshItem(file).parentId).toEqual('trash');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should rename files', async () => {
|
it('should rename files', async () => {
|
||||||
|
@ -81,16 +81,16 @@ describe('ExplorerNode.vue', () => {
|
|||||||
const wrapper = mount(node);
|
const wrapper = mount(node);
|
||||||
wrapper.trigger('contextmenu');
|
wrapper.trigger('contextmenu');
|
||||||
await specUtils.resolveContextMenu('New file');
|
await specUtils.resolveContextMenu('New file');
|
||||||
expect(wrapper.contains('.explorer-node__new-child--file')).toBe(true);
|
expect(wrapper.contains('.explorer-node__new-child')).toBe(true);
|
||||||
store.commit('explorer/setNewItemName', modifiedName);
|
store.commit('explorer/setNewItemName', modifiedName);
|
||||||
wrapper.find('.explorer-node__new-child--file .text-input').trigger('blur');
|
wrapper.find('.explorer-node__new-child .text-input').trigger('blur');
|
||||||
await new Promise(resolve => setTimeout(resolve, 1));
|
await new Promise(resolve => setTimeout(resolve, 1));
|
||||||
expect(store.getters['explorer/selectedNode'].item).toMatchObject({
|
expect(store.getters['explorer/selectedNode'].item).toMatchObject({
|
||||||
name: modifiedName,
|
name: modifiedName,
|
||||||
type: 'file',
|
type: 'file',
|
||||||
parentId: node.item.id,
|
parentId: node.item.id,
|
||||||
});
|
});
|
||||||
expect(wrapper.contains('.explorer-node__new-child--file')).toBe(false);
|
expect(wrapper.contains('.explorer-node__new-child')).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should cancel a file creation on escape', async () => {
|
it('should cancel a file creation on escape', async () => {
|
||||||
@ -98,9 +98,9 @@ describe('ExplorerNode.vue', () => {
|
|||||||
const wrapper = mount(node);
|
const wrapper = mount(node);
|
||||||
wrapper.trigger('contextmenu');
|
wrapper.trigger('contextmenu');
|
||||||
await specUtils.resolveContextMenu('New file');
|
await specUtils.resolveContextMenu('New file');
|
||||||
expect(wrapper.contains('.explorer-node__new-child--file')).toBe(true);
|
expect(wrapper.contains('.explorer-node__new-child')).toBe(true);
|
||||||
store.commit('explorer/setNewItemName', modifiedName);
|
store.commit('explorer/setNewItemName', modifiedName);
|
||||||
wrapper.find('.explorer-node__new-child--file .text-input').trigger('keydown', {
|
wrapper.find('.explorer-node__new-child .text-input').trigger('keydown', {
|
||||||
keyCode: 27,
|
keyCode: 27,
|
||||||
});
|
});
|
||||||
await new Promise(resolve => setTimeout(resolve, 1));
|
await new Promise(resolve => setTimeout(resolve, 1));
|
||||||
@ -109,7 +109,7 @@ describe('ExplorerNode.vue', () => {
|
|||||||
type: 'file',
|
type: 'file',
|
||||||
parentId: node.item.id,
|
parentId: node.item.id,
|
||||||
});
|
});
|
||||||
expect(wrapper.contains('.explorer-node__new-child--file')).toBe(false);
|
expect(wrapper.contains('.explorer-node__new-child')).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not create new files in a file', async () => {
|
it('should not create new files in a file', async () => {
|
||||||
|
Loading…
Reference in New Issue
Block a user