173 lines
4.7 KiB
TypeScript
173 lines
4.7 KiB
TypeScript
// Imports
|
|
import {GithubPullRequests} from '../../lib/common/github-pull-requests';
|
|
|
|
// Tests
|
|
describe('GithubPullRequests', () => {
|
|
|
|
describe('constructor()', () => {
|
|
|
|
it('should log a warning if \'githubToken\' is not defined', () => {
|
|
const warningMessage = 'No GitHub access-token specified. Requests will be unauthenticated.';
|
|
const consoleWarnSpy = spyOn(console, 'warn');
|
|
|
|
// tslint:disable-next-line: no-unused-new
|
|
new GithubPullRequests('repo/slug');
|
|
|
|
expect(consoleWarnSpy).toHaveBeenCalledWith(warningMessage);
|
|
});
|
|
|
|
|
|
it('should throw if \'repoSlug\' is not defined', () => {
|
|
expect(() => new GithubPullRequests('', '12345')).toThrowError('Missing required parameter \'repoSlug\'!');
|
|
});
|
|
|
|
});
|
|
|
|
|
|
describe('addComment()', () => {
|
|
let prs: GithubPullRequests;
|
|
let deferred: {resolve: Function, reject: Function};
|
|
|
|
beforeEach(() => {
|
|
prs = new GithubPullRequests('foo/bar', '12345');
|
|
|
|
spyOn(prs, 'post').and.callFake(() => new Promise((resolve, reject) => deferred = {resolve, reject}));
|
|
});
|
|
|
|
|
|
it('should return a promise', () => {
|
|
expect(prs.addComment(42, 'body')).toEqual(jasmine.any(Promise));
|
|
});
|
|
|
|
|
|
it('should throw if the PR number is invalid', () => {
|
|
expect(() => prs.addComment(-1337, 'body')).toThrowError(`Invalid PR number: -1337`);
|
|
expect(() => prs.addComment(NaN, 'body')).toThrowError(`Invalid PR number: NaN`);
|
|
});
|
|
|
|
|
|
it('should throw if the comment body is invalid or empty', () => {
|
|
expect(() => prs.addComment(42, '')).toThrowError(`Invalid or empty comment body: `);
|
|
});
|
|
|
|
|
|
it('should call \'post()\' with the correct pathname, params and data', () => {
|
|
prs.addComment(42, 'body');
|
|
|
|
expect(prs.post).toHaveBeenCalledWith('/repos/foo/bar/issues/42/comments', null, {body: 'body'});
|
|
});
|
|
|
|
|
|
it('should reject if the request fails', done => {
|
|
prs.addComment(42, 'body').catch(err => {
|
|
expect(err).toBe('Test');
|
|
done();
|
|
});
|
|
|
|
deferred.reject('Test');
|
|
});
|
|
|
|
|
|
it('should resolve with the returned response', done => {
|
|
prs.addComment(42, 'body').then(data => {
|
|
expect(data).toEqual('Test');
|
|
done();
|
|
});
|
|
|
|
deferred.resolve('Test');
|
|
});
|
|
|
|
});
|
|
|
|
|
|
describe('fetchAll()', () => {
|
|
let prs: GithubPullRequests;
|
|
let deferreds: {resolve: Function, reject: Function}[];
|
|
|
|
beforeEach(() => {
|
|
prs = new GithubPullRequests('foo/bar', '12345');
|
|
deferreds = [];
|
|
|
|
spyOn(process.stdout, 'write');
|
|
spyOn(prs, 'get').and.callFake(() => new Promise((resolve, reject) => deferreds.push({resolve, reject})));
|
|
});
|
|
|
|
|
|
it('should return a promise', () => {
|
|
expect(prs.fetchAll()).toEqual(jasmine.any(Promise));
|
|
});
|
|
|
|
|
|
it('should call \'get()\' with the correct pathname and params', () => {
|
|
prs.fetchAll('open');
|
|
|
|
expect(prs.get).toHaveBeenCalledWith('/repos/foo/bar/pulls', {
|
|
page: 0,
|
|
per_page: 100,
|
|
state: 'open',
|
|
});
|
|
});
|
|
|
|
|
|
it('should default to \'all\' if no state is specified', () => {
|
|
prs.fetchAll();
|
|
|
|
expect(prs.get).toHaveBeenCalledWith('/repos/foo/bar/pulls', {
|
|
page: 0,
|
|
per_page: 100,
|
|
state: 'all',
|
|
});
|
|
});
|
|
|
|
|
|
it('should reject if the request fails', done => {
|
|
prs.fetchAll().catch(err => {
|
|
expect(err).toBe('Test');
|
|
done();
|
|
});
|
|
|
|
deferreds[0].reject('Test');
|
|
});
|
|
|
|
|
|
it('should resolve with the returned pull requests', done => {
|
|
const pullRequests = [{id: 1}, {id: 2}];
|
|
|
|
prs.fetchAll().then(data => {
|
|
expect(data).toEqual(pullRequests);
|
|
done();
|
|
});
|
|
|
|
deferreds[0].resolve(pullRequests);
|
|
});
|
|
|
|
|
|
it('should iteratively call \'get()\' to fetch all pull requests', done => {
|
|
// Create an array or 250 objects.
|
|
const allPullRequests = '.'.repeat(250).split('').map((_, i) => ({id: i}));
|
|
const prsGetApy = prs.get as jasmine.Spy;
|
|
|
|
prs.fetchAll().then(data => {
|
|
const paramsForPage = (page: number) => ({page, per_page: 100, state: 'all'});
|
|
|
|
expect(prsGetApy).toHaveBeenCalledTimes(3);
|
|
expect(prsGetApy.calls.argsFor(0)).toEqual(['/repos/foo/bar/pulls', paramsForPage(0)]);
|
|
expect(prsGetApy.calls.argsFor(1)).toEqual(['/repos/foo/bar/pulls', paramsForPage(1)]);
|
|
expect(prsGetApy.calls.argsFor(2)).toEqual(['/repos/foo/bar/pulls', paramsForPage(2)]);
|
|
|
|
expect(data).toEqual(allPullRequests);
|
|
|
|
done();
|
|
});
|
|
|
|
deferreds[0].resolve(allPullRequests.slice(0, 100));
|
|
setTimeout(() => {
|
|
deferreds[1].resolve(allPullRequests.slice(100, 200));
|
|
setTimeout(() => deferreds[2].resolve(allPullRequests.slice(200)), 0);
|
|
}, 0);
|
|
});
|
|
|
|
});
|
|
|
|
});
|