89 lines
2.9 KiB
TypeScript
89 lines
2.9 KiB
TypeScript
|
/**
|
||
|
* @license
|
||
|
* Copyright Google LLC All Rights Reserved.
|
||
|
*
|
||
|
* Use of this source code is governed by an MIT-style license that can be
|
||
|
* found in the LICENSE file at https://angular.io/license
|
||
|
*/
|
||
|
|
||
|
import * as nock from 'nock';
|
||
|
|
||
|
/**
|
||
|
* Class that represents a Github repository in testing. The class can be
|
||
|
* used to intercept and except Github API requests for release actions.
|
||
|
*/
|
||
|
export class GithubTestingRepo {
|
||
|
/** Github API endpoint. */
|
||
|
private apiEndpoint = `https://api.github.com`;
|
||
|
|
||
|
/** Github API url for the given repository. */
|
||
|
private repoApiUrl = `${this.apiEndpoint}/repos/${this.owner}/${this.name}`;
|
||
|
|
||
|
constructor(public owner: string, public name: string) {}
|
||
|
|
||
|
expectPullRequestToBeCreated(
|
||
|
baseBranch: string, fork: GithubTestingRepo, forkBranch: string, prNumber: number): this {
|
||
|
const expectedHead = `${fork.owner}:${forkBranch}`;
|
||
|
nock(this.repoApiUrl)
|
||
|
.post('/pulls', ({base, head}) => base === baseBranch && head === expectedHead)
|
||
|
.reply(200, {number: prNumber});
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
expectBranchRequest(branchName: string, sha: string|null): this {
|
||
|
nock(this.repoApiUrl)
|
||
|
.get(`/branches/${branchName}`)
|
||
|
.reply(sha ? 200 : 404, sha ? {commit: {sha}} : undefined);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
expectFindForkRequest(fork: GithubTestingRepo): this {
|
||
|
nock(this.apiEndpoint)
|
||
|
.post(
|
||
|
'/graphql',
|
||
|
({variables}) => variables.owner === this.owner && variables.name === this.name)
|
||
|
.reply(200, {
|
||
|
data: {repository: {forks: {nodes: [{owner: {login: fork.owner}, name: fork.name}]}}}
|
||
|
});
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
expectCommitStatusCheck(sha: string, state: 'success'|'pending'|'failure'): this {
|
||
|
nock(this.repoApiUrl).get(`/commits/${sha}/status`).reply(200, {state}).activeMocks();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
expectPullRequestWait(prNumber: number): this {
|
||
|
// The pull request state could be queried multiple times, so we persist
|
||
|
// this mock request. By default, nock only mocks requests once.
|
||
|
nock(this.repoApiUrl).get(`/pulls/${prNumber}`).reply(200, {merged: true}).persist();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
expectChangelogFetch(branch: string, content: string): this {
|
||
|
nock(this.repoApiUrl).get(`/contents//CHANGELOG.md`).query(p => p.ref === branch).reply(200, {
|
||
|
content: new Buffer(content).toString('base64')
|
||
|
});
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
expectCommitRequest(sha: string, message: string): this {
|
||
|
nock(this.repoApiUrl).get(`/commits/${sha}`).reply(200, {commit: {message}});
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
expectTagToBeCreated(tagName: string, sha: string): this {
|
||
|
nock(this.repoApiUrl)
|
||
|
.post(`/git/refs`, b => b.ref === `refs/tags/${tagName}` && b.sha === sha)
|
||
|
.reply(200, {});
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
expectReleaseToBeCreated(name: string, tagName: string): this {
|
||
|
nock(this.repoApiUrl)
|
||
|
.post('/releases', b => b.name === name && b['tag_name'] === tagName)
|
||
|
.reply(200, {});
|
||
|
return this;
|
||
|
}
|
||
|
}
|