This commit updates the preview server tests to take advantage of features supported in the latest version of Jasmine that were not supported when the rests were first written. Changes include: - Use [async/await] in tests. - Use the new [toBeInstanceOf()] and [toHaveBeenCalledBefore()] matchers. - Use the new [toBeResolved()] and [toBeRejected()] async matchers (and their variants). - Use the new [withArgs()] method of `Spy` to simplify "trained" responses. - Use the new [resolveTo()]/[rejectWith()] methods of `SpyStrategy` (and their variants) to simplify promise-based spies. - Implement custom async matchers (via [addAsyncMatchers()]) to simplify certain tests. [addAsyncMatchers()]: https://jasmine.github.io/api/3.5/jasmine.html#.addAsyncMatchers [async/await]: https://jasmine.github.io/tutorials/async [rejectWith()]: https://jasmine.github.io/api/3.5/SpyStrategy.html#rejectWith [resolveTo()]: https://jasmine.github.io/api/3.5/SpyStrategy.html#resolveTo [toBeInstanceOf()]: https://jasmine.github.io/api/3.5/matchers.html#toBeInstanceOf [toBeRejected()]: https://jasmine.github.io/api/3.5/async-matchers.html#toBeRejected [toBeResolved()]: https://jasmine.github.io/api/3.5/async-matchers.html#toBeResolved [toHaveBeenCalledBefore()]: https://jasmine.github.io/api/3.5/matchers.html#toHaveBeenCalledBefore [withArgs()]: https://jasmine.github.io/api/3.5/Spy.html#withArgs PR Close #36837
109 lines
4.7 KiB
TypeScript
109 lines
4.7 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}`);
|
|
|
|
request.replyWithError(errorMessage);
|
|
await expectAsync(api.getBuildInfo(buildNum)).toBeRejectedWithError(
|
|
`CircleCI build info request failed ` +
|
|
`(request to ${BASE_URL}/${buildNum}?circle-token=${TOKEN} failed, reason: ${errorMessage})`);
|
|
|
|
request.reply(404, errorMessage);
|
|
await expectAsync(api.getBuildInfo(buildNum)).toBeRejectedWithError(
|
|
`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]);
|
|
|
|
await expectAsync(api.getBuildArtifactUrl(buildNum, 'some/path/1')).toBeResolvedTo('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}`);
|
|
|
|
request.replyWithError(errorMessage);
|
|
await expectAsync(api.getBuildArtifactUrl(buildNum, 'some/path/1')).toBeRejectedWithError(
|
|
`CircleCI artifact URL request failed ` +
|
|
`(request to ${BASE_URL}/${buildNum}/artifacts?circle-token=${TOKEN} failed, reason: ${errorMessage})`);
|
|
|
|
request.reply(404, errorMessage);
|
|
await expectAsync(api.getBuildArtifactUrl(buildNum, 'some/path/1')).toBeRejectedWithError(
|
|
`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]);
|
|
|
|
await expectAsync(api.getBuildArtifactUrl(buildNum, 'some/path/3')).toBeRejectedWithError(
|
|
`CircleCI artifact URL request failed ` +
|
|
`(Missing artifact (some/path/3) for CircleCI build: ${buildNum})`);
|
|
});
|
|
});
|
|
});
|