11import { beforeEach , describe , expect , jest , test } from "@jest/globals" ;
22import { Octokit , ReleaseData , Releases } from "../src/releases" ;
3- import { CommandExecutor } from "../src/exec " ;
3+ import { RequestError } from "@octokit/request-error " ;
44
55const dummyReleaseData : ReleaseData = {
66 url : "" ,
@@ -49,7 +49,6 @@ const dummyReleaseData_v1_24_0 = { ...dummyReleaseData, name: 'v1.24.0' };
4949const dummyReleaseData_v1_28_0 = { ...dummyReleaseData , name : 'v1.28.0' } ;
5050const allReleases = [ dummyReleaseData , dummyReleaseData_1_7 , dummyReleaseData_v1_24_0 , dummyReleaseData_v1_28_0 ] ;
5151
52- const executor = jest . fn < CommandExecutor > ( ) ;
5352type Paginate = Octokit [ 'paginate' ] ;
5453type ListReleases = Octokit [ 'rest' ] [ 'repos' ] [ 'listReleases' ] ;
5554type GetLatestRelease = Octokit [ 'rest' ] [ 'repos' ] [ 'getLatestRelease' ] ;
@@ -70,26 +69,6 @@ beforeEach(() => {
7069 jest . clearAllMocks ( ) ;
7170} )
7271
73- function expectLastCurlCallForUrl ( url : string ) {
74- expect ( executor ) . lastCalledWith ( 'curl' , [ '-sL' , url ] , { ignoreReturnCode : false } ) ;
75- }
76-
77- function mockApiReturn ( stdOut : string ) {
78- executor . mockReturnValueOnce ( Promise . resolve ( {
79- exitCode : 0 ,
80- stdOut,
81- stdErr : '' ,
82- } ) ) ;
83- }
84-
85- function mockApiReturnReleases ( ) {
86- mockApiReturn ( JSON . stringify ( allReleases ) ) ;
87- }
88-
89- function mockApiReturnRelease ( releaseData : ReleaseData ) {
90- mockApiReturn ( JSON . stringify ( releaseData ) ) ;
91- }
92-
9372function mockOctokitReturnReleases ( ) {
9473 mockPaginate . mockReturnValueOnce ( Promise . resolve ( allReleases ) ) ;
9574}
@@ -103,108 +82,69 @@ function mockOctokitReturnRelease(releaseData: ReleaseData) {
10382 } ) ) ;
10483}
10584
106- const URL_BASE = "https://api.github.com/repos/google/google-java-format/releases" ;
107- const URL_TAIL = "?per_page=100" ;
108-
10985describe ( 'get all release data' , ( ) => {
110- test ( 'get all release data with API' , async ( ) => {
111- mockApiReturnReleases ( ) ;
112- const releases = new Releases ( executor ) ;
113- const results = await releases . getAllReleaseData ( ) ;
114- expect ( results ) . toEqual ( allReleases ) ;
115- // IMPORTANT: should not have a trailing slash
116- expectLastCurlCallForUrl ( URL_BASE + URL_TAIL ) ;
117- } ) ;
118-
119- test ( 'get all release data with API and call to API fails' , async ( ) => {
120- const error = new Error ( "Command 'curl ...' failed with exit code 1" ) ;
121- executor . mockReturnValueOnce ( Promise . reject ( error ) ) ;
122- const releases = new Releases ( executor ) ;
123- expect ( ( ) => releases . getAllReleaseData ( ) )
124- . rejects
125- . toThrow ( error )
126- // IMPORTANT: should not have a trailing slash
127- expectLastCurlCallForUrl ( URL_BASE + URL_TAIL ) ;
128- } ) ;
129-
13086 test ( 'get all release data with octokit' , async ( ) => {
13187 mockOctokitReturnReleases ( ) ;
132- const releases = new Releases ( executor , octokit ) ;
88+ const releases = new Releases ( octokit ) ;
13389 const results = await releases . getAllReleaseData ( ) ;
13490 expect ( results ) . toEqual ( allReleases ) ;
13591 expect ( mockPaginate ) . toHaveBeenCalledWith ( octokit . rest . repos . listReleases , expect . anything ( ) ) ;
13692 expect ( mockGetLatestRelease ) . not . toBeCalled ( ) ;
137- expect ( executor ) . not . toBeCalled ( ) ;
13893 } ) ;
139- } ) ;
140-
141- describe ( 'get latest release data' , ( ) => {
142- const casesJavaVersions : [ number , ReleaseData ] [ ] = [ [ 8 , dummyReleaseData_1_7 ] , [ 11 , dummyReleaseData_v1_24_0 ] , [ 17 , dummyReleaseData_v1_28_0 ] ] ;
143-
144- describe ( 'get latest release data with API' , ( ) => {
145- const releases = new Releases ( executor ) ;
14694
147- test . each ( casesJavaVersions ) ( 'when java version is %i, then return release %o ', async ( javaVersion , expectedRelease ) => {
148- mockApiReturnReleases ( ) ;
149- const result = await releases . getLatestReleaseData ( javaVersion ) ;
150- expect ( result ) . toEqual ( expectedRelease ) ;
151- // IMPORTANT: should not have a trailing slash
152- expectLastCurlCallForUrl ( URL_BASE + URL_TAIL ) ;
153- } ) ;
154-
155- test ( 'when java version is 21, then return release latest' , async ( ) => {
156- mockApiReturnRelease ( dummyReleaseData ) ;
157- const result = await releases . getLatestReleaseData ( 21 ) ;
158- expect ( result ) . toEqual ( dummyReleaseData ) ;
159- expectLastCurlCallForUrl ( URL_BASE + "/latest" + URL_TAIL ) ;
95+ test ( 'get all release data with octokit and call fails ', async ( ) => {
96+ const error = new RequestError ( "Not Found" , 500 , {
97+ request : {
98+ method : "GET" ,
99+ url : "/repos/google/google-java-format/releases" ,
100+ headers : { } ,
101+ } ,
102+ response : {
103+ status : 500 ,
104+ url : "/repos/google/google-java-format/releases" ,
105+ headers : { } ,
106+ data : { message : "Error" } ,
107+ } ,
160108 } ) ;
109+ mockPaginate . mockRejectedValue ( error ) ;
110+ const releases = new Releases ( octokit ) ;
111+ await expect ( releases . getAllReleaseData ( ) ) . rejects . toThrow ( error ) ;
112+ expect ( mockPaginate ) . toHaveBeenCalledWith ( octokit . rest . repos . listReleases , expect . anything ( ) ) ;
161113 } ) ;
114+ } ) ;
162115
163- test ( 'get latest release data with API and call to API fails' , async ( ) => {
164- const error = new Error ( "Command 'curl ...' failed with exit code 1" ) ;
165- executor . mockReturnValueOnce ( Promise . reject ( error ) ) ;
166- const releases = new Releases ( executor ) ;
167- expect ( ( ) => releases . getLatestReleaseData ( 21 ) )
168- . rejects
169- . toThrow ( error ) ;
170- expectLastCurlCallForUrl ( URL_BASE + "/latest" + URL_TAIL ) ;
171- } ) ;
116+ describe ( 'get latest release data' , ( ) => {
117+ const casesJavaVersions : [ number , ReleaseData ] [ ] = [ [ 8 , dummyReleaseData_1_7 ] , [ 11 , dummyReleaseData_v1_24_0 ] , [ 17 , dummyReleaseData_v1_28_0 ] ] ;
172118
173119 describe ( 'get latest release data with octokit' , ( ) => {
174- const releases = new Releases ( executor , octokit ) ;
120+ const releases = new Releases ( octokit ) ;
175121
176122 test . each ( casesJavaVersions ) ( 'when java version is %i, then return release %o' , async ( javaVersion , expectedRelease ) => {
177123 mockOctokitReturnReleases ( ) ;
178124 const result = await releases . getLatestReleaseData ( javaVersion ) ;
179125 expect ( result ) . toEqual ( expectedRelease ) ;
180- expect ( executor ) . not . toBeCalled ( ) ;
181126 } ) ;
182127
183128 test ( 'when java version is 21, then return latest release' , async ( ) => {
184129 mockOctokitReturnRelease ( dummyReleaseData ) ;
185130 const result = await releases . getLatestReleaseData ( 21 ) ;
186131 expect ( result ) . toEqual ( dummyReleaseData ) ;
187- expect ( executor ) . not . toBeCalled ( ) ;
188132 } ) ;
189133 } ) ;
190134} ) ;
191135
192136describe ( 'get release by name' , ( ) => {
193137 test ( 'get release by name (existing)' , async ( ) => {
194- mockApiReturnReleases ( ) ;
195- const releases = new Releases ( executor ) ;
138+ mockOctokitReturnReleases ( ) ;
139+ const releases = new Releases ( octokit ) ;
196140 const result = await releases . getReleaseDataByName ( 'dummy-release-data' ) ;
197141 expect ( result ) . toEqual ( dummyReleaseData ) ;
198- // IMPORTANT: should not have a trailing slash
199- expectLastCurlCallForUrl ( URL_BASE + URL_TAIL ) ;
200142 } ) ;
201143
202144 test ( 'get release by name (non-existing)' , async ( ) => {
203- mockApiReturnReleases ( ) ;
204- const releases = new Releases ( executor ) ;
145+ mockOctokitReturnReleases ( ) ;
146+ const releases = new Releases ( octokit ) ;
205147 const result = await releases . getReleaseDataByName ( 'non-existing-data' ) ;
206148 expect ( result ) . toBeUndefined ( ) ;
207- // IMPORTANT: should not have a trailing slash
208- expectLastCurlCallForUrl ( URL_BASE + URL_TAIL ) ;
209149 } ) ;
210- } ) ;
150+ } ) ;
0 commit comments