@@ -44,6 +44,10 @@ const dummyReleaseData: ReleaseData = {
4444 assets : [ ]
4545} ;
4646
47+ const dummyReleaseData_1_7 = { ...dummyReleaseData , name : '1.7' } ;
48+ const dummyReleaseData_v1_24_0 = { ...dummyReleaseData , name : 'v1.24.0' } ;
49+ const allReleases = [ dummyReleaseData , dummyReleaseData_1_7 , dummyReleaseData_v1_24_0 ] ;
50+
4751const executor = jest . fn < CommandExecutor > ( ) ;
4852type ListReleases = Octokit [ 'rest' ] [ 'repos' ] [ 'listReleases' ] ;
4953type GetLatestRelease = Octokit [ 'rest' ] [ 'repos' ] [ 'getLatestRelease' ] ;
@@ -66,18 +70,48 @@ function expectLastCurlCallForUrl(url: string) {
6670 expect ( executor ) . lastCalledWith ( 'curl' , [ '-sL' , url ] , { ignoreReturnCode : false } ) ;
6771}
6872
73+ function mockApiReturn ( stdOut : string ) {
74+ executor . mockReturnValueOnce ( Promise . resolve ( {
75+ exitCode : 0 ,
76+ stdOut,
77+ stdErr : '' ,
78+ } ) ) ;
79+ }
80+
81+ function mockApiReturnReleases ( ) {
82+ mockApiReturn ( JSON . stringify ( allReleases ) ) ;
83+ }
84+
85+ function mockApiReturnRelease ( releaseData : ReleaseData ) {
86+ mockApiReturn ( JSON . stringify ( releaseData ) ) ;
87+ }
88+
89+ function mockOctokitReturnReleases ( ) {
90+ mockListReleases . mockReturnValueOnce ( Promise . resolve ( {
91+ headers : undefined as any ,
92+ status : 200 ,
93+ url : '' ,
94+ data : allReleases
95+ } ) ) ;
96+ }
97+
98+ function mockOctokitReturnRelease ( releaseData : ReleaseData ) {
99+ mockGetLatestRelease . mockReturnValueOnce ( Promise . resolve ( {
100+ headers : undefined as any ,
101+ status : 200 ,
102+ url : '' ,
103+ data : releaseData
104+ } ) ) ;
105+ }
106+
69107const URL_BASE = "https://api.github.com/repos/google/google-java-format/releases" ;
70108
71109describe ( 'get all release data' , ( ) => {
72110 test ( 'get all release data with API' , async ( ) => {
73- executor . mockReturnValueOnce ( Promise . resolve ( {
74- exitCode : 0 ,
75- stdOut : JSON . stringify ( [ dummyReleaseData ] ) ,
76- stdErr : '' ,
77- } ) ) ;
111+ mockApiReturnReleases ( ) ;
78112 const releases = new Releases ( executor ) ;
79113 const results = await releases . getAllReleaseData ( ) ;
80- expect ( results ) . toEqual ( [ dummyReleaseData ] ) ;
114+ expect ( results ) . toEqual ( allReleases ) ;
81115 // IMPORTANT: should not have a trailing slash
82116 expectLastCurlCallForUrl ( URL_BASE ) ;
83117 } ) ;
@@ -94,65 +128,69 @@ describe('get all release data', () => {
94128 } ) ;
95129
96130 test ( 'get all release data with octokit' , async ( ) => {
97- mockListReleases . mockReturnValueOnce ( Promise . resolve ( {
98- headers : undefined as any ,
99- status : 200 ,
100- url : "" ,
101- data : [ dummyReleaseData ]
102- } ) ) ;
131+ mockOctokitReturnReleases ( ) ;
103132 const releases = new Releases ( executor , octokit ) ;
104133 const results = await releases . getAllReleaseData ( ) ;
105- expect ( results ) . toEqual ( [ dummyReleaseData ] ) ;
134+ expect ( results ) . toEqual ( allReleases ) ;
106135 expect ( mockGetLatestRelease ) . not . toBeCalled ( ) ;
107136 expect ( executor ) . not . toBeCalled ( ) ;
108137 } ) ;
109138} ) ;
110139
111140describe ( 'get latest release data' , ( ) => {
112- test ( 'get latest release data with API' , async ( ) => {
113- executor . mockReturnValueOnce ( Promise . resolve ( {
114- exitCode : 0 ,
115- stdOut : JSON . stringify ( dummyReleaseData ) ,
116- stdErr : '' ,
117- } ) ) ;
141+ const casesJavaVersions : [ number , ReleaseData ] [ ] = [ [ 8 , dummyReleaseData_1_7 ] , [ 11 , dummyReleaseData_v1_24_0 ] ] ;
142+
143+ describe ( 'get latest release data with API' , ( ) => {
118144 const releases = new Releases ( executor ) ;
119- const results = await releases . getLatestReleaseData ( ) ;
120- expect ( results ) . toEqual ( dummyReleaseData ) ;
121- expectLastCurlCallForUrl ( URL_BASE + "/latest" ) ;
145+
146+ test . each ( casesJavaVersions ) ( 'when java version is %i, then return release %o' , async ( javaVersion , expectedRelease ) => {
147+ mockApiReturnReleases ( ) ;
148+ const result = await releases . getLatestReleaseData ( javaVersion ) ;
149+ expect ( result ) . toEqual ( expectedRelease ) ;
150+ // IMPORTANT: should not have a trailing slash
151+ expectLastCurlCallForUrl ( URL_BASE ) ;
152+ } ) ;
153+
154+ test ( 'when java version is 21, then return release latest' , async ( ) => {
155+ mockApiReturnRelease ( dummyReleaseData ) ;
156+ const result = await releases . getLatestReleaseData ( 21 ) ;
157+ expect ( result ) . toEqual ( dummyReleaseData ) ;
158+ expectLastCurlCallForUrl ( URL_BASE + "/latest" ) ;
159+ } ) ;
122160 } ) ;
123161
124162 test ( 'get latest release data with API and call to API fails' , async ( ) => {
125163 const error = new Error ( "Command 'curl ...' failed with exit code 1" ) ;
126164 executor . mockReturnValueOnce ( Promise . reject ( error ) ) ;
127165 const releases = new Releases ( executor ) ;
128- expect ( ( ) => releases . getLatestReleaseData ( ) )
166+ expect ( ( ) => releases . getLatestReleaseData ( 21 ) )
129167 . rejects
130168 . toThrow ( error ) ;
131169 expectLastCurlCallForUrl ( URL_BASE + "/latest" ) ;
132170 } ) ;
133171
134- test ( 'get latest release data with octokit' , async ( ) => {
135- mockGetLatestRelease . mockReturnValueOnce ( Promise . resolve ( {
136- headers : undefined as any ,
137- status : 200 ,
138- url : "" ,
139- data : dummyReleaseData
140- } ) ) ;
172+ describe ( 'get latest release data with octokit' , ( ) => {
141173 const releases = new Releases ( executor , octokit ) ;
142- const results = await releases . getLatestReleaseData ( ) ;
143- expect ( results ) . toEqual ( dummyReleaseData ) ;
144- expect ( mockListReleases ) . not . toBeCalled ( ) ;
145- expect ( executor ) . not . toBeCalled ( ) ;
174+
175+ test . each ( casesJavaVersions ) ( 'when java version is %i, then return release %o' , async ( javaVersion , expectedRelease ) => {
176+ mockOctokitReturnReleases ( ) ;
177+ const result = await releases . getLatestReleaseData ( javaVersion ) ;
178+ expect ( result ) . toEqual ( expectedRelease ) ;
179+ expect ( executor ) . not . toBeCalled ( ) ;
180+ } ) ;
181+
182+ test ( 'when java version is 21, then return latest release' , async ( ) => {
183+ mockOctokitReturnRelease ( dummyReleaseData ) ;
184+ const result = await releases . getLatestReleaseData ( 21 ) ;
185+ expect ( result ) . toEqual ( dummyReleaseData ) ;
186+ expect ( executor ) . not . toBeCalled ( ) ;
187+ } ) ;
146188 } ) ;
147189} ) ;
148190
149191describe ( 'get release by name' , ( ) => {
150192 test ( 'get release by name (existing)' , async ( ) => {
151- executor . mockReturnValueOnce ( Promise . resolve ( {
152- exitCode : 0 ,
153- stdOut : JSON . stringify ( [ dummyReleaseData ] ) ,
154- stdErr : '' ,
155- } ) ) ;
193+ mockApiReturnReleases ( ) ;
156194 const releases = new Releases ( executor ) ;
157195 const result = await releases . getReleaseDataByName ( 'dummy-release-data' ) ;
158196 expect ( result ) . toEqual ( dummyReleaseData ) ;
@@ -161,11 +199,7 @@ describe('get release by name', () => {
161199 } ) ;
162200
163201 test ( 'get release by name (non-existing)' , async ( ) => {
164- executor . mockReturnValueOnce ( Promise . resolve ( {
165- exitCode : 0 ,
166- stdOut : JSON . stringify ( [ dummyReleaseData ] ) ,
167- stdErr : '' ,
168- } ) ) ;
202+ mockApiReturnReleases ( ) ;
169203 const releases = new Releases ( executor ) ;
170204 const result = await releases . getReleaseDataByName ( 'non-existing-data' ) ;
171205 expect ( result ) . toBeUndefined ( ) ;
0 commit comments