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,13 +191,18 @@ describe('IDE store file actions', () => { ...@@ -183,13 +191,18 @@ describe('IDE store file actions', () => {
let localFile; let localFile;
beforeEach(() => { beforeEach(() => {
spyOn(service, 'getFileData').and.returnValue( spyOn(service, 'getFileData').and.callThrough();
Promise.resolve({
headers: { localFile = file(`newCreate-${Math.random()}`);
'page-title': 'testing getFileData', localFile.url = `${gl.TEST_HOST}/getFileDataURL`;
}, store.state.entries[localFile.path] = localFile;
json: () => });
Promise.resolve({
describe('success', () => {
beforeEach(() => {
mock.onGet(`${gl.TEST_HOST}/getFileDataURL`).replyOnce(
200,
{
blame_path: 'blame_path', blame_path: 'blame_path',
commits_path: 'commits_path', commits_path: 'commits_path',
permalink: 'permalink', permalink: 'permalink',
...@@ -197,20 +210,18 @@ describe('IDE store file actions', () => { ...@@ -197,20 +210,18 @@ describe('IDE store file actions', () => {
binary: false, binary: false,
html: '123', html: '123',
render_error: '', render_error: '',
}), },
}), {
'page-title': 'testing getFileData',
},
); );
localFile = file(`newCreate-${Math.random()}`);
localFile.url = 'getFileDataURL';
store.state.entries[localFile.path] = localFile;
}); });
it('calls the service', done => { it('calls the service', done => {
store store
.dispatch('getFileData', { path: localFile.path }) .dispatch('getFileData', { path: localFile.path })
.then(() => { .then(() => {
expect(service.getFileData).toHaveBeenCalledWith('getFileDataURL'); expect(service.getFileData).toHaveBeenCalledWith(`${gl.TEST_HOST}/getFileDataURL`);
done(); done();
}) })
...@@ -274,16 +285,55 @@ describe('IDE store file actions', () => { ...@@ -274,16 +285,55 @@ describe('IDE store file actions', () => {
}); });
}); });
describe('error', () => {
beforeEach(() => {
mock.onGet(`${gl.TEST_HOST}/getFileDataURL`).networkError();
});
it('dispatches error action', done => {
const dispatch = jasmine.createSpy('dispatch');
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);
});
});
});
describe('getRawFileData', () => { describe('getRawFileData', () => {
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;
}); });
describe('success', () => {
beforeEach(() => {
mock.onGet(/(.*)/).replyOnce(200, 'raw');
});
it('calls getRawFileData service method', done => { it('calls getRawFileData service method', done => {
store store
.dispatch('getRawFileData', { path: tmpFile.path }) .dispatch('getRawFileData', { path: tmpFile.path })
...@@ -323,6 +373,40 @@ describe('IDE store file actions', () => { ...@@ -323,6 +373,40 @@ describe('IDE store file actions', () => {
}); });
}); });
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();
});
});
});
});
describe('changeFileContent', () => { describe('changeFileContent', () => {
let tmpFile; let tmpFile;
......
...@@ -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