Add additional tests for choosing the latest release of the CodeQL CLI
This commit is contained in:
@@ -17,47 +17,58 @@ const expect = chai.expect;
|
||||
describe("Releases API consumer", () => {
|
||||
const owner = "someowner";
|
||||
const repo = "somerepo";
|
||||
const sampleReleaseResponse: GithubRelease[] = [
|
||||
{
|
||||
"assets": [],
|
||||
"created_at": "2019-09-01T00:00:00Z",
|
||||
"id": 1,
|
||||
"name": "",
|
||||
"prerelease": false,
|
||||
"tag_name": "v2.1.0"
|
||||
},
|
||||
{
|
||||
"assets": [],
|
||||
"created_at": "2019-08-10T00:00:00Z",
|
||||
"id": 2,
|
||||
"name": "",
|
||||
"prerelease": false,
|
||||
"tag_name": "v3.1.1"
|
||||
},
|
||||
{
|
||||
"assets": [{
|
||||
id: 1,
|
||||
name: "exampleAsset.txt",
|
||||
size: 1
|
||||
}],
|
||||
"created_at": "2019-09-05T00:00:00Z",
|
||||
"id": 3,
|
||||
"name": "",
|
||||
"prerelease": false,
|
||||
"tag_name": "v2.0.0"
|
||||
},
|
||||
{
|
||||
"assets": [],
|
||||
"created_at": "2019-08-11T00:00:00Z",
|
||||
"id": 4,
|
||||
"name": "",
|
||||
"prerelease": true,
|
||||
"tag_name": "v3.1.2-pre"
|
||||
},
|
||||
];
|
||||
const unconstrainedVersionRange = new semver.Range("*");
|
||||
|
||||
it("picking latest release: is based on version", async () => {
|
||||
describe("picking the latest release", () => {
|
||||
const sampleReleaseResponse: GithubRelease[] = [
|
||||
{
|
||||
"assets": [],
|
||||
"created_at": "2019-09-01T00:00:00Z",
|
||||
"id": 1,
|
||||
"name": "",
|
||||
"prerelease": false,
|
||||
"tag_name": "v2.1.0"
|
||||
},
|
||||
{
|
||||
"assets": [],
|
||||
"created_at": "2019-08-10T00:00:00Z",
|
||||
"id": 2,
|
||||
"name": "",
|
||||
"prerelease": false,
|
||||
"tag_name": "v3.1.1"
|
||||
},
|
||||
{
|
||||
"assets": [{
|
||||
id: 1,
|
||||
name: "exampleAsset.txt",
|
||||
size: 1
|
||||
}],
|
||||
"created_at": "2019-09-05T00:00:00Z",
|
||||
"id": 3,
|
||||
"name": "",
|
||||
"prerelease": false,
|
||||
"tag_name": "v2.0.0"
|
||||
},
|
||||
{
|
||||
"assets": [],
|
||||
"created_at": "2019-08-11T00:00:00Z",
|
||||
"id": 4,
|
||||
"name": "",
|
||||
"prerelease": true,
|
||||
"tag_name": "v3.1.2-pre-1.1"
|
||||
},
|
||||
// Release ID 5 is older than release ID 4 but its version has a higher precedence, so release
|
||||
// ID 5 should be picked over release ID 4.
|
||||
{
|
||||
"assets": [],
|
||||
"created_at": "2019-08-09T00:00:00Z",
|
||||
"id": 5,
|
||||
"name": "",
|
||||
"prerelease": true,
|
||||
"tag_name": "v3.1.2-pre-2.0"
|
||||
},
|
||||
];
|
||||
|
||||
class MockReleasesApiConsumer extends ReleasesApiConsumer {
|
||||
protected async makeApiCall(apiPath: string): Promise<fetch.Response> {
|
||||
if (apiPath === `/repos/${owner}/${repo}/releases`) {
|
||||
@@ -67,62 +78,55 @@ describe("Releases API consumer", () => {
|
||||
}
|
||||
}
|
||||
|
||||
const consumer = new MockReleasesApiConsumer(owner, repo);
|
||||
it("picked release has version with the highest precedence", async () => {
|
||||
const consumer = new MockReleasesApiConsumer(owner, repo);
|
||||
|
||||
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionRange);
|
||||
expect(latestRelease.id).to.equal(2);
|
||||
});
|
||||
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionRange);
|
||||
expect(latestRelease.id).to.equal(2);
|
||||
});
|
||||
|
||||
it("picking latest release: version satisfies version range", async () => {
|
||||
class MockReleasesApiConsumer extends ReleasesApiConsumer {
|
||||
protected async makeApiCall(apiPath: string): Promise<fetch.Response> {
|
||||
if (apiPath === `/repos/${owner}/${repo}/releases`) {
|
||||
return Promise.resolve(new fetch.Response(JSON.stringify(sampleReleaseResponse)));
|
||||
}
|
||||
return Promise.reject(new Error(`Unknown API path: ${apiPath}`));
|
||||
}
|
||||
}
|
||||
it("version of picked release is within the version range", async () => {
|
||||
const consumer = new MockReleasesApiConsumer(owner, repo);
|
||||
|
||||
const consumer = new MockReleasesApiConsumer(owner, repo);
|
||||
const latestRelease = await consumer.getLatestRelease(new semver.Range("2.*.*"));
|
||||
expect(latestRelease.id).to.equal(1);
|
||||
});
|
||||
|
||||
const latestRelease = await consumer.getLatestRelease(new semver.Range("2.*.*"));
|
||||
expect(latestRelease.id).to.equal(1);
|
||||
});
|
||||
it("fails if none of the releases are within the version range", async () => {
|
||||
const consumer = new MockReleasesApiConsumer(owner, repo);
|
||||
|
||||
it("picking latest release: release passes additional compatibility test if additional compatibility test specified", async () => {
|
||||
class MockReleasesApiConsumer extends ReleasesApiConsumer {
|
||||
protected async makeApiCall(apiPath: string): Promise<fetch.Response> {
|
||||
if (apiPath === `/repos/${owner}/${repo}/releases`) {
|
||||
return Promise.resolve(new fetch.Response(JSON.stringify(sampleReleaseResponse)));
|
||||
}
|
||||
return Promise.reject(new Error(`Unknown API path: ${apiPath}`));
|
||||
}
|
||||
}
|
||||
await chai.expect(
|
||||
consumer.getLatestRelease(new semver.Range("5.*.*"))
|
||||
).to.be.rejectedWith(Error);
|
||||
});
|
||||
|
||||
const consumer = new MockReleasesApiConsumer(owner, repo);
|
||||
it("picked release passes additional compatibility test if an additional compatibility test is specified", async () => {
|
||||
const consumer = new MockReleasesApiConsumer(owner, repo);
|
||||
|
||||
const latestRelease = await consumer.getLatestRelease(
|
||||
new semver.Range("2.*.*"),
|
||||
true,
|
||||
release => release.assets.some(asset => asset.name === "exampleAsset.txt")
|
||||
);
|
||||
expect(latestRelease.id).to.equal(3);
|
||||
});
|
||||
const latestRelease = await consumer.getLatestRelease(
|
||||
new semver.Range("2.*.*"),
|
||||
true,
|
||||
release => release.assets.some(asset => asset.name === "exampleAsset.txt")
|
||||
);
|
||||
expect(latestRelease.id).to.equal(3);
|
||||
});
|
||||
|
||||
it("picking latest release: includes prereleases when option set", async () => {
|
||||
class MockReleasesApiConsumer extends ReleasesApiConsumer {
|
||||
protected async makeApiCall(apiPath: string): Promise<fetch.Response> {
|
||||
if (apiPath === `/repos/${owner}/${repo}/releases`) {
|
||||
return Promise.resolve(new fetch.Response(JSON.stringify(sampleReleaseResponse)));
|
||||
}
|
||||
return Promise.reject(new Error(`Unknown API path: ${apiPath}`));
|
||||
}
|
||||
}
|
||||
it("fails if none of the releases pass the additional compatibility test", async () => {
|
||||
const consumer = new MockReleasesApiConsumer(owner, repo);
|
||||
|
||||
const consumer = new MockReleasesApiConsumer(owner, repo);
|
||||
await chai.expect(consumer.getLatestRelease(
|
||||
new semver.Range("2.*.*"),
|
||||
true,
|
||||
release => release.assets.some(asset => asset.name === "otherExampleAsset.txt")
|
||||
)).to.be.rejectedWith(Error);
|
||||
});
|
||||
|
||||
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionRange, true);
|
||||
expect(latestRelease.id).to.equal(4);
|
||||
it("picked release is the most recent prerelease when includePrereleases is set", async () => {
|
||||
const consumer = new MockReleasesApiConsumer(owner, repo);
|
||||
|
||||
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionRange, true);
|
||||
expect(latestRelease.id).to.equal(5);
|
||||
});
|
||||
});
|
||||
|
||||
it("gets correct assets for a release", async () => {
|
||||
|
||||
Reference in New Issue
Block a user