From 9596bfa3632b845bf192401dd2c702c35c24fb5b Mon Sep 17 00:00:00 2001
From: Adam Setch <adam.setch@outlook.com>
Date: Tue, 20 Sep 2022 01:34:42 -0400
Subject: [PATCH] feat(platform/bitbucket): update to use effective default
 reviewers (#17869)

---
 lib/modules/platform/bitbucket/index.spec.ts | 84 ++++++++++++++------
 lib/modules/platform/bitbucket/index.ts      |  9 ++-
 lib/modules/platform/bitbucket/utils.ts      |  6 ++
 3 files changed, 69 insertions(+), 30 deletions(-)

diff --git a/lib/modules/platform/bitbucket/index.spec.ts b/lib/modules/platform/bitbucket/index.spec.ts
index 16dafb7141..35aef41c28 100644
--- a/lib/modules/platform/bitbucket/index.spec.ts
+++ b/lib/modules/platform/bitbucket/index.spec.ts
@@ -696,11 +696,29 @@ describe('modules/platform/bitbucket/index', () => {
 
   describe('createPr()', () => {
     it('posts PR', async () => {
+      const projectReviewer = {
+        type: 'default_reviewer',
+        reviewer_type: 'project',
+        user: {
+          display_name: 'Bob Smith',
+          uuid: '{d2238482-2e9f-48b3-8630-de22ccb9e42f}',
+          account_id: '123',
+        },
+      };
+      const repoReviewer = {
+        type: 'default_reviewer',
+        reviewer_type: 'repository',
+        user: {
+          display_name: 'Jane Smith',
+          uuid: '{90b6646d-1724-4a64-9fd9-539515fe94e9}',
+          account_id: '456',
+        },
+      };
       const scope = await initRepoMock();
       scope
-        .get('/2.0/repositories/some/repo/default-reviewers')
+        .get('/2.0/repositories/some/repo/effective-default-reviewers')
         .reply(200, {
-          values: [{ uuid: '{1234-5678}' }],
+          values: [projectReviewer, repoReviewer],
         })
         .post('/2.0/repositories/some/repo/pullrequests')
         .reply(200, { id: 5 });
@@ -718,18 +736,22 @@ describe('modules/platform/bitbucket/index', () => {
 
     it('removes inactive reviewers when updating pr', async () => {
       const inactiveReviewer = {
-        display_name: 'Bob Smith',
-        uuid: '{d2238482-2e9f-48b3-8630-de22ccb9e42f}',
-        account_id: '123',
+        user: {
+          display_name: 'Bob Smith',
+          uuid: '{d2238482-2e9f-48b3-8630-de22ccb9e42f}',
+          account_id: '123',
+        },
       };
       const activeReviewer = {
-        display_name: 'Jane Smith',
-        uuid: '{90b6646d-1724-4a64-9fd9-539515fe94e9}',
-        account_id: '456',
+        user: {
+          display_name: 'Jane Smith',
+          uuid: '{90b6646d-1724-4a64-9fd9-539515fe94e9}',
+          account_id: '456',
+        },
       };
       const scope = await initRepoMock();
       scope
-        .get('/2.0/repositories/some/repo/default-reviewers')
+        .get('/2.0/repositories/some/repo/effective-default-reviewers')
         .reply(200, {
           values: [activeReviewer, inactiveReviewer],
         })
@@ -767,18 +789,22 @@ describe('modules/platform/bitbucket/index', () => {
 
     it('removes default reviewers no longer member of the workspace when creating pr', async () => {
       const notMemberReviewer = {
-        display_name: 'Bob Smith',
-        uuid: '{d2238482-2e9f-48b3-8630-de22ccb9e42f}',
-        account_id: '123',
+        user: {
+          display_name: 'Bob Smith',
+          uuid: '{d2238482-2e9f-48b3-8630-de22ccb9e42f}',
+          account_id: '123',
+        },
       };
       const memberReviewer = {
-        display_name: 'Jane Smith',
-        uuid: '{90b6646d-1724-4a64-9fd9-539515fe94e9}',
-        account_id: '456',
+        user: {
+          display_name: 'Jane Smith',
+          uuid: '{90b6646d-1724-4a64-9fd9-539515fe94e9}',
+          account_id: '456',
+        },
       };
       const scope = await initRepoMock();
       scope
-        .get('/2.0/repositories/some/repo/default-reviewers')
+        .get('/2.0/repositories/some/repo/effective-default-reviewers')
         .reply(200, {
           values: [memberReviewer, notMemberReviewer],
         })
@@ -819,13 +845,15 @@ describe('modules/platform/bitbucket/index', () => {
 
     it('throws exception when unable to check default reviewers workspace membership', async () => {
       const reviewer = {
-        display_name: 'Bob Smith',
-        uuid: '{d2238482-2e9f-48b3-8630-de22ccb9e42f}',
-        account_id: '123',
+        user: {
+          display_name: 'Bob Smith',
+          uuid: '{d2238482-2e9f-48b3-8630-de22ccb9e42f}',
+          account_id: '123',
+        },
       };
       const scope = await initRepoMock();
       scope
-        .get('/2.0/repositories/some/repo/default-reviewers')
+        .get('/2.0/repositories/some/repo/effective-default-reviewers')
         .reply(200, {
           values: [reviewer],
         })
@@ -861,13 +889,15 @@ describe('modules/platform/bitbucket/index', () => {
 
     it('rethrows exception when PR create error due to unknown reviewers error', async () => {
       const reviewer = {
-        display_name: 'Jane Smith',
-        uuid: '{90b6646d-1724-4a64-9fd9-539515fe94e9}',
+        user: {
+          display_name: 'Jane Smith',
+          uuid: '{90b6646d-1724-4a64-9fd9-539515fe94e9}',
+        },
       };
 
       const scope = await initRepoMock();
       scope
-        .get('/2.0/repositories/some/repo/default-reviewers')
+        .get('/2.0/repositories/some/repo/effective-default-reviewers')
         .reply(200, {
           values: [reviewer],
         })
@@ -896,13 +926,15 @@ describe('modules/platform/bitbucket/index', () => {
 
     it('rethrows exception when PR create error not due to reviewers field', async () => {
       const reviewer = {
-        display_name: 'Jane Smith',
-        uuid: '{90b6646d-1724-4a64-9fd9-539515fe94e9}',
+        user: {
+          display_name: 'Jane Smith',
+          uuid: '{90b6646d-1724-4a64-9fd9-539515fe94e9}',
+        },
       };
 
       const scope = await initRepoMock();
       scope
-        .get('/2.0/repositories/some/repo/default-reviewers')
+        .get('/2.0/repositories/some/repo/effective-default-reviewers')
         .reply(200, {
           values: [reviewer],
         })
diff --git a/lib/modules/platform/bitbucket/index.ts b/lib/modules/platform/bitbucket/index.ts
index 299a39e6d1..b839c2ecdf 100644
--- a/lib/modules/platform/bitbucket/index.ts
+++ b/lib/modules/platform/bitbucket/index.ts
@@ -35,6 +35,7 @@ import * as comments from './comments';
 import * as utils from './utils';
 import {
   Account,
+  EffectiveReviewer,
   PrResponse,
   RepoInfoBody,
   mergeBodyTransformer,
@@ -738,12 +739,12 @@ export async function createPr({
 
   if (platformOptions?.bbUseDefaultReviewers) {
     const reviewersResponse = (
-      await bitbucketHttp.getJson<utils.PagedResult<Account>>(
-        `/2.0/repositories/${config.repository}/default-reviewers`
+      await bitbucketHttp.getJson<utils.PagedResult<EffectiveReviewer>>(
+        `/2.0/repositories/${config.repository}/effective-default-reviewers`
       )
     ).body;
-    reviewers = reviewersResponse.values.map((reviewer: Account) => ({
-      uuid: reviewer.uuid,
+    reviewers = reviewersResponse.values.map((reviewer: EffectiveReviewer) => ({
+      uuid: reviewer.user.uuid,
     }));
   }
 
diff --git a/lib/modules/platform/bitbucket/utils.ts b/lib/modules/platform/bitbucket/utils.ts
index aa24d538a9..6eb16508ee 100644
--- a/lib/modules/platform/bitbucket/utils.ts
+++ b/lib/modules/platform/bitbucket/utils.ts
@@ -201,3 +201,9 @@ export interface Account {
   nickname?: string;
   account_status?: string;
 }
+
+export interface EffectiveReviewer {
+  type: string;
+  reviewer_type: string;
+  user: Account;
+}
-- 
GitLab