2018-03-17 18:26:18 +05:30
|
|
|
import MockAdapter from 'axios-mock-adapter';
|
|
|
|
import axios from '~/lib/utils/axios_utils';
|
2017-09-10 17:25:29 +05:30
|
|
|
import Api from '~/api';
|
|
|
|
|
|
|
|
describe('Api', () => {
|
|
|
|
const dummyApiVersion = 'v3000';
|
|
|
|
const dummyUrlRoot = 'http://host.invalid';
|
|
|
|
const dummyGon = {
|
|
|
|
api_version: dummyApiVersion,
|
|
|
|
relative_url_root: dummyUrlRoot,
|
|
|
|
};
|
|
|
|
let originalGon;
|
2018-03-17 18:26:18 +05:30
|
|
|
let mock;
|
2017-09-10 17:25:29 +05:30
|
|
|
|
|
|
|
beforeEach(() => {
|
2018-03-17 18:26:18 +05:30
|
|
|
mock = new MockAdapter(axios);
|
2017-09-10 17:25:29 +05:30
|
|
|
originalGon = window.gon;
|
2018-03-17 18:26:18 +05:30
|
|
|
window.gon = Object.assign({}, dummyGon);
|
2017-09-10 17:25:29 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(() => {
|
2018-03-17 18:26:18 +05:30
|
|
|
mock.restore();
|
2017-09-10 17:25:29 +05:30
|
|
|
window.gon = originalGon;
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('buildUrl', () => {
|
|
|
|
it('adds URL root and fills in API version', () => {
|
|
|
|
const input = '/api/:version/foo/bar';
|
|
|
|
const expectedOutput = `${dummyUrlRoot}/api/${dummyApiVersion}/foo/bar`;
|
|
|
|
|
|
|
|
const builtUrl = Api.buildUrl(input);
|
|
|
|
|
|
|
|
expect(builtUrl).toEqual(expectedOutput);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('group', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches a group', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const groupId = '123456';
|
2018-03-17 18:26:18 +05:30
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}`;
|
|
|
|
mock.onGet(expectedUrl).reply(200, {
|
|
|
|
name: 'test',
|
2017-09-10 17:25:29 +05:30
|
|
|
});
|
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
Api.group(groupId, response => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response.name).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('groups', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches groups', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const query = 'dummy query';
|
|
|
|
const options = { unused: 'option' };
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups.json`;
|
2018-05-09 12:01:36 +05:30
|
|
|
mock.onGet(expectedUrl).reply(200, [
|
|
|
|
{
|
|
|
|
name: 'test',
|
|
|
|
},
|
|
|
|
]);
|
2017-09-10 17:25:29 +05:30
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
Api.groups(query, options, response => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response.length).toBe(1);
|
|
|
|
expect(response[0].name).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('namespaces', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches namespaces', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const query = 'dummy query';
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/namespaces.json`;
|
2018-05-09 12:01:36 +05:30
|
|
|
mock.onGet(expectedUrl).reply(200, [
|
|
|
|
{
|
|
|
|
name: 'test',
|
|
|
|
},
|
|
|
|
]);
|
2017-09-10 17:25:29 +05:30
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
Api.namespaces(query, response => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response.length).toBe(1);
|
|
|
|
expect(response[0].name).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('projects', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches projects with membership when logged in', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const query = 'dummy query';
|
|
|
|
const options = { unused: 'option' };
|
2018-03-17 18:26:18 +05:30
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects.json`;
|
|
|
|
window.gon.current_user_id = 1;
|
2018-05-09 12:01:36 +05:30
|
|
|
mock.onGet(expectedUrl).reply(200, [
|
|
|
|
{
|
|
|
|
name: 'test',
|
|
|
|
},
|
|
|
|
]);
|
2018-03-17 18:26:18 +05:30
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
Api.projects(query, options, response => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response.length).toBe(1);
|
|
|
|
expect(response[0].name).toBe('test');
|
|
|
|
done();
|
2017-09-10 17:25:29 +05:30
|
|
|
});
|
2018-03-17 18:26:18 +05:30
|
|
|
});
|
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches projects without membership when not logged in', done => {
|
2018-03-17 18:26:18 +05:30
|
|
|
const query = 'dummy query';
|
|
|
|
const options = { unused: 'option' };
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects.json`;
|
2018-05-09 12:01:36 +05:30
|
|
|
mock.onGet(expectedUrl).reply(200, [
|
|
|
|
{
|
|
|
|
name: 'test',
|
|
|
|
},
|
|
|
|
]);
|
2017-09-10 17:25:29 +05:30
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
Api.projects(query, options, response => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response.length).toBe(1);
|
|
|
|
expect(response[0].name).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
describe('mergerequest', () => {
|
|
|
|
it('fetches a merge request', done => {
|
|
|
|
const projectPath = 'abc';
|
|
|
|
const mergeRequestId = '123456';
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests/${mergeRequestId}`;
|
|
|
|
mock.onGet(expectedUrl).reply(200, {
|
|
|
|
title: 'test',
|
|
|
|
});
|
|
|
|
|
|
|
|
Api.mergeRequest(projectPath, mergeRequestId)
|
|
|
|
.then(({ data }) => {
|
|
|
|
expect(data.title).toBe('test');
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('mergerequest changes', () => {
|
|
|
|
it('fetches the changes of a merge request', done => {
|
|
|
|
const projectPath = 'abc';
|
|
|
|
const mergeRequestId = '123456';
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests/${mergeRequestId}/changes`;
|
|
|
|
mock.onGet(expectedUrl).reply(200, {
|
|
|
|
title: 'test',
|
|
|
|
});
|
|
|
|
|
|
|
|
Api.mergeRequestChanges(projectPath, mergeRequestId)
|
|
|
|
.then(({ data }) => {
|
|
|
|
expect(data.title).toBe('test');
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('mergerequest versions', () => {
|
|
|
|
it('fetches the versions of a merge request', done => {
|
|
|
|
const projectPath = 'abc';
|
|
|
|
const mergeRequestId = '123456';
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests/${mergeRequestId}/versions`;
|
|
|
|
mock.onGet(expectedUrl).reply(200, [
|
|
|
|
{
|
|
|
|
id: 123,
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
|
|
|
|
Api.mergeRequestVersions(projectPath, mergeRequestId)
|
|
|
|
.then(({ data }) => {
|
|
|
|
expect(data.length).toBe(1);
|
|
|
|
expect(data[0].id).toBe(123);
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
describe('newLabel', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('creates a new label', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const namespace = 'some namespace';
|
|
|
|
const project = 'some project';
|
|
|
|
const labelData = { some: 'data' };
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/${namespace}/${project}/labels`;
|
|
|
|
const expectedData = {
|
|
|
|
label: labelData,
|
|
|
|
};
|
2018-05-09 12:01:36 +05:30
|
|
|
mock.onPost(expectedUrl).reply(config => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(config.data).toBe(JSON.stringify(expectedData));
|
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
return [
|
|
|
|
200,
|
|
|
|
{
|
|
|
|
name: 'test',
|
|
|
|
},
|
|
|
|
];
|
2017-09-10 17:25:29 +05:30
|
|
|
});
|
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
Api.newLabel(namespace, project, labelData, response => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response.name).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
2018-03-27 19:54:05 +05:30
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
it('creates a group label', done => {
|
2018-03-27 19:54:05 +05:30
|
|
|
const namespace = 'group/subgroup';
|
|
|
|
const labelData = { some: 'data' };
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/groups/${namespace}/-/labels`;
|
|
|
|
const expectedData = {
|
|
|
|
label: labelData,
|
|
|
|
};
|
2018-05-09 12:01:36 +05:30
|
|
|
mock.onPost(expectedUrl).reply(config => {
|
2018-03-27 19:54:05 +05:30
|
|
|
expect(config.data).toBe(JSON.stringify(expectedData));
|
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
return [
|
|
|
|
200,
|
|
|
|
{
|
|
|
|
name: 'test',
|
|
|
|
},
|
|
|
|
];
|
2018-03-27 19:54:05 +05:30
|
|
|
});
|
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
Api.newLabel(namespace, undefined, labelData, response => {
|
2018-03-27 19:54:05 +05:30
|
|
|
expect(response.name).toBe('test');
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
2017-09-10 17:25:29 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
describe('groupProjects', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches group projects', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const groupId = '123456';
|
|
|
|
const query = 'dummy query';
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/projects.json`;
|
2018-05-09 12:01:36 +05:30
|
|
|
mock.onGet(expectedUrl).reply(200, [
|
|
|
|
{
|
|
|
|
name: 'test',
|
|
|
|
},
|
|
|
|
]);
|
2017-09-10 17:25:29 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
Api.groupProjects(groupId, query, {}, response => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response.length).toBe(1);
|
|
|
|
expect(response[0].name).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('licenseText', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches a license text', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const licenseKey = "driver's license";
|
|
|
|
const data = { unused: 'option' };
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/templates/licenses/${licenseKey}`;
|
2018-03-17 18:26:18 +05:30
|
|
|
mock.onGet(expectedUrl).reply(200, 'test');
|
2017-09-10 17:25:29 +05:30
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
Api.licenseText(licenseKey, data, response => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('gitignoreText', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches a gitignore text', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const gitignoreKey = 'ignore git';
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/templates/gitignores/${gitignoreKey}`;
|
2018-03-17 18:26:18 +05:30
|
|
|
mock.onGet(expectedUrl).reply(200, 'test');
|
2017-09-10 17:25:29 +05:30
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
Api.gitignoreText(gitignoreKey, response => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('gitlabCiYml', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches a .gitlab-ci.yml', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const gitlabCiYmlKey = 'Y CI ML';
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/templates/gitlab_ci_ymls/${gitlabCiYmlKey}`;
|
2018-03-17 18:26:18 +05:30
|
|
|
mock.onGet(expectedUrl).reply(200, 'test');
|
2017-09-10 17:25:29 +05:30
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
Api.gitlabCiYml(gitlabCiYmlKey, response => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('dockerfileYml', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches a Dockerfile', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const dockerfileYmlKey = 'a giant whale';
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/templates/dockerfiles/${dockerfileYmlKey}`;
|
2018-03-17 18:26:18 +05:30
|
|
|
mock.onGet(expectedUrl).reply(200, 'test');
|
2017-09-10 17:25:29 +05:30
|
|
|
|
2018-05-09 12:01:36 +05:30
|
|
|
Api.dockerfileYml(dockerfileYmlKey, response => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('issueTemplate', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches an issue template', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const namespace = 'some namespace';
|
|
|
|
const project = 'some project';
|
2018-03-17 18:26:18 +05:30
|
|
|
const templateKey = ' template #%?.key ';
|
2017-09-10 17:25:29 +05:30
|
|
|
const templateType = 'template type';
|
2018-05-09 12:01:36 +05:30
|
|
|
const expectedUrl = `${dummyUrlRoot}/${namespace}/${project}/templates/${templateType}/${encodeURIComponent(
|
|
|
|
templateKey,
|
|
|
|
)}`;
|
2018-03-17 18:26:18 +05:30
|
|
|
mock.onGet(expectedUrl).reply(200, 'test');
|
2017-09-10 17:25:29 +05:30
|
|
|
|
|
|
|
Api.issueTemplate(namespace, project, templateKey, templateType, (error, response) => {
|
2018-03-17 18:26:18 +05:30
|
|
|
expect(response).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('users', () => {
|
2018-05-09 12:01:36 +05:30
|
|
|
it('fetches users', done => {
|
2017-09-10 17:25:29 +05:30
|
|
|
const query = 'dummy query';
|
|
|
|
const options = { unused: 'option' };
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/users.json`;
|
2018-05-09 12:01:36 +05:30
|
|
|
mock.onGet(expectedUrl).reply(200, [
|
|
|
|
{
|
|
|
|
name: 'test',
|
|
|
|
},
|
|
|
|
]);
|
2017-09-10 17:25:29 +05:30
|
|
|
|
|
|
|
Api.users(query, options)
|
2018-03-17 18:26:18 +05:30
|
|
|
.then(({ data }) => {
|
|
|
|
expect(data.length).toBe(1);
|
|
|
|
expect(data[0].name).toBe('test');
|
2017-09-10 17:25:29 +05:30
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
2018-11-08 19:23:39 +05:30
|
|
|
|
|
|
|
describe('commitPipelines', () => {
|
|
|
|
it('fetches pipelines for a given commit', done => {
|
|
|
|
const projectId = 'example/foobar';
|
|
|
|
const commitSha = 'abc123def';
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/${projectId}/commit/${commitSha}/pipelines`;
|
|
|
|
mock.onGet(expectedUrl).reply(200, [
|
|
|
|
{
|
|
|
|
name: 'test',
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
|
|
|
|
Api.commitPipelines(projectId, commitSha)
|
|
|
|
.then(({ data }) => {
|
|
|
|
expect(data.length).toBe(1);
|
|
|
|
expect(data[0].name).toBe('test');
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('createBranch', () => {
|
|
|
|
it('creates new branch', done => {
|
|
|
|
const ref = 'master';
|
|
|
|
const branch = 'new-branch-name';
|
|
|
|
const dummyProjectPath = 'gitlab-org/gitlab-ce';
|
|
|
|
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${encodeURIComponent(
|
|
|
|
dummyProjectPath,
|
|
|
|
)}/repository/branches`;
|
|
|
|
|
|
|
|
spyOn(axios, 'post').and.callThrough();
|
|
|
|
|
|
|
|
mock.onPost(expectedUrl).replyOnce(200, {
|
|
|
|
name: branch,
|
|
|
|
});
|
|
|
|
|
|
|
|
Api.createBranch(dummyProjectPath, { ref, branch })
|
|
|
|
.then(({ data }) => {
|
|
|
|
expect(data.name).toBe(branch);
|
|
|
|
expect(axios.post).toHaveBeenCalledWith(expectedUrl, { ref, branch });
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
.catch(done.fail);
|
|
|
|
});
|
|
|
|
});
|
2017-09-10 17:25:29 +05:30
|
|
|
});
|