Skip to content

Commit c4766e4

Browse files
committed
Add additional tests for choosing the latest release of the CodeQL CLI
1 parent eba67f8 commit c4766e4

File tree

1 file changed

+89
-85
lines changed

1 file changed

+89
-85
lines changed

extensions/ql-vscode/src/vscode-tests/no-workspace/distribution.test.ts

Lines changed: 89 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -17,47 +17,58 @@ const expect = chai.expect;
1717
describe("Releases API consumer", () => {
1818
const owner = "someowner";
1919
const repo = "somerepo";
20-
const sampleReleaseResponse: GithubRelease[] = [
21-
{
22-
"assets": [],
23-
"created_at": "2019-09-01T00:00:00Z",
24-
"id": 1,
25-
"name": "",
26-
"prerelease": false,
27-
"tag_name": "v2.1.0"
28-
},
29-
{
30-
"assets": [],
31-
"created_at": "2019-08-10T00:00:00Z",
32-
"id": 2,
33-
"name": "",
34-
"prerelease": false,
35-
"tag_name": "v3.1.1"
36-
},
37-
{
38-
"assets": [{
39-
id: 1,
40-
name: "exampleAsset.txt",
41-
size: 1
42-
}],
43-
"created_at": "2019-09-05T00:00:00Z",
44-
"id": 3,
45-
"name": "",
46-
"prerelease": false,
47-
"tag_name": "v2.0.0"
48-
},
49-
{
50-
"assets": [],
51-
"created_at": "2019-08-11T00:00:00Z",
52-
"id": 4,
53-
"name": "",
54-
"prerelease": true,
55-
"tag_name": "v3.1.2-pre"
56-
},
57-
];
5820
const unconstrainedVersionRange = new semver.Range("*");
5921

60-
it("picking latest release: is based on version", async () => {
22+
describe("picking the latest release", () => {
23+
const sampleReleaseResponse: GithubRelease[] = [
24+
{
25+
"assets": [],
26+
"created_at": "2019-09-01T00:00:00Z",
27+
"id": 1,
28+
"name": "",
29+
"prerelease": false,
30+
"tag_name": "v2.1.0"
31+
},
32+
{
33+
"assets": [],
34+
"created_at": "2019-08-10T00:00:00Z",
35+
"id": 2,
36+
"name": "",
37+
"prerelease": false,
38+
"tag_name": "v3.1.1"
39+
},
40+
{
41+
"assets": [{
42+
id: 1,
43+
name: "exampleAsset.txt",
44+
size: 1
45+
}],
46+
"created_at": "2019-09-05T00:00:00Z",
47+
"id": 3,
48+
"name": "",
49+
"prerelease": false,
50+
"tag_name": "v2.0.0"
51+
},
52+
{
53+
"assets": [],
54+
"created_at": "2019-08-11T00:00:00Z",
55+
"id": 4,
56+
"name": "",
57+
"prerelease": true,
58+
"tag_name": "v3.1.2-pre-1.1"
59+
},
60+
// Release ID 5 is older than release ID 4 but its version has a higher precedence, so release
61+
// ID 5 should be picked over release ID 4.
62+
{
63+
"assets": [],
64+
"created_at": "2019-08-09T00:00:00Z",
65+
"id": 5,
66+
"name": "",
67+
"prerelease": true,
68+
"tag_name": "v3.1.2-pre-2.0"
69+
},
70+
];
71+
6172
class MockReleasesApiConsumer extends ReleasesApiConsumer {
6273
protected async makeApiCall(apiPath: string): Promise<fetch.Response> {
6374
if (apiPath === `/repos/${owner}/${repo}/releases`) {
@@ -67,62 +78,55 @@ describe("Releases API consumer", () => {
6778
}
6879
}
6980

70-
const consumer = new MockReleasesApiConsumer(owner, repo);
81+
it("picked release has version with the highest precedence", async () => {
82+
const consumer = new MockReleasesApiConsumer(owner, repo);
7183

72-
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionRange);
73-
expect(latestRelease.id).to.equal(2);
74-
});
84+
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionRange);
85+
expect(latestRelease.id).to.equal(2);
86+
});
7587

76-
it("picking latest release: version satisfies version range", async () => {
77-
class MockReleasesApiConsumer extends ReleasesApiConsumer {
78-
protected async makeApiCall(apiPath: string): Promise<fetch.Response> {
79-
if (apiPath === `/repos/${owner}/${repo}/releases`) {
80-
return Promise.resolve(new fetch.Response(JSON.stringify(sampleReleaseResponse)));
81-
}
82-
return Promise.reject(new Error(`Unknown API path: ${apiPath}`));
83-
}
84-
}
88+
it("version of picked release is within the version range", async () => {
89+
const consumer = new MockReleasesApiConsumer(owner, repo);
8590

86-
const consumer = new MockReleasesApiConsumer(owner, repo);
91+
const latestRelease = await consumer.getLatestRelease(new semver.Range("2.*.*"));
92+
expect(latestRelease.id).to.equal(1);
93+
});
8794

88-
const latestRelease = await consumer.getLatestRelease(new semver.Range("2.*.*"));
89-
expect(latestRelease.id).to.equal(1);
90-
});
95+
it("fails if none of the releases are within the version range", async () => {
96+
const consumer = new MockReleasesApiConsumer(owner, repo);
9197

92-
it("picking latest release: release passes additional compatibility test if additional compatibility test specified", async () => {
93-
class MockReleasesApiConsumer extends ReleasesApiConsumer {
94-
protected async makeApiCall(apiPath: string): Promise<fetch.Response> {
95-
if (apiPath === `/repos/${owner}/${repo}/releases`) {
96-
return Promise.resolve(new fetch.Response(JSON.stringify(sampleReleaseResponse)));
97-
}
98-
return Promise.reject(new Error(`Unknown API path: ${apiPath}`));
99-
}
100-
}
98+
await chai.expect(
99+
consumer.getLatestRelease(new semver.Range("5.*.*"))
100+
).to.be.rejectedWith(Error);
101+
});
101102

102-
const consumer = new MockReleasesApiConsumer(owner, repo);
103+
it("picked release passes additional compatibility test if an additional compatibility test is specified", async () => {
104+
const consumer = new MockReleasesApiConsumer(owner, repo);
103105

104-
const latestRelease = await consumer.getLatestRelease(
105-
new semver.Range("2.*.*"),
106-
true,
107-
release => release.assets.some(asset => asset.name === "exampleAsset.txt")
108-
);
109-
expect(latestRelease.id).to.equal(3);
110-
});
106+
const latestRelease = await consumer.getLatestRelease(
107+
new semver.Range("2.*.*"),
108+
true,
109+
release => release.assets.some(asset => asset.name === "exampleAsset.txt")
110+
);
111+
expect(latestRelease.id).to.equal(3);
112+
});
111113

112-
it("picking latest release: includes prereleases when option set", async () => {
113-
class MockReleasesApiConsumer extends ReleasesApiConsumer {
114-
protected async makeApiCall(apiPath: string): Promise<fetch.Response> {
115-
if (apiPath === `/repos/${owner}/${repo}/releases`) {
116-
return Promise.resolve(new fetch.Response(JSON.stringify(sampleReleaseResponse)));
117-
}
118-
return Promise.reject(new Error(`Unknown API path: ${apiPath}`));
119-
}
120-
}
114+
it("fails if none of the releases pass the additional compatibility test", async () => {
115+
const consumer = new MockReleasesApiConsumer(owner, repo);
121116

122-
const consumer = new MockReleasesApiConsumer(owner, repo);
117+
await chai.expect(consumer.getLatestRelease(
118+
new semver.Range("2.*.*"),
119+
true,
120+
release => release.assets.some(asset => asset.name === "otherExampleAsset.txt")
121+
)).to.be.rejectedWith(Error);
122+
});
123+
124+
it("picked release is the most recent prerelease when includePrereleases is set", async () => {
125+
const consumer = new MockReleasesApiConsumer(owner, repo);
123126

124-
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionRange, true);
125-
expect(latestRelease.id).to.equal(4);
127+
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionRange, true);
128+
expect(latestRelease.id).to.equal(5);
129+
});
126130
});
127131

128132
it("gets correct assets for a release", async () => {

0 commit comments

Comments
 (0)