From 4028843ed11571a9aa695b4b9f351c553afe895f Mon Sep 17 00:00:00 2001 From: Felipe Santos Date: Fri, 29 Nov 2024 19:42:54 -0300 Subject: [PATCH] fix(gerrit): not auto-approving if change already had a Code-Review +1 --- lib/modules/platform/gerrit/client.spec.ts | 56 ++++++++++++++++++++-- lib/modules/platform/gerrit/client.ts | 18 ++++--- lib/modules/platform/gerrit/types.ts | 6 +++ 3 files changed, 69 insertions(+), 11 deletions(-) diff --git a/lib/modules/platform/gerrit/client.spec.ts b/lib/modules/platform/gerrit/client.spec.ts index 2d5ff5cddbf9fe6..343e9b05fe8bd68 100644 --- a/lib/modules/platform/gerrit/client.spec.ts +++ b/lib/modules/platform/gerrit/client.spec.ts @@ -393,10 +393,20 @@ describe('modules/platform/gerrit/client', () => { describe('approveChange()', () => { it('already approved - do nothing', async () => { - const change = partial({}); + const change = partial({ + labels: { + 'Code-Review': { + all: [{ value: 2 }], + }, + }, + }); httpMock .scope(gerritEndpointUrl) - .get((url) => url.includes('/a/changes/123456?o=')) + .get( + (url) => + url.includes('/a/changes/123456?o=') && + url.includes('o=DETAILED_LABELS'), + ) .reply(200, gerritRestResponse(change), jsonResultHeader); await expect(client.approveChange(123456)).toResolve(); }); @@ -405,17 +415,53 @@ describe('modules/platform/gerrit/client', () => { const change = partial({ labels: {} }); httpMock .scope(gerritEndpointUrl) - .get((url) => url.includes('/a/changes/123456?o=')) + .get( + (url) => + url.includes('/a/changes/123456?o=') && + url.includes('o=DETAILED_LABELS'), + ) .reply(200, gerritRestResponse(change), jsonResultHeader); await expect(client.approveChange(123456)).toResolve(); }); it('not already approved - approve now', async () => { - const change = partial({ labels: { 'Code-Review': {} } }); + const change = partial({ + labels: { 'Code-Review': { all: [] } }, + }); httpMock .scope(gerritEndpointUrl) - .get((url) => url.includes('/a/changes/123456?o=')) + .get( + (url) => + url.includes('/a/changes/123456?o=') && + url.includes('o=DETAILED_LABELS'), + ) + .reply(200, gerritRestResponse(change), jsonResultHeader); + const approveMock = httpMock + .scope(gerritEndpointUrl) + .post('/a/changes/123456/revisions/current/review', { + labels: { 'Code-Review': +2 }, + }) + .reply(200, gerritRestResponse(''), jsonResultHeader); + await expect(client.approveChange(123456)).toResolve(); + expect(approveMock.isDone()).toBeTrue(); + }); + + it('not already approved because of +1 - approve now', async () => { + const change = partial({ + labels: { + 'Code-Review': { + all: [{ value: 1 }], + }, + }, + }); + httpMock + .scope(gerritEndpointUrl) + .get( + (url) => + url.includes('/a/changes/123456?o=') && + url.includes('o=DETAILED_LABELS'), + ) .reply(200, gerritRestResponse(change), jsonResultHeader); const approveMock = httpMock .scope(gerritEndpointUrl) diff --git a/lib/modules/platform/gerrit/client.ts b/lib/modules/platform/gerrit/client.ts index 89b4ebf3e66e3ce..3c9a9c4af7efb0c 100644 --- a/lib/modules/platform/gerrit/client.ts +++ b/lib/modules/platform/gerrit/client.ts @@ -72,10 +72,13 @@ class GerritClient { return changes.body; } - async getChange(changeNumber: number): Promise { + async getChange( + changeNumber: number, + extraOptions?: string[], + ): Promise { + const options = [...this.requestDetails, ...(extraOptions ?? [])]; const changes = await this.gerritHttp.getJson( - `a/changes/${changeNumber}?` + - this.requestDetails.map((det) => `o=${det}`).join('&'), + `a/changes/${changeNumber}?` + options.map((det) => `o=${det}`).join('&'), ); return changes.body; } @@ -189,9 +192,12 @@ class GerritClient { } async checkIfApproved(changeId: number): Promise { - const change = await client.getChange(changeId); - const reviewLabels = change?.labels?.['Code-Review']; - return reviewLabels === undefined || reviewLabels.approved !== undefined; + const change = await client.getChange(changeId, ['DETAILED_LABELS']); + const reviewLabel = change?.labels?.['Code-Review']; + return ( + reviewLabel === undefined || + Boolean(reviewLabel.all?.some((label) => label.value === 2)) + ); } wasApprovedBy(change: GerritChange, username: string): boolean | undefined { diff --git a/lib/modules/platform/gerrit/types.ts b/lib/modules/platform/gerrit/types.ts index 0d1b5d90fed354c..09d242aa41e8afc 100644 --- a/lib/modules/platform/gerrit/types.ts +++ b/lib/modules/platform/gerrit/types.ts @@ -77,6 +77,8 @@ export interface GerritChangeMessageInfo { export interface GerritLabelInfo { approved?: GerritAccountInfo; rejected?: GerritAccountInfo; + /** List of votes. Only set when o=DETAILED_LABELS. */ + all?: GerritApprovalInfo[]; } export interface GerritActionInfo { @@ -99,3 +101,7 @@ export interface GerritMergeableInfo { | 'CHERRY_PICK'; mergeable: boolean; } + +export interface GerritApprovalInfo { + value?: number; +}