2018-05-09 12:01:36 +05:30
|
|
|
import Vue from 'vue';
|
2018-11-08 19:23:39 +05:30
|
|
|
import MockAdapter from 'axios-mock-adapter';
|
|
|
|
import axios from '~/lib/utils/axios_utils';
|
2020-03-13 15:44:24 +05:30
|
|
|
import { createStore } from '~/ide/stores';
|
2018-10-15 14:42:47 +05:30
|
|
|
import * as actions from '~/ide/stores/actions/file';
|
|
|
|
import * as types from '~/ide/stores/mutation_types';
|
2018-05-09 12:01:36 +05:30
|
|
|
import service from '~/ide/services';
|
|
|
|
import router from '~/ide/ide_router';
|
|
|
|
import eventHub from '~/ide/eventhub';
|
2020-03-13 15:44:24 +05:30
|
|
|
import { file } from '../../helpers';
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
const ORIGINAL_CONTENT = 'original content';
|
2019-07-31 22:56:46 +05:30
|
|
|
const RELATIVE_URL_ROOT = '/gitlab';
|
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
describe('IDE store file actions', () => {
|
2018-11-08 19:23:39 +05:30
|
|
|
let mock;
|
2019-07-31 22:56:46 +05:30
|
|
|
let originalGon;
|
2020-03-13 15:44:24 +05:30
|
|
|
let store;
|
2018-11-08 19:23:39 +05:30
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
beforeEach(() => {
|
2018-11-08 19:23:39 +05:30
|
|
|
mock = new MockAdapter(axios);
|
2019-07-31 22:56:46 +05:30
|
|
|
originalGon = window.gon;
|
|
|
|
window.gon = {
|
|
|
|
...window.gon,
|
|
|
|
relative_url_root: RELATIVE_URL_ROOT,
|
|
|
|
};
|
2018-11-08 19:23:39 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
store = createStore();
|
|
|
|
|
|
|
|
jest.spyOn(store, 'commit');
|
|
|
|
jest.spyOn(store, 'dispatch');
|
|
|
|
jest.spyOn(router, 'push').mockImplementation(() => {});
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(() => {
|
2018-11-08 19:23:39 +05:30
|
|
|
mock.restore();
|
2019-07-31 22:56:46 +05:30
|
|
|
window.gon = originalGon;
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
describe('closeFile', () => {
|
|
|
|
let localFile;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
localFile = file('testFile');
|
|
|
|
localFile.active = true;
|
|
|
|
localFile.opened = true;
|
|
|
|
localFile.parentTreeUrl = 'parentTreeUrl';
|
|
|
|
|
|
|
|
store.state.openFiles.push(localFile);
|
|
|
|
store.state.entries[localFile.path] = localFile;
|
|
|
|
});
|
|
|
|
|
|
|
|
it('closes open files', done => {
|
|
|
|
store
|
|
|
|
.dispatch('closeFile', localFile)
|
|
|
|
.then(() => {
|
|
|
|
expect(localFile.opened).toBeFalsy();
|
|
|
|
expect(localFile.active).toBeFalsy();
|
|
|
|
expect(store.state.openFiles.length).toBe(0);
|
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('closes file even if file has changes', done => {
|
|
|
|
store.state.changedFiles.push(localFile);
|
|
|
|
|
|
|
|
store
|
|
|
|
.dispatch('closeFile', localFile)
|
|
|
|
.then(Vue.nextTick)
|
|
|
|
.then(() => {
|
|
|
|
expect(store.state.openFiles.length).toBe(0);
|
|
|
|
expect(store.state.changedFiles.length).toBe(1);
|
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('closes file & opens next available file', done => {
|
|
|
|
const f = {
|
|
|
|
...file('newOpenFile'),
|
|
|
|
url: '/newOpenFile',
|
|
|
|
};
|
|
|
|
|
|
|
|
store.state.openFiles.push(f);
|
|
|
|
store.state.entries[f.path] = f;
|
|
|
|
|
|
|
|
store
|
|
|
|
.dispatch('closeFile', localFile)
|
|
|
|
.then(Vue.nextTick)
|
|
|
|
.then(() => {
|
|
|
|
expect(router.push).toHaveBeenCalledWith(`/project${f.url}`);
|
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('removes file if it pending', done => {
|
|
|
|
store.state.openFiles.push({
|
|
|
|
...localFile,
|
|
|
|
pending: true,
|
|
|
|
});
|
|
|
|
|
|
|
|
store
|
|
|
|
.dispatch('closeFile', localFile)
|
|
|
|
.then(() => {
|
|
|
|
expect(store.state.openFiles.length).toBe(0);
|
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('setFileActive', () => {
|
|
|
|
let localFile;
|
|
|
|
let scrollToTabSpy;
|
|
|
|
let oldScrollToTab;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2020-03-13 15:44:24 +05:30
|
|
|
scrollToTabSpy = jest.fn();
|
2018-05-09 12:01:36 +05:30
|
|
|
oldScrollToTab = store._actions.scrollToTab; // eslint-disable-line
|
|
|
|
store._actions.scrollToTab = [scrollToTabSpy]; // eslint-disable-line
|
|
|
|
|
|
|
|
localFile = file('setThisActive');
|
|
|
|
|
|
|
|
store.state.entries[localFile.path] = localFile;
|
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
store._actions.scrollToTab = oldScrollToTab; // eslint-disable-line
|
|
|
|
});
|
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
it('calls scrollToTab', () => {
|
2020-03-13 15:44:24 +05:30
|
|
|
const dispatch = jest.fn();
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
actions.setFileActive(
|
|
|
|
{ commit() {}, state: store.state, getters: store.getters, dispatch },
|
|
|
|
localFile.path,
|
|
|
|
);
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
expect(dispatch).toHaveBeenCalledWith('scrollToTab');
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
it('commits SET_FILE_ACTIVE', () => {
|
2020-03-13 15:44:24 +05:30
|
|
|
const commit = jest.fn();
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
actions.setFileActive(
|
|
|
|
{ commit, state: store.state, getters: store.getters, dispatch() {} },
|
|
|
|
localFile.path,
|
|
|
|
);
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
expect(commit).toHaveBeenCalledWith('SET_FILE_ACTIVE', {
|
|
|
|
path: localFile.path,
|
|
|
|
active: true,
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
it('sets current active file to not active', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
const f = file('newActive');
|
|
|
|
store.state.entries[f.path] = f;
|
|
|
|
localFile.active = true;
|
|
|
|
store.state.openFiles.push(localFile);
|
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
const commit = jest.fn();
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
actions.setFileActive(
|
|
|
|
{ commit, state: store.state, getters: store.getters, dispatch() {} },
|
|
|
|
f.path,
|
|
|
|
);
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
expect(commit).toHaveBeenCalledWith('SET_FILE_ACTIVE', {
|
|
|
|
path: localFile.path,
|
|
|
|
active: false,
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('getFileData', () => {
|
|
|
|
let localFile;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2020-03-13 15:44:24 +05:30
|
|
|
jest.spyOn(service, 'getFileData');
|
2018-05-09 12:01:36 +05:30
|
|
|
|
|
|
|
localFile = file(`newCreate-${Math.random()}`);
|
|
|
|
store.state.entries[localFile.path] = localFile;
|
2019-12-26 22:10:19 +05:30
|
|
|
|
|
|
|
store.state.currentProjectId = 'test/test';
|
|
|
|
store.state.currentBranchId = 'master';
|
|
|
|
|
|
|
|
store.state.projects['test/test'] = {
|
|
|
|
branches: {
|
|
|
|
master: {
|
|
|
|
commit: {
|
|
|
|
id: '7297abc',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
describe('call to service', () => {
|
|
|
|
const callExpectation = serviceCalled => {
|
|
|
|
store.dispatch('getFileData', { path: localFile.path });
|
|
|
|
|
|
|
|
if (serviceCalled) {
|
|
|
|
expect(service.getFileData).toHaveBeenCalled();
|
|
|
|
} else {
|
|
|
|
expect(service.getFileData).not.toHaveBeenCalled();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
service.getFileData.mockImplementation(() => new Promise(() => {}));
|
|
|
|
});
|
|
|
|
|
|
|
|
it("isn't called if file.raw exists", () => {
|
|
|
|
localFile.raw = 'raw data';
|
|
|
|
|
|
|
|
callExpectation(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("isn't called if file is a tempFile", () => {
|
|
|
|
localFile.raw = '';
|
|
|
|
localFile.tempFile = true;
|
|
|
|
|
|
|
|
callExpectation(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('is called if file is a tempFile but also renamed', () => {
|
|
|
|
localFile.raw = '';
|
|
|
|
localFile.tempFile = true;
|
|
|
|
localFile.prevPath = 'old_path';
|
|
|
|
|
|
|
|
callExpectation(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('is called if tempFile but file was deleted and readded', () => {
|
|
|
|
localFile.raw = '';
|
|
|
|
localFile.tempFile = true;
|
|
|
|
localFile.prevPath = 'old_path';
|
|
|
|
|
|
|
|
store.state.stagedFiles = [{ ...localFile, deleted: true }];
|
|
|
|
|
|
|
|
callExpectation(true);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
describe('success', () => {
|
|
|
|
beforeEach(() => {
|
2020-03-13 15:44:24 +05:30
|
|
|
mock.onGet(`${RELATIVE_URL_ROOT}/test/test/-/7297abc/${localFile.path}`).replyOnce(
|
2018-11-08 19:23:39 +05:30
|
|
|
200,
|
|
|
|
{
|
|
|
|
blame_path: 'blame_path',
|
|
|
|
commits_path: 'commits_path',
|
|
|
|
permalink: 'permalink',
|
|
|
|
raw_path: 'raw_path',
|
|
|
|
binary: false,
|
|
|
|
html: '123',
|
|
|
|
render_error: '',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'page-title': 'testing getFileData',
|
|
|
|
},
|
|
|
|
);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it('calls the service', done => {
|
|
|
|
store
|
|
|
|
.dispatch('getFileData', { path: localFile.path })
|
|
|
|
.then(() => {
|
2019-07-31 22:56:46 +05:30
|
|
|
expect(service.getFileData).toHaveBeenCalledWith(
|
2020-03-13 15:44:24 +05:30
|
|
|
`${RELATIVE_URL_ROOT}/test/test/-/7297abc/${localFile.path}`,
|
2019-07-31 22:56:46 +05:30
|
|
|
);
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it('sets the file data', done => {
|
|
|
|
store
|
|
|
|
.dispatch('getFileData', { path: localFile.path })
|
|
|
|
.then(() => {
|
|
|
|
expect(localFile.blamePath).toBe('blame_path');
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2019-12-26 22:10:19 +05:30
|
|
|
it('sets document title with the branchId', done => {
|
2018-11-08 19:23:39 +05:30
|
|
|
store
|
|
|
|
.dispatch('getFileData', { path: localFile.path })
|
|
|
|
.then(() => {
|
2019-12-26 22:10:19 +05:30
|
|
|
expect(document.title).toBe(`${localFile.path} · master · test/test · GitLab`);
|
2018-11-08 19:23:39 +05:30
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it('sets the file as active', done => {
|
|
|
|
store
|
|
|
|
.dispatch('getFileData', { path: localFile.path })
|
|
|
|
.then(() => {
|
|
|
|
expect(localFile.active).toBeTruthy();
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it('sets the file not as active if we pass makeFileActive false', done => {
|
|
|
|
store
|
|
|
|
.dispatch('getFileData', { path: localFile.path, makeFileActive: false })
|
|
|
|
.then(() => {
|
|
|
|
expect(localFile.active).toBeFalsy();
|
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('adds the file to open files', done => {
|
|
|
|
store
|
|
|
|
.dispatch('getFileData', { path: localFile.path })
|
|
|
|
.then(() => {
|
|
|
|
expect(store.state.openFiles.length).toBe(1);
|
|
|
|
expect(store.state.openFiles[0].name).toBe(localFile.name);
|
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
|
2019-09-30 21:07:59 +05:30
|
|
|
describe('Re-named success', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
localFile = file(`newCreate-${Math.random()}`);
|
|
|
|
localFile.url = `project/getFileDataURL`;
|
|
|
|
localFile.prevPath = 'old-dull-file';
|
|
|
|
localFile.path = 'new-shiny-file';
|
|
|
|
store.state.entries[localFile.path] = localFile;
|
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
mock.onGet(`${RELATIVE_URL_ROOT}/test/test/-/7297abc/old-dull-file`).replyOnce(
|
2019-09-30 21:07:59 +05:30
|
|
|
200,
|
|
|
|
{
|
|
|
|
blame_path: 'blame_path',
|
|
|
|
commits_path: 'commits_path',
|
|
|
|
permalink: 'permalink',
|
|
|
|
raw_path: 'raw_path',
|
|
|
|
binary: false,
|
|
|
|
html: '123',
|
|
|
|
render_error: '',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'page-title': 'testing old-dull-file',
|
|
|
|
},
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('sets document title considering `prevPath` on a file', done => {
|
|
|
|
store
|
|
|
|
.dispatch('getFileData', { path: localFile.path })
|
|
|
|
.then(() => {
|
2019-12-26 22:10:19 +05:30
|
|
|
expect(document.title).toBe(`new-shiny-file · master · test/test · GitLab`);
|
2019-09-30 21:07:59 +05:30
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
describe('error', () => {
|
|
|
|
beforeEach(() => {
|
2020-03-13 15:44:24 +05:30
|
|
|
mock.onGet(`${RELATIVE_URL_ROOT}/test/test/-/7297abc/${localFile.path}`).networkError();
|
2018-11-08 19:23:39 +05:30
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
it('dispatches error action', () => {
|
|
|
|
const dispatch = jest.fn();
|
2018-11-08 19:23:39 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
return actions
|
2019-12-26 22:10:19 +05:30
|
|
|
.getFileData(
|
|
|
|
{ state: store.state, commit() {}, dispatch, getters: store.getters },
|
|
|
|
{ path: localFile.path },
|
|
|
|
)
|
2018-11-08 19:23:39 +05:30
|
|
|
.then(() => {
|
|
|
|
expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
|
2020-03-13 15:44:24 +05:30
|
|
|
text: 'An error occurred while loading the file.',
|
|
|
|
action: expect.any(Function),
|
2018-11-08 19:23:39 +05:30
|
|
|
actionText: 'Please try again',
|
|
|
|
actionPayload: {
|
|
|
|
path: localFile.path,
|
|
|
|
makeFileActive: true,
|
|
|
|
},
|
|
|
|
});
|
2020-03-13 15:44:24 +05:30
|
|
|
});
|
2018-11-08 19:23:39 +05:30
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('getRawFileData', () => {
|
|
|
|
let tmpFile;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2020-03-13 15:44:24 +05:30
|
|
|
jest.spyOn(service, 'getRawFileData');
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-04-22 19:07:51 +05:30
|
|
|
tmpFile = { ...file('tmpFile'), rawPath: 'raw_path' };
|
2018-05-09 12:01:36 +05:30
|
|
|
store.state.entries[tmpFile.path] = tmpFile;
|
|
|
|
});
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
describe('success', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
mock.onGet(/(.*)/).replyOnce(200, 'raw');
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it('calls getRawFileData service method', done => {
|
|
|
|
store
|
|
|
|
.dispatch('getRawFileData', { path: tmpFile.path })
|
|
|
|
.then(() => {
|
|
|
|
expect(service.getRawFileData).toHaveBeenCalledWith(tmpFile);
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it('updates file raw data', done => {
|
|
|
|
store
|
|
|
|
.dispatch('getRawFileData', { path: tmpFile.path })
|
|
|
|
.then(() => {
|
|
|
|
expect(tmpFile.raw).toBe('raw');
|
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('calls also getBaseRawFileData service method', done => {
|
2020-03-13 15:44:24 +05:30
|
|
|
jest.spyOn(service, 'getBaseRawFileData').mockReturnValue(Promise.resolve('baseraw'));
|
2018-11-08 19:23:39 +05:30
|
|
|
|
2018-11-18 11:00:15 +05:30
|
|
|
store.state.currentProjectId = 'gitlab-org/gitlab-ce';
|
|
|
|
store.state.currentMergeRequestId = '1';
|
|
|
|
store.state.projects = {
|
|
|
|
'gitlab-org/gitlab-ce': {
|
|
|
|
mergeRequests: {
|
|
|
|
1: {
|
|
|
|
baseCommitSha: 'SHA',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
tmpFile.mrChange = { new_file: false };
|
|
|
|
|
|
|
|
store
|
2018-11-18 11:00:15 +05:30
|
|
|
.dispatch('getRawFileData', { path: tmpFile.path })
|
2018-11-08 19:23:39 +05:30
|
|
|
.then(() => {
|
|
|
|
expect(service.getBaseRawFileData).toHaveBeenCalledWith(tmpFile, 'SHA');
|
|
|
|
expect(tmpFile.baseRaw).toBe('baseraw');
|
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
describe('return JSON', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
mock.onGet(/(.*)/).replyOnce(200, JSON.stringify({ test: '123' }));
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it('does not parse returned JSON', done => {
|
|
|
|
store
|
|
|
|
.dispatch('getRawFileData', { path: tmpFile.path })
|
|
|
|
.then(() => {
|
|
|
|
expect(tmpFile.raw).toEqual('{"test":"123"}');
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
describe('error', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
mock.onGet(/(.*)/).networkError();
|
|
|
|
});
|
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
it('dispatches error action', () => {
|
|
|
|
const dispatch = jest.fn();
|
2018-11-08 19:23:39 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
return actions
|
|
|
|
.getRawFileData(
|
|
|
|
{ state: store.state, commit() {}, dispatch, getters: store.getters },
|
|
|
|
{ path: tmpFile.path },
|
|
|
|
)
|
2018-11-08 19:23:39 +05:30
|
|
|
.catch(() => {
|
|
|
|
expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
|
2020-03-13 15:44:24 +05:30
|
|
|
text: 'An error occurred while loading the file content.',
|
|
|
|
action: expect.any(Function),
|
2018-11-08 19:23:39 +05:30
|
|
|
actionText: 'Please try again',
|
|
|
|
actionPayload: {
|
|
|
|
path: tmpFile.path,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('changeFileContent', () => {
|
|
|
|
let tmpFile;
|
2020-03-13 15:44:24 +05:30
|
|
|
const callAction = (content = 'content\n') =>
|
|
|
|
store.dispatch('changeFileContent', { path: tmpFile.path, content });
|
2018-05-09 12:01:36 +05:30
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
tmpFile = file('tmpFile');
|
2019-12-26 22:10:19 +05:30
|
|
|
tmpFile.content = '\n';
|
|
|
|
tmpFile.raw = '\n';
|
2018-05-09 12:01:36 +05:30
|
|
|
store.state.entries[tmpFile.path] = tmpFile;
|
|
|
|
});
|
|
|
|
|
|
|
|
it('updates file content', done => {
|
2020-03-13 15:44:24 +05:30
|
|
|
callAction()
|
2019-12-26 22:10:19 +05:30
|
|
|
.then(() => {
|
|
|
|
expect(tmpFile.content).toBe('content\n');
|
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
it('adds file into stagedFiles array', done => {
|
2018-05-09 12:01:36 +05:30
|
|
|
store
|
|
|
|
.dispatch('changeFileContent', {
|
|
|
|
path: tmpFile.path,
|
|
|
|
content: 'content',
|
|
|
|
})
|
|
|
|
.then(() => {
|
2020-03-13 15:44:24 +05:30
|
|
|
expect(store.state.stagedFiles.length).toBe(1);
|
2018-05-09 12:01:36 +05:30
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
it('adds file not more than once into stagedFiles array', done => {
|
2018-05-09 12:01:36 +05:30
|
|
|
store
|
|
|
|
.dispatch('changeFileContent', {
|
|
|
|
path: tmpFile.path,
|
|
|
|
content: 'content',
|
|
|
|
})
|
|
|
|
.then(() =>
|
|
|
|
store.dispatch('changeFileContent', {
|
|
|
|
path: tmpFile.path,
|
|
|
|
content: 'content 123',
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
.then(() => {
|
2020-03-13 15:44:24 +05:30
|
|
|
expect(store.state.stagedFiles.length).toBe(1);
|
2018-05-09 12:01:36 +05:30
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('removes file from changedFiles array if not changed', done => {
|
|
|
|
store
|
|
|
|
.dispatch('changeFileContent', {
|
|
|
|
path: tmpFile.path,
|
2019-12-26 22:10:19 +05:30
|
|
|
content: 'content\n',
|
2018-05-09 12:01:36 +05:30
|
|
|
})
|
|
|
|
.then(() =>
|
|
|
|
store.dispatch('changeFileContent', {
|
|
|
|
path: tmpFile.path,
|
2019-12-26 22:10:19 +05:30
|
|
|
content: '\n',
|
2018-05-09 12:01:36 +05:30
|
|
|
}),
|
|
|
|
)
|
|
|
|
.then(() => {
|
|
|
|
expect(store.state.changedFiles.length).toBe(0);
|
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
2018-10-15 14:42:47 +05:30
|
|
|
|
|
|
|
it('bursts unused seal', done => {
|
|
|
|
store
|
|
|
|
.dispatch('changeFileContent', {
|
|
|
|
path: tmpFile.path,
|
|
|
|
content: 'content',
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(store.state.unusedSeal).toBe(false);
|
|
|
|
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
describe('with changed file', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
let tmpFile;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2020-03-13 15:44:24 +05:30
|
|
|
tmpFile = file('tempFile');
|
2018-05-09 12:01:36 +05:30
|
|
|
tmpFile.content = 'testing';
|
2020-03-13 15:44:24 +05:30
|
|
|
tmpFile.raw = ORIGINAL_CONTENT;
|
2018-05-09 12:01:36 +05:30
|
|
|
|
|
|
|
store.state.changedFiles.push(tmpFile);
|
|
|
|
store.state.entries[tmpFile.path] = tmpFile;
|
|
|
|
});
|
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
describe('restoreOriginalFile', () => {
|
|
|
|
it('resets file content', () =>
|
|
|
|
store.dispatch('restoreOriginalFile', tmpFile.path).then(() => {
|
|
|
|
expect(tmpFile.content).toBe(ORIGINAL_CONTENT);
|
|
|
|
}));
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
it('closes temp file and deletes it', () => {
|
|
|
|
tmpFile.tempFile = true;
|
|
|
|
tmpFile.opened = true;
|
|
|
|
tmpFile.parentPath = 'parentFile';
|
|
|
|
store.state.entries.parentFile = file('parentFile');
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
actions.restoreOriginalFile(store, tmpFile.path);
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
expect(store.dispatch).toHaveBeenCalledWith('closeFile', tmpFile);
|
|
|
|
expect(store.dispatch).toHaveBeenCalledWith('deleteEntry', tmpFile.path);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
describe('with renamed file', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
Object.assign(tmpFile, {
|
|
|
|
prevPath: 'parentPath/old_name',
|
|
|
|
prevName: 'old_name',
|
|
|
|
prevParentPath: 'parentPath',
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
store.state.entries.parentPath = file('parentPath');
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
actions.restoreOriginalFile(store, tmpFile.path);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
it('renames the file to its original name and closes it if it was open', () => {
|
|
|
|
expect(store.dispatch).toHaveBeenCalledWith('closeFile', tmpFile);
|
|
|
|
expect(store.dispatch).toHaveBeenCalledWith('renameEntry', {
|
|
|
|
path: 'tempFile',
|
|
|
|
name: 'old_name',
|
|
|
|
parentPath: 'parentPath',
|
|
|
|
});
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
it('resets file content', () => {
|
|
|
|
expect(tmpFile.content).toBe(ORIGINAL_CONTENT);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
describe('discardFileChanges', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
jest.spyOn(eventHub, '$on').mockImplementation(() => {});
|
|
|
|
jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
describe('with regular file', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
actions.discardFileChanges(store, tmpFile.path);
|
|
|
|
});
|
2018-10-15 14:42:47 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
it('restores original file', () => {
|
|
|
|
expect(store.dispatch).toHaveBeenCalledWith('restoreOriginalFile', tmpFile.path);
|
|
|
|
});
|
2018-10-15 14:42:47 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
it('removes file from changedFiles array', () => {
|
|
|
|
expect(store.state.changedFiles.length).toBe(0);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('does not push a new route', () => {
|
|
|
|
expect(router.push).not.toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('emits eventHub event to dispose cached model', () => {
|
|
|
|
actions.discardFileChanges(store, tmpFile.path);
|
|
|
|
|
|
|
|
expect(eventHub.$emit).toHaveBeenCalledWith(
|
|
|
|
`editor.update.model.new.content.${tmpFile.key}`,
|
|
|
|
ORIGINAL_CONTENT,
|
|
|
|
);
|
|
|
|
expect(eventHub.$emit).toHaveBeenCalledWith(
|
|
|
|
`editor.update.model.dispose.unstaged-${tmpFile.key}`,
|
|
|
|
ORIGINAL_CONTENT,
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
2018-10-15 14:42:47 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
describe('with active file', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
tmpFile.active = true;
|
|
|
|
store.state.openFiles.push(tmpFile);
|
2018-10-15 14:42:47 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
actions.discardFileChanges(store, tmpFile.path);
|
|
|
|
});
|
2018-10-15 14:42:47 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
it('pushes route for active file', () => {
|
|
|
|
expect(router.push).toHaveBeenCalledWith(`/project${tmpFile.url}`);
|
|
|
|
});
|
|
|
|
});
|
2018-10-15 14:42:47 +05:30
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('stageChange', () => {
|
2020-03-13 15:44:24 +05:30
|
|
|
it('calls STAGE_CHANGE with file path', () => {
|
|
|
|
const f = { ...file('path'), content: 'old' };
|
|
|
|
|
|
|
|
store.state.entries[f.path] = f;
|
|
|
|
|
|
|
|
actions.stageChange(store, 'path');
|
|
|
|
|
|
|
|
expect(store.commit).toHaveBeenCalledWith(
|
|
|
|
types.STAGE_CHANGE,
|
|
|
|
expect.objectContaining({ path: 'path' }),
|
2018-10-15 14:42:47 +05:30
|
|
|
);
|
2020-03-13 15:44:24 +05:30
|
|
|
expect(store.commit).toHaveBeenCalledWith(types.SET_LAST_COMMIT_MSG, '');
|
2018-10-15 14:42:47 +05:30
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('unstageChange', () => {
|
2020-03-13 15:44:24 +05:30
|
|
|
it('calls UNSTAGE_CHANGE with file path', () => {
|
|
|
|
const f = { ...file('path'), content: 'old' };
|
|
|
|
|
|
|
|
store.state.entries[f.path] = f;
|
|
|
|
store.state.stagedFiles.push({ f, content: 'new' });
|
|
|
|
|
|
|
|
actions.unstageChange(store, 'path');
|
|
|
|
|
|
|
|
expect(store.commit).toHaveBeenCalledWith(
|
|
|
|
types.UNSTAGE_CHANGE,
|
|
|
|
expect.objectContaining({ path: 'path' }),
|
2018-10-15 14:42:47 +05:30
|
|
|
);
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
describe('openPendingTab', () => {
|
|
|
|
let f;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
f = {
|
|
|
|
...file(),
|
|
|
|
projectId: '123',
|
|
|
|
};
|
|
|
|
|
|
|
|
store.state.entries[f.path] = f;
|
|
|
|
});
|
|
|
|
|
|
|
|
it('makes file pending in openFiles', done => {
|
|
|
|
store
|
2018-10-15 14:42:47 +05:30
|
|
|
.dispatch('openPendingTab', { file: f, keyPrefix: 'pending' })
|
2018-05-09 12:01:36 +05:30
|
|
|
.then(() => {
|
|
|
|
expect(store.state.openFiles[0].pending).toBe(true);
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns true when opened', done => {
|
|
|
|
store
|
2018-10-15 14:42:47 +05:30
|
|
|
.dispatch('openPendingTab', { file: f, keyPrefix: 'pending' })
|
2018-05-09 12:01:36 +05:30
|
|
|
.then(added => {
|
|
|
|
expect(added).toBe(true);
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
2018-10-15 14:42:47 +05:30
|
|
|
it('returns false when already opened', done => {
|
|
|
|
store.state.openFiles.push({
|
|
|
|
...f,
|
|
|
|
active: true,
|
|
|
|
key: `pending-${f.key}`,
|
|
|
|
});
|
|
|
|
|
|
|
|
store
|
|
|
|
.dispatch('openPendingTab', { file: f, keyPrefix: 'pending' })
|
|
|
|
.then(added => {
|
|
|
|
expect(added).toBe(false);
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
it('pushes router URL when added', done => {
|
|
|
|
store.state.currentBranchId = 'master';
|
|
|
|
|
|
|
|
store
|
2018-10-15 14:42:47 +05:30
|
|
|
.dispatch('openPendingTab', { file: f, keyPrefix: 'pending' })
|
2018-05-09 12:01:36 +05:30
|
|
|
.then(() => {
|
|
|
|
expect(router.push).toHaveBeenCalledWith('/project/123/tree/master/');
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('removePendingTab', () => {
|
|
|
|
let f;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2020-03-13 15:44:24 +05:30
|
|
|
jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
|
2018-05-09 12:01:36 +05:30
|
|
|
|
|
|
|
f = {
|
|
|
|
...file('pendingFile'),
|
|
|
|
pending: true,
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
it('removes pending file from open files', done => {
|
|
|
|
store.state.openFiles.push(f);
|
|
|
|
|
|
|
|
store
|
|
|
|
.dispatch('removePendingTab', f)
|
|
|
|
.then(() => {
|
|
|
|
expect(store.state.openFiles.length).toBe(0);
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('emits event to dispose model', done => {
|
|
|
|
store
|
|
|
|
.dispatch('removePendingTab', f)
|
|
|
|
.then(() => {
|
|
|
|
expect(eventHub.$emit).toHaveBeenCalledWith(`editor.update.model.dispose.${f.key}`);
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
2019-09-04 21:01:54 +05:30
|
|
|
|
|
|
|
describe('triggerFilesChange', () => {
|
|
|
|
beforeEach(() => {
|
2020-03-13 15:44:24 +05:30
|
|
|
jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
|
2019-09-04 21:01:54 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
it('emits event that files have changed', done => {
|
|
|
|
store
|
|
|
|
.dispatch('triggerFilesChange')
|
|
|
|
.then(() => {
|
|
|
|
expect(eventHub.$emit).toHaveBeenCalledWith('ide.files.change');
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
2018-05-09 12:01:36 +05:30
|
|
|
});
|