Commit fa8c82c7 authored by Phil Hughes's avatar Phil Hughes

added specs for file actions

in this it also removes Vue Resource from the IDE, axios is nicer to test
parent d255fd4f
import Vue from 'vue';
import VueResource from 'vue-resource';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import Api from '~/api'; import Api from '~/api';
Vue.use(VueResource);
export default { export default {
getTreeData(endpoint) {
return Vue.http.get(endpoint, { params: { format: 'json' } });
},
getFileData(endpoint) { getFileData(endpoint) {
return Vue.http.get(endpoint, { params: { format: 'json', viewer: 'none' } }); return axios.get(endpoint, {
params: { format: 'json', viewer: 'none' },
});
}, },
getRawFileData(file) { getRawFileData(file) {
if (file.tempFile) { if (file.tempFile) {
...@@ -21,7 +16,11 @@ export default { ...@@ -21,7 +16,11 @@ export default {
return Promise.resolve(file.raw); return Promise.resolve(file.raw);
} }
return Vue.http.get(file.rawPath, { params: { format: 'json' } }).then(res => res.text()); return axios
.get(file.rawPath, {
params: { format: 'json' },
})
.then(({ data }) => data);
}, },
getBaseRawFileData(file, sha) { getBaseRawFileData(file, sha) {
if (file.tempFile) { if (file.tempFile) {
...@@ -32,11 +31,11 @@ export default { ...@@ -32,11 +31,11 @@ export default {
return Promise.resolve(file.baseRaw); return Promise.resolve(file.baseRaw);
} }
return Vue.http return axios
.get(file.rawPath.replace(`/raw/${file.branchId}/${file.path}`, `/raw/${sha}/${file.path}`), { .get(file.rawPath.replace(`/raw/${file.branchId}/${file.path}`, `/raw/${sha}/${file.path}`), {
params: { format: 'json' }, params: { format: 'json' },
}) })
.then(res => res.text()); .then(({ data }) => data);
}, },
getProjectData(namespace, project) { getProjectData(namespace, project) {
return Api.project(`${namespace}/${project}`); return Api.project(`${namespace}/${project}`);
...@@ -53,21 +52,9 @@ export default { ...@@ -53,21 +52,9 @@ export default {
getBranchData(projectId, currentBranchId) { getBranchData(projectId, currentBranchId) {
return Api.branchSingle(projectId, currentBranchId); return Api.branchSingle(projectId, currentBranchId);
}, },
createBranch(projectId, payload) {
const url = Api.buildUrl(Api.createBranchPath).replace(':id', projectId);
return Vue.http.post(url, payload);
},
commit(projectId, payload) { commit(projectId, payload) {
return Api.commitMultiple(projectId, payload); return Api.commitMultiple(projectId, payload);
}, },
getTreeLastCommit(endpoint) {
return Vue.http.get(endpoint, {
params: {
format: 'json',
},
});
},
getFiles(projectUrl, branchId) { getFiles(projectUrl, branchId) {
const url = `${projectUrl}/files/${branchId}`; const url = `${projectUrl}/files/${branchId}`;
return axios.get(url, { params: { format: 'json' } }); return axios.get(url, { params: { format: 'json' } });
......
...@@ -66,13 +66,9 @@ export const getFileData = ({ state, commit, dispatch }, { path, makeFileActive ...@@ -66,13 +66,9 @@ export const getFileData = ({ state, commit, dispatch }, { path, makeFileActive
.getFileData( .getFileData(
`${gon.relative_url_root ? gon.relative_url_root : ''}${file.url.replace('/-/', '/')}`, `${gon.relative_url_root ? gon.relative_url_root : ''}${file.url.replace('/-/', '/')}`,
) )
.then(res => { .then(({ data, headers }) => {
const pageTitle = decodeURI(normalizeHeaders(res.headers)['PAGE-TITLE']); setPageTitle(decodeURI(headers['page-title']));
setPageTitle(pageTitle);
return res.json();
})
.then(data => {
commit(types.SET_FILE_DATA, { data, file }); commit(types.SET_FILE_DATA, { data, file });
commit(types.TOGGLE_FILE_OPEN, path); commit(types.TOGGLE_FILE_OPEN, path);
if (makeFileActive) dispatch('setFileActive', path); if (makeFileActive) dispatch('setFileActive', path);
......
...@@ -68,23 +68,6 @@ describe('RepoCommitSection', () => { ...@@ -68,23 +68,6 @@ describe('RepoCommitSection', () => {
vm.$mount(); vm.$mount();
spyOn(service, 'getTreeData').and.returnValue(
Promise.resolve({
headers: {
'page-title': 'test',
},
json: () =>
Promise.resolve({
last_commit_path: 'last_commit_path',
parent_tree_url: 'parent_tree_url',
path: '/',
trees: [{ name: 'tree' }],
blobs: [{ name: 'blob' }],
submodules: [{ name: 'submodule' }],
}),
}),
);
Vue.nextTick(done); Vue.nextTick(done);
}); });
......
import Vue from 'vue'; import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import store from '~/ide/stores'; import store from '~/ide/stores';
import { getFileData, getRawFileData } from '~/ide/stores/actions/file';
import * as actions from '~/ide/stores/actions/file'; import * as actions from '~/ide/stores/actions/file';
import * as types from '~/ide/stores/mutation_types'; import * as types from '~/ide/stores/mutation_types';
import service from '~/ide/services'; import service from '~/ide/services';
...@@ -9,11 +12,16 @@ import { file, resetStore } from '../../helpers'; ...@@ -9,11 +12,16 @@ import { file, resetStore } from '../../helpers';
import testAction from '../../../helpers/vuex_action_helper'; import testAction from '../../../helpers/vuex_action_helper';
describe('IDE store file actions', () => { describe('IDE store file actions', () => {
let mock;
beforeEach(() => { beforeEach(() => {
mock = new MockAdapter(axios);
spyOn(router, 'push'); spyOn(router, 'push');
}); });
afterEach(() => { afterEach(() => {
mock.restore();
resetStore(store); resetStore(store);
}); });
...@@ -183,94 +191,131 @@ describe('IDE store file actions', () => { ...@@ -183,94 +191,131 @@ describe('IDE store file actions', () => {
let localFile; let localFile;
beforeEach(() => { beforeEach(() => {
spyOn(service, 'getFileData').and.returnValue( spyOn(service, 'getFileData').and.callThrough();
Promise.resolve({
headers: {
'page-title': 'testing getFileData',
},
json: () =>
Promise.resolve({
blame_path: 'blame_path',
commits_path: 'commits_path',
permalink: 'permalink',
raw_path: 'raw_path',
binary: false,
html: '123',
render_error: '',
}),
}),
);
localFile = file(`newCreate-${Math.random()}`); localFile = file(`newCreate-${Math.random()}`);
localFile.url = 'getFileDataURL'; localFile.url = `${gl.TEST_HOST}/getFileDataURL`;
store.state.entries[localFile.path] = localFile; store.state.entries[localFile.path] = localFile;
}); });
it('calls the service', done => { describe('success', () => {
store beforeEach(() => {
.dispatch('getFileData', { path: localFile.path }) mock.onGet(`${gl.TEST_HOST}/getFileDataURL`).replyOnce(
.then(() => { 200,
expect(service.getFileData).toHaveBeenCalledWith('getFileDataURL'); {
blame_path: 'blame_path',
commits_path: 'commits_path',
permalink: 'permalink',
raw_path: 'raw_path',
binary: false,
html: '123',
render_error: '',
},
{
'page-title': 'testing getFileData',
},
);
});
done(); it('calls the service', done => {
}) store
.catch(done.fail); .dispatch('getFileData', { path: localFile.path })
}); .then(() => {
expect(service.getFileData).toHaveBeenCalledWith(`${gl.TEST_HOST}/getFileDataURL`);
it('sets the file data', done => { done();
store })
.dispatch('getFileData', { path: localFile.path }) .catch(done.fail);
.then(() => { });
expect(localFile.blamePath).toBe('blame_path');
done(); it('sets the file data', done => {
}) store
.catch(done.fail); .dispatch('getFileData', { path: localFile.path })
}); .then(() => {
expect(localFile.blamePath).toBe('blame_path');
it('sets document title', done => { done();
store })
.dispatch('getFileData', { path: localFile.path }) .catch(done.fail);
.then(() => { });
expect(document.title).toBe('testing getFileData');
done(); it('sets document title', done => {
}) store
.catch(done.fail); .dispatch('getFileData', { path: localFile.path })
}); .then(() => {
expect(document.title).toBe('testing getFileData');
it('sets the file as active', done => { done();
store })
.dispatch('getFileData', { path: localFile.path }) .catch(done.fail);
.then(() => { });
expect(localFile.active).toBeTruthy();
done(); it('sets the file as active', done => {
}) store
.catch(done.fail); .dispatch('getFileData', { path: localFile.path })
}); .then(() => {
expect(localFile.active).toBeTruthy();
it('sets the file not as active if we pass makeFileActive false', done => { done();
store })
.dispatch('getFileData', { path: localFile.path, makeFileActive: false }) .catch(done.fail);
.then(() => { });
expect(localFile.active).toBeFalsy();
done(); it('sets the file not as active if we pass makeFileActive false', done => {
}) store
.catch(done.fail); .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);
});
}); });
it('adds the file to open files', done => { describe('error', () => {
store beforeEach(() => {
.dispatch('getFileData', { path: localFile.path }) mock.onGet(`${gl.TEST_HOST}/getFileDataURL`).networkError();
.then(() => { });
expect(store.state.openFiles.length).toBe(1);
expect(store.state.openFiles[0].name).toBe(localFile.name);
done(); it('dispatches error action', done => {
}) const dispatch = jasmine.createSpy('dispatch');
.catch(done.fail);
getFileData(
{
state: store.state,
commit() {},
dispatch,
},
{ path: localFile.path },
)
.then(() => {
expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
text: 'An error occured whilst loading the file.',
action: jasmine.any(Function),
actionText: 'Please try again',
actionPayload: {
path: localFile.path,
makeFileActive: true,
},
});
done();
})
.catch(done.fail);
});
}); });
}); });
...@@ -278,48 +323,87 @@ describe('IDE store file actions', () => { ...@@ -278,48 +323,87 @@ describe('IDE store file actions', () => {
let tmpFile; let tmpFile;
beforeEach(() => { beforeEach(() => {
spyOn(service, 'getRawFileData').and.returnValue(Promise.resolve('raw')); spyOn(service, 'getRawFileData').and.callThrough();
tmpFile = file('tmpFile'); tmpFile = file('tmpFile');
store.state.entries[tmpFile.path] = tmpFile; store.state.entries[tmpFile.path] = tmpFile;
}); });
it('calls getRawFileData service method', done => { describe('success', () => {
store beforeEach(() => {
.dispatch('getRawFileData', { path: tmpFile.path }) mock.onGet(/(.*)/).replyOnce(200, 'raw');
.then(() => { });
expect(service.getRawFileData).toHaveBeenCalledWith(tmpFile);
done(); it('calls getRawFileData service method', done => {
}) store
.catch(done.fail); .dispatch('getRawFileData', { path: tmpFile.path })
}); .then(() => {
expect(service.getRawFileData).toHaveBeenCalledWith(tmpFile);
it('updates file raw data', done => { done();
store })
.dispatch('getRawFileData', { path: tmpFile.path }) .catch(done.fail);
.then(() => { });
expect(tmpFile.raw).toBe('raw');
done(); it('updates file raw data', done => {
}) store
.catch(done.fail); .dispatch('getRawFileData', { path: tmpFile.path })
}); .then(() => {
expect(tmpFile.raw).toBe('raw');
it('calls also getBaseRawFileData service method', done => { done();
spyOn(service, 'getBaseRawFileData').and.returnValue(Promise.resolve('baseraw')); })
.catch(done.fail);
});
tmpFile.mrChange = { new_file: false }; it('calls also getBaseRawFileData service method', done => {
spyOn(service, 'getBaseRawFileData').and.returnValue(Promise.resolve('baseraw'));
store tmpFile.mrChange = { new_file: false };
.dispatch('getRawFileData', { path: tmpFile.path, baseSha: 'SHA' })
.then(() => {
expect(service.getBaseRawFileData).toHaveBeenCalledWith(tmpFile, 'SHA');
expect(tmpFile.baseRaw).toBe('baseraw');
done(); store
}) .dispatch('getRawFileData', { path: tmpFile.path, baseSha: 'SHA' })
.catch(done.fail); .then(() => {
expect(service.getBaseRawFileData).toHaveBeenCalledWith(tmpFile, 'SHA');
expect(tmpFile.baseRaw).toBe('baseraw');
done();
})
.catch(done.fail);
});
});
describe('error', () => {
beforeEach(() => {
mock.onGet(/(.*)/).networkError();
});
it('dispatches error action', done => {
const dispatch = jasmine.createSpy('dispatch');
getRawFileData(
{
state: store.state,
commit() {},
dispatch,
},
{ path: tmpFile.path, baseSha: tmpFile.baseSha },
)
.then(done.fail)
.catch(() => {
expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
text: 'An error occured whilst loading the file content.',
action: jasmine.any(Function),
actionText: 'Please try again',
actionPayload: {
path: tmpFile.path,
baseSha: tmpFile.baseSha,
},
});
done();
});
});
}); });
}); });
......
...@@ -110,7 +110,7 @@ describe('IDE store project actions', () => { ...@@ -110,7 +110,7 @@ describe('IDE store project actions', () => {
type: 'setErrorMessage', type: 'setErrorMessage',
payload: { payload: {
text: "Branch <strong>master</strong> was not found in this project's repository.", text: "Branch <strong>master</strong> was not found in this project's repository.",
action: 'createNewBranchFromDefault', action: jasmine.any(Function),
actionText: 'Create branch', actionText: 'Create branch',
actionPayload: 'master', actionPayload: 'master',
}, },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment