11import { Response } from "node-fetch" ;
22import { Range } from "semver" ;
33
4- import type {
5- GithubRelease ,
6- GithubReleaseAsset ,
7- } from "../../../../src/codeql-cli/distribution/releases-api-consumer" ;
4+ import type { GithubRelease } from "../../../../src/codeql-cli/distribution/releases-api-consumer" ;
85import { ReleasesApiConsumer } from "../../../../src/codeql-cli/distribution/releases-api-consumer" ;
96
107describe ( "Releases API consumer" , ( ) => {
118 const repositoryNwo = "someowner/somerepo" ;
129 const unconstrainedVersionRange = new Range ( "*" ) ;
1310
14- describe ( "picking the latest release" , ( ) => {
15- const sampleReleaseResponse : GithubRelease [ ] = [
16- {
17- assets : [ ] ,
18- created_at : "2019-09-01T00:00:00Z" ,
19- id : 1 ,
20- name : "" ,
21- prerelease : false ,
22- tag_name : "v2.1.0" ,
23- } ,
24- {
25- assets : [ ] ,
26- created_at : "2019-08-10T00:00:00Z" ,
27- id : 2 ,
28- name : "" ,
29- prerelease : false ,
30- tag_name : "v3.1.1" ,
31- } ,
32- {
33- assets : [
34- {
35- id : 1 ,
36- name : "exampleAsset.txt" ,
37- size : 1 ,
38- } ,
39- ] ,
40- created_at : "2019-09-05T00:00:00Z" ,
41- id : 3 ,
42- name : "" ,
43- prerelease : false ,
44- tag_name : "v2.0.0" ,
45- } ,
46- {
47- assets : [ ] ,
48- created_at : "2019-08-11T00:00:00Z" ,
49- id : 4 ,
50- name : "" ,
51- prerelease : true ,
52- tag_name : "v3.1.2-pre-1.1" ,
53- } ,
54- // Release ID 5 is older than release ID 4 but its version has a higher precedence, so release
55- // ID 5 should be picked over release ID 4.
56- {
57- assets : [ ] ,
58- created_at : "2019-08-09T00:00:00Z" ,
59- id : 5 ,
60- name : "" ,
61- prerelease : true ,
62- tag_name : "v3.1.2-pre-2.0" ,
63- } ,
64- // Has a tag_name that is not valid semver
65- {
66- assets : [ ] ,
67- created_at : "2019-08-010T00:00:00Z" ,
68- id : 6 ,
69- name : "" ,
70- prerelease : true ,
71- tag_name : "codeql-bundle-20231220" ,
72- } ,
73- ] ;
74-
75- class MockReleasesApiConsumer extends ReleasesApiConsumer {
76- protected async makeApiCall ( apiPath : string ) : Promise < Response > {
77- if ( apiPath === `/repos/${ repositoryNwo } /releases` ) {
78- return Promise . resolve (
79- new Response ( JSON . stringify ( sampleReleaseResponse ) ) ,
80- ) ;
81- }
82- return Promise . reject ( new Error ( `Unknown API path: ${ apiPath } ` ) ) ;
11+ const sampleReleaseResponse : GithubRelease [ ] = [
12+ {
13+ assets : [ ] ,
14+ created_at : "2019-09-01T00:00:00Z" ,
15+ id : 1 ,
16+ name : "v2.1.0" ,
17+ prerelease : false ,
18+ tag_name : "v2.1.0" ,
19+ } ,
20+ {
21+ assets : [
22+ {
23+ id : 1 ,
24+ name : "firstAsset" ,
25+ size : 11 ,
26+ } ,
27+ {
28+ id : 2 ,
29+ name : "secondAsset" ,
30+ size : 12 ,
31+ } ,
32+ ] ,
33+ created_at : "2019-08-10T00:00:00Z" ,
34+ id : 2 ,
35+ name : "v3.1.1" ,
36+ prerelease : false ,
37+ tag_name : "v3.1.1" ,
38+ } ,
39+ {
40+ assets : [
41+ {
42+ id : 1 ,
43+ name : "exampleAsset.txt" ,
44+ size : 1 ,
45+ } ,
46+ ] ,
47+ created_at : "2019-09-05T00:00:00Z" ,
48+ id : 3 ,
49+ name : "v2.0.0" ,
50+ prerelease : false ,
51+ tag_name : "v2.0.0" ,
52+ } ,
53+ {
54+ assets : [ ] ,
55+ created_at : "2019-08-11T00:00:00Z" ,
56+ id : 4 ,
57+ name : "v3.1.2-pre-1.1" ,
58+ prerelease : true ,
59+ tag_name : "v3.1.2-pre-1.1" ,
60+ } ,
61+ // Release ID 5 is older than release ID 4 but its version has a higher precedence, so release
62+ // ID 5 should be picked over release ID 4.
63+ {
64+ assets : [ ] ,
65+ created_at : "2019-08-09T00:00:00Z" ,
66+ id : 5 ,
67+ name : "v3.1.2-pre-2.0" ,
68+ prerelease : true ,
69+ tag_name : "v3.1.2-pre-2.0" ,
70+ } ,
71+ // Has a tag_name that is not valid semver
72+ {
73+ assets : [ ] ,
74+ created_at : "2019-08-010T00:00:00Z" ,
75+ id : 6 ,
76+ name : "codeql-bundle-20231220" ,
77+ prerelease : true ,
78+ tag_name : "codeql-bundle-20231220" ,
79+ } ,
80+ ] ;
81+
82+ class MockReleasesApiConsumer extends ReleasesApiConsumer {
83+ protected async makeApiCall ( apiPath : string ) : Promise < Response > {
84+ if ( apiPath === `/repos/${ repositoryNwo } /releases` ) {
85+ return Promise . resolve (
86+ new Response ( JSON . stringify ( sampleReleaseResponse ) ) ,
87+ ) ;
8388 }
89+ return Promise . reject ( new Error ( `Unknown API path: ${ apiPath } ` ) ) ;
8490 }
91+ }
8592
93+ describe ( "picking the latest release" , ( ) => {
8694 it ( "picked release is non-prerelease with the highest semver" , async ( ) => {
8795 const consumer = new MockReleasesApiConsumer ( repositoryNwo ) ;
8896
@@ -167,7 +175,12 @@ describe("Releases API consumer", () => {
167175 } ) ;
168176
169177 it ( "gets correct assets for a release" , async ( ) => {
170- const expectedAssets : GithubReleaseAsset [ ] = [
178+ const consumer = new MockReleasesApiConsumer ( repositoryNwo ) ;
179+
180+ const assets = ( await consumer . getLatestRelease ( unconstrainedVersionRange ) )
181+ . assets ;
182+
183+ expect ( assets ) . toEqual ( [
171184 {
172185 id : 1 ,
173186 name : "firstAsset" ,
@@ -178,38 +191,6 @@ describe("Releases API consumer", () => {
178191 name : "secondAsset" ,
179192 size : 12 ,
180193 } ,
181- ] ;
182-
183- class MockReleasesApiConsumer extends ReleasesApiConsumer {
184- protected async makeApiCall ( apiPath : string ) : Promise < Response > {
185- if ( apiPath === `/repos/${ repositoryNwo } /releases` ) {
186- const responseBody : GithubRelease [ ] = [
187- {
188- assets : expectedAssets ,
189- created_at : "2019-09-01T00:00:00Z" ,
190- id : 1 ,
191- name : "Release 1" ,
192- prerelease : false ,
193- tag_name : "v2.0.0" ,
194- } ,
195- ] ;
196-
197- return Promise . resolve ( new Response ( JSON . stringify ( responseBody ) ) ) ;
198- }
199- return Promise . reject ( new Error ( `Unknown API path: ${ apiPath } ` ) ) ;
200- }
201- }
202-
203- const consumer = new MockReleasesApiConsumer ( repositoryNwo ) ;
204-
205- const assets = ( await consumer . getLatestRelease ( unconstrainedVersionRange ) )
206- . assets ;
207-
208- expect ( assets . length ) . toBe ( expectedAssets . length ) ;
209- expectedAssets . map ( ( expectedAsset , index ) => {
210- expect ( assets [ index ] . id ) . toBe ( expectedAsset . id ) ;
211- expect ( assets [ index ] . name ) . toBe ( expectedAsset . name ) ;
212- expect ( assets [ index ] . size ) . toBe ( expectedAsset . size ) ;
213- } ) ;
194+ ] ) ;
214195 } ) ;
215196} ) ;
0 commit comments