Skip to content

Commit aa828f6

Browse files
committed
Cap latest release at v1.24.0 when JDK < 17
1 parent e60b80e commit aa828f6

File tree

6 files changed

+104
-70
lines changed

6 files changed

+104
-70
lines changed

.github/workflows/test.yml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ jobs:
2121
fail-fast: false
2222
matrix:
2323
os: [ubuntu-latest, windows-latest, macos-latest]
24-
java-version: [8, 11, 16]
25-
version: ["1.6", ""]
24+
java-version: [8, 11, 17]
2625
runs-on: ${{ matrix.os }}
2726
steps:
2827
- uses: actions/checkout@v4
@@ -40,15 +39,13 @@ jobs:
4039
with:
4140
skip-commit: true
4241
github-token: ${{ secrets.GITHUB_TOKEN }}
43-
version: ${{ matrix.version }}
4442

4543
tests-without-token:
4644
strategy:
4745
fail-fast: false
4846
matrix:
4947
os: [ubuntu-latest, windows-latest, macos-latest]
50-
java-version: [8, 11]
51-
version: ["1.6", ""]
48+
java-version: [8, 11, 17]
5249
runs-on: ${{ matrix.os }}
5350
steps:
5451
- uses: actions/checkout@v4
@@ -66,4 +63,3 @@ jobs:
6663
continue-on-error: ${{ matrix.os == 'macos-latest' }}
6764
with:
6865
skip-commit: true
69-
version: ${{ matrix.version }}

__tests__/main.test.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -164,21 +164,13 @@ describe('test getting Java version', () => {
164164
});
165165

166166
describe('test getting release data', () => {
167-
test('if no release name and java version >= 11, then return latest release', async () => {
167+
test('if no release name, then return latest release', async () => {
168168
const main = new Main(executor);
169169
mockGetLatestReleaseData.mockReturnValueOnce(Promise.resolve(dummyReleaseData));
170-
const releaseData = await main.getReleaseData(11, undefined);
170+
const releaseData = await main.getReleaseData(21, undefined);
171171
expect(releaseData).toEqual(dummyReleaseData);
172172
});
173173

174-
test('if no release name and java version < 11, then return release 1.7', async () => {
175-
const main = new Main(executor);
176-
mockGetReleaseDataByName.mockReturnValueOnce(Promise.resolve(dummyReleaseData));
177-
const releaseData = await main.getReleaseData(8, undefined);
178-
expect(releaseData).toEqual(dummyReleaseData);
179-
expect(mockGetReleaseDataByName).lastCalledWith('1.7');
180-
});
181-
182174
test('if release name, then return it', async () => {
183175
const releaseName = 'my-release';
184176
const main = new Main(executor);

__tests__/releases.test.ts

Lines changed: 78 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
4751
const executor = jest.fn<CommandExecutor>();
4852
type ListReleases = Octokit['rest']['repos']['listReleases'];
4953
type 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+
69107
const URL_BASE = "https://api.github.com/repos/google/google-java-format/releases";
70108

71109
describe('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

111140
describe('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

149191
describe('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();

dist/index.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35243,11 +35243,9 @@ class Main {
3524335243
return await this.execute('java', args, options);
3524435244
}
3524535245
async getReleaseData(javaVersion, releaseName) {
35246-
if (!releaseName && javaVersion >= 11) {
35247-
return this.releases.getLatestReleaseData();
35246+
if (!releaseName) {
35247+
return this.releases.getLatestReleaseData(javaVersion);
3524835248
}
35249-
// Versions after 1.7 require Java SDK 11+
35250-
releaseName = releaseName || '1.7';
3525135249
const releaseData = await this.releases.getReleaseDataByName(releaseName);
3525235250
if (!releaseData) {
3525335251
throw new Error(`Cannot find release id of Google Java Format ${releaseName}`);
@@ -35356,7 +35354,15 @@ class Releases {
3535635354
const response = await this.octokit.rest.repos.listReleases(params);
3535735355
return response.data;
3535835356
}
35359-
async getLatestReleaseData() {
35357+
async getLatestReleaseData(javaVersion) {
35358+
if (javaVersion < 11) {
35359+
// Versions after 1.7 require JDK 11+
35360+
return (await this.getReleaseDataByName('1.7'));
35361+
}
35362+
if (javaVersion < 17) {
35363+
// Versions after v1.24.0 require JDK 17+
35364+
return (await this.getReleaseDataByName('v1.24.0'));
35365+
}
3536035366
if (!this.octokit) {
3536135367
return this.callReleasesApi('/latest');
3536235368
}

src/main.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,9 @@ export class Main {
6161
}
6262

6363
async getReleaseData(javaVersion: number, releaseName: string | undefined): Promise<ReleaseData> {
64-
if (!releaseName && javaVersion >= 11) {
65-
return this.releases.getLatestReleaseData();
64+
if (!releaseName) {
65+
return this.releases.getLatestReleaseData(javaVersion);
6666
}
67-
// Versions after 1.7 require Java SDK 11+
68-
releaseName = releaseName || '1.7';
6967
const releaseData = await this.releases.getReleaseDataByName(releaseName);
7068
if (!releaseData) {
7169
throw new Error(`Cannot find release id of Google Java Format ${releaseName}`);

src/releases.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,15 @@ export class Releases {
3535
return response.data;
3636
}
3737

38-
async getLatestReleaseData(): Promise<ReleaseData> {
38+
async getLatestReleaseData(javaVersion: number): Promise<ReleaseData> {
39+
if (javaVersion < 11) {
40+
// Versions after 1.7 require JDK 11+
41+
return (await this.getReleaseDataByName('1.7'))!;
42+
}
43+
if (javaVersion < 17) {
44+
// Versions after v1.24.0 require JDK 17+
45+
return (await this.getReleaseDataByName('v1.24.0'))!;
46+
}
3947
if (!this.octokit) {
4048
return this.callReleasesApi('/latest');
4149
}

0 commit comments

Comments
 (0)