135 lines
5.2 KiB
TypeScript
135 lines
5.2 KiB
TypeScript
|
import * as nock from 'nock';
|
||
|
import {CircleCiApi} from '../../lib/common/circle-ci-api';
|
||
|
|
||
|
const ORG = 'testorg';
|
||
|
const REPO = 'testrepo';
|
||
|
const TOKEN = 'xxxx';
|
||
|
const BASE_URL = `https://circleci.com/api/v1.1/project/github/${ORG}/${REPO}`;
|
||
|
|
||
|
describe('CircleCIApi', () => {
|
||
|
describe('constructor()', () => {
|
||
|
it('should throw if \'githubOrg\' is missing or empty', () => {
|
||
|
expect(() => new CircleCiApi('', REPO, TOKEN)).
|
||
|
toThrowError('Missing or empty required parameter \'githubOrg\'!');
|
||
|
});
|
||
|
|
||
|
it('should throw if \'githubRepo\' is missing or empty', () => {
|
||
|
expect(() => new CircleCiApi(ORG, '', TOKEN)).
|
||
|
toThrowError('Missing or empty required parameter \'githubRepo\'!');
|
||
|
});
|
||
|
|
||
|
it('should throw if \'circleCiToken\' is missing or empty', () => {
|
||
|
expect(() => new CircleCiApi(ORG, REPO, '')).
|
||
|
toThrowError('Missing or empty required parameter \'circleCiToken\'!');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('getBuildInfo', () => {
|
||
|
it('should make a request to the CircleCI API for the given build number', async () => {
|
||
|
const api = new CircleCiApi(ORG, REPO, TOKEN);
|
||
|
const buildNum = 12345;
|
||
|
const expectedBuildInfo: any = { org: ORG, repo: REPO, build_num: buildNum };
|
||
|
|
||
|
const request = nock(BASE_URL)
|
||
|
.get(`/${buildNum}?circle-token=${TOKEN}`)
|
||
|
.reply(200, expectedBuildInfo);
|
||
|
|
||
|
const buildInfo = await api.getBuildInfo(buildNum);
|
||
|
expect(buildInfo).toEqual(expectedBuildInfo);
|
||
|
request.done();
|
||
|
});
|
||
|
|
||
|
it('should throw an error if the request fails', async () => {
|
||
|
const api = new CircleCiApi(ORG, REPO, TOKEN);
|
||
|
const buildNum = 12345;
|
||
|
const errorMessage = 'Invalid request';
|
||
|
const request = nock(BASE_URL).get(`/${buildNum}?circle-token=${TOKEN}`);
|
||
|
|
||
|
try {
|
||
|
request.replyWithError(errorMessage);
|
||
|
await api.getBuildInfo(buildNum);
|
||
|
throw new Error('Exception Expected');
|
||
|
} catch (err) {
|
||
|
expect(err.message).toEqual(
|
||
|
`CircleCI build info request failed ` +
|
||
|
`(request to ${BASE_URL}/${buildNum}?circle-token=${TOKEN} failed, reason: ${errorMessage})`);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
request.reply(404, errorMessage);
|
||
|
await api.getBuildInfo(buildNum);
|
||
|
throw new Error('Exception Expected');
|
||
|
} catch (err) {
|
||
|
expect(err.message).toEqual(
|
||
|
`CircleCI build info request failed ` +
|
||
|
`(request to ${BASE_URL}/${buildNum}?circle-token=${TOKEN} failed, reason: ${errorMessage})`);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('getBuildArtifactUrl', () => {
|
||
|
it('should make a request to the CircleCI API for the given build number', async () => {
|
||
|
const api = new CircleCiApi(ORG, REPO, TOKEN);
|
||
|
const buildNum = 12345;
|
||
|
const artifact0: any = { path: 'some/path/0', url: 'https://url/0' };
|
||
|
const artifact1: any = { path: 'some/path/1', url: 'https://url/1' };
|
||
|
const artifact2: any = { path: 'some/path/2', url: 'https://url/2' };
|
||
|
const request = nock(BASE_URL)
|
||
|
.get(`/${buildNum}/artifacts?circle-token=${TOKEN}`)
|
||
|
.reply(200, [artifact0, artifact1, artifact2]);
|
||
|
|
||
|
const artifactUrl = await api.getBuildArtifactUrl(buildNum, 'some/path/1');
|
||
|
expect(artifactUrl).toEqual('https://url/1');
|
||
|
request.done();
|
||
|
});
|
||
|
|
||
|
|
||
|
it('should throw an error if the request fails', async () => {
|
||
|
const api = new CircleCiApi(ORG, REPO, TOKEN);
|
||
|
const buildNum = 12345;
|
||
|
const errorMessage = 'Invalid request';
|
||
|
const request = nock(BASE_URL).get(`/${buildNum}/artifacts?circle-token=${TOKEN}`);
|
||
|
|
||
|
try {
|
||
|
request.replyWithError(errorMessage);
|
||
|
await api.getBuildArtifactUrl(buildNum, 'some/path/1');
|
||
|
throw new Error('Exception Expected');
|
||
|
} catch (err) {
|
||
|
expect(err.message).toEqual(
|
||
|
`CircleCI artifact URL request failed ` +
|
||
|
`(request to ${BASE_URL}/${buildNum}/artifacts?circle-token=${TOKEN} failed, reason: ${errorMessage})`);
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
request.reply(404, errorMessage);
|
||
|
await api.getBuildArtifactUrl(buildNum, 'some/path/1');
|
||
|
throw new Error('Exception Expected');
|
||
|
} catch (err) {
|
||
|
expect(err.message).toEqual(
|
||
|
`CircleCI artifact URL request failed ` +
|
||
|
`(request to ${BASE_URL}/${buildNum}/artifacts?circle-token=${TOKEN} failed, reason: ${errorMessage})`);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
it('should throw an error if the response does not contain the specified artifact', async () => {
|
||
|
const api = new CircleCiApi(ORG, REPO, TOKEN);
|
||
|
const buildNum = 12345;
|
||
|
const artifact0: any = { path: 'some/path/0', url: 'https://url/0' };
|
||
|
const artifact1: any = { path: 'some/path/1', url: 'https://url/1' };
|
||
|
const artifact2: any = { path: 'some/path/2', url: 'https://url/2' };
|
||
|
nock(BASE_URL)
|
||
|
.get(`/${buildNum}/artifacts?circle-token=${TOKEN}`)
|
||
|
.reply(200, [artifact0, artifact1, artifact2]);
|
||
|
|
||
|
try {
|
||
|
await api.getBuildArtifactUrl(buildNum, 'some/path/3');
|
||
|
throw new Error('Exception Expected');
|
||
|
} catch (err) {
|
||
|
expect(err.message).toEqual(
|
||
|
`CircleCI artifact URL request failed ` +
|
||
|
`(Missing artifact (some/path/3) for CircleCI build: ${buildNum})`);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
});
|