Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
java-version: [8, 11, 17]
java-version: [8, 11, 17, 21]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
Expand Down
31 changes: 16 additions & 15 deletions __tests__/releases.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,18 @@ const dummyReleaseData: ReleaseData = {

const dummyReleaseData_1_7 = { ...dummyReleaseData, name: '1.7' };
const dummyReleaseData_v1_24_0 = { ...dummyReleaseData, name: 'v1.24.0' };
const allReleases = [dummyReleaseData, dummyReleaseData_1_7, dummyReleaseData_v1_24_0];
const dummyReleaseData_v1_28_0 = { ...dummyReleaseData, name: 'v1.28.0' };
const allReleases = [dummyReleaseData, dummyReleaseData_1_7, dummyReleaseData_v1_24_0, dummyReleaseData_v1_28_0];

const executor = jest.fn<CommandExecutor>();
type Paginate = Octokit['paginate'];
type ListReleases = Octokit['rest']['repos']['listReleases'];
type GetLatestRelease = Octokit['rest']['repos']['getLatestRelease'];
const mockPaginate = jest.fn<Paginate>();
const mockListReleases = jest.fn<ListReleases>();
const mockGetLatestRelease = jest.fn<GetLatestRelease>();
const octokit = {
paginate: mockPaginate,
rest: {
repos: {
listReleases: mockListReleases,
Expand Down Expand Up @@ -87,12 +91,7 @@ function mockApiReturnRelease(releaseData: ReleaseData) {
}

function mockOctokitReturnReleases() {
mockListReleases.mockReturnValueOnce(Promise.resolve({
headers: undefined as any,
status: 200,
url: '',
data: allReleases
}));
mockPaginate.mockReturnValueOnce(Promise.resolve(allReleases));
}

function mockOctokitReturnRelease(releaseData: ReleaseData) {
Expand All @@ -105,6 +104,7 @@ function mockOctokitReturnRelease(releaseData: ReleaseData) {
}

const URL_BASE = "https://api.github.com/repos/google/google-java-format/releases";
const URL_TAIL = "?per_page=100";

describe('get all release data', () => {
test('get all release data with API', async () => {
Expand All @@ -113,7 +113,7 @@ describe('get all release data', () => {
const results = await releases.getAllReleaseData();
expect(results).toEqual(allReleases);
// IMPORTANT: should not have a trailing slash
expectLastCurlCallForUrl(URL_BASE);
expectLastCurlCallForUrl(URL_BASE + URL_TAIL);
});

test('get all release data with API and call to API fails', async () => {
Expand All @@ -124,21 +124,22 @@ describe('get all release data', () => {
.rejects
.toThrow(error)
// IMPORTANT: should not have a trailing slash
expectLastCurlCallForUrl(URL_BASE);
expectLastCurlCallForUrl(URL_BASE + URL_TAIL);
});

test('get all release data with octokit', async () => {
mockOctokitReturnReleases();
const releases = new Releases(executor, octokit);
const results = await releases.getAllReleaseData();
expect(results).toEqual(allReleases);
expect(mockPaginate).toHaveBeenCalledWith(octokit.rest.repos.listReleases, expect.anything());
expect(mockGetLatestRelease).not.toBeCalled();
expect(executor).not.toBeCalled();
});
});

describe('get latest release data', () => {
const casesJavaVersions: [number, ReleaseData][] = [[8, dummyReleaseData_1_7], [11, dummyReleaseData_v1_24_0]];
const casesJavaVersions: [number, ReleaseData][] = [[8, dummyReleaseData_1_7], [11, dummyReleaseData_v1_24_0], [17, dummyReleaseData_v1_28_0]];

describe('get latest release data with API', () => {
const releases = new Releases(executor);
Expand All @@ -148,14 +149,14 @@ describe('get latest release data', () => {
const result = await releases.getLatestReleaseData(javaVersion);
expect(result).toEqual(expectedRelease);
// IMPORTANT: should not have a trailing slash
expectLastCurlCallForUrl(URL_BASE);
expectLastCurlCallForUrl(URL_BASE + URL_TAIL);
});

test('when java version is 21, then return release latest', async () => {
mockApiReturnRelease(dummyReleaseData);
const result = await releases.getLatestReleaseData(21);
expect(result).toEqual(dummyReleaseData);
expectLastCurlCallForUrl(URL_BASE + "/latest");
expectLastCurlCallForUrl(URL_BASE + "/latest" + URL_TAIL);
});
});

Expand All @@ -166,7 +167,7 @@ describe('get latest release data', () => {
expect(() => releases.getLatestReleaseData(21))
.rejects
.toThrow(error);
expectLastCurlCallForUrl(URL_BASE + "/latest");
expectLastCurlCallForUrl(URL_BASE + "/latest" + URL_TAIL);
});

describe('get latest release data with octokit', () => {
Expand Down Expand Up @@ -195,7 +196,7 @@ describe('get release by name', () => {
const result = await releases.getReleaseDataByName('dummy-release-data');
expect(result).toEqual(dummyReleaseData);
// IMPORTANT: should not have a trailing slash
expectLastCurlCallForUrl(URL_BASE);
expectLastCurlCallForUrl(URL_BASE + URL_TAIL);
});

test('get release by name (non-existing)', async () => {
Expand All @@ -204,6 +205,6 @@ describe('get release by name', () => {
const result = await releases.getReleaseDataByName('non-existing-data');
expect(result).toBeUndefined();
// IMPORTANT: should not have a trailing slash
expectLastCurlCallForUrl(URL_BASE);
expectLastCurlCallForUrl(URL_BASE + URL_TAIL);
});
});
12 changes: 8 additions & 4 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -32713,17 +32713,17 @@ class Releases {
this.octokit = octokit;
}
async callReleasesApi(pathParameter) {
const url = `${Releases.apiReleases}${pathParameter || ''}`;
const url = `${Releases.apiReleases}${pathParameter || ''}?per_page=100`;
const response = await this.execute('curl', ['-sL', url], { ignoreReturnCode: false });
return JSON.parse(response.stdOut);
}
async getAllReleaseData() {
if (!this.octokit) {
return this.callReleasesApi();
}
const params = { owner: const_1.repositoryOwner, repo: const_1.repositoryName };
const response = await this.octokit.rest.repos.listReleases(params);
return response.data;
const params = { owner: const_1.repositoryOwner, repo: const_1.repositoryName, per_page: 100 };
const allReleases = await this.octokit.paginate(this.octokit.rest.repos.listReleases, params);
return allReleases;
}
async getLatestReleaseData(javaVersion) {
if (javaVersion < 11) {
Expand All @@ -32734,6 +32734,10 @@ class Releases {
// Versions after v1.24.0 require JDK 17+
return (await this.getReleaseDataByName('v1.24.0'));
}
if (javaVersion < 21) {
// Versions after v1.28.0 require JDK 21+
return (await this.getReleaseDataByName('v1.28.0'));
}
if (!this.octokit) {
return this.callReleasesApi('/latest');
}
Expand Down
14 changes: 9 additions & 5 deletions src/releases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export class Releases {
private async callReleasesApi(pathParameter: string | number): Promise<ReleaseData>;
private async callReleasesApi(pathParameter?: number): Promise<ReleaseData | ReleaseData[]>;
private async callReleasesApi(pathParameter?: string | number): Promise<ReleaseData | ReleaseData[]> {
const url = `${Releases.apiReleases}${pathParameter || ''}`;
const url = `${Releases.apiReleases}${pathParameter || ''}?per_page=100`;
const response = await this.execute('curl', ['-sL', url], { ignoreReturnCode: false });
return JSON.parse(response.stdOut);
}
Expand All @@ -30,9 +30,9 @@ export class Releases {
if (!this.octokit) {
return this.callReleasesApi();
}
const params = { owner: GJF_REPO_OWNER, repo: GJF_REPO_NAME };
const response = await this.octokit.rest.repos.listReleases(params);
return response.data;
const params = { owner: GJF_REPO_OWNER, repo: GJF_REPO_NAME, per_page: 100 };
const allReleases = await this.octokit.paginate(this.octokit.rest.repos.listReleases, params);
return allReleases;
}

async getLatestReleaseData(javaVersion: number): Promise<ReleaseData> {
Expand All @@ -44,6 +44,10 @@ export class Releases {
// Versions after v1.24.0 require JDK 17+
return (await this.getReleaseDataByName('v1.24.0'))!;
}
if (javaVersion < 21) {
// Versions after v1.28.0 require JDK 21+
return (await this.getReleaseDataByName('v1.28.0'))!;
}
if (!this.octokit) {
return this.callReleasesApi('/latest');
}
Expand All @@ -56,4 +60,4 @@ export class Releases {
const allReleaseData = await this.getAllReleaseData();
return allReleaseData.find(r => r.name === releaseName);
}
}
}
Loading