@@ -17,47 +17,58 @@ const expect = chai.expect;
1717describe ( "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