From 2f040f7569e40c1725037eaa822a55dbaf26e415 Mon Sep 17 00:00:00 2001
From: Phil Hughes <me@iamphill.com>
Date: Mon, 14 Oct 2024 14:11:29 +0100
Subject: [PATCH] Updated summary text for approvals in reviewers sidebar
 widget

https://gitlab.com/gitlab-org/gitlab/-/issues/499064
---
 .../components/reviewers/approval_summary.vue     |  6 +++++-
 .../queries/approval_summary.query.graphql        |  1 +
 .../queries/approval_summary.subscription.graphql |  1 +
 .../components/reviewers/approval_summary_spec.js | 15 ++++++++++++++-
 locale/gitlab.pot                                 |  3 +++
 5 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/ee/app/assets/javascripts/merge_requests/components/reviewers/approval_summary.vue b/ee/app/assets/javascripts/merge_requests/components/reviewers/approval_summary.vue
index 3572d36f885c..5256ccab0961 100644
--- a/ee/app/assets/javascripts/merge_requests/components/reviewers/approval_summary.vue
+++ b/ee/app/assets/javascripts/merge_requests/components/reviewers/approval_summary.vue
@@ -1,5 +1,5 @@
 <script>
-import { n__, sprintf, s__ } from '~/locale';
+import { n__, sprintf, s__, __ } from '~/locale';
 import { getApprovalRuleNamesLeft } from 'ee/vue_merge_request_widget/mappers';
 import { toNounSeriesText } from '~/lib/utils/grammar';
 import { TYPENAME_MERGE_REQUEST } from '~/graphql_shared/constants';
@@ -81,6 +81,10 @@ export default {
         return s__('mrWidget|Approval is optional');
       }
 
+      if (this.mergeRequest.approved) {
+        return __('All required approvals given');
+      }
+
       if (this.rulesLeft.length && !this.shortText) {
         return sprintf(
           n__(
diff --git a/ee/app/assets/javascripts/merge_requests/queries/approval_summary.query.graphql b/ee/app/assets/javascripts/merge_requests/queries/approval_summary.query.graphql
index e41e43b36f43..ccfeb61e6ee5 100644
--- a/ee/app/assets/javascripts/merge_requests/queries/approval_summary.query.graphql
+++ b/ee/app/assets/javascripts/merge_requests/queries/approval_summary.query.graphql
@@ -3,6 +3,7 @@ query approvalSummary($projectPath: ID!, $iid: String!) {
     id
     mergeRequest(iid: $iid) {
       id
+      approved
       approvalsLeft
       approvalsRequired
       approvedBy {
diff --git a/ee/app/assets/javascripts/merge_requests/queries/approval_summary.subscription.graphql b/ee/app/assets/javascripts/merge_requests/queries/approval_summary.subscription.graphql
index c01821db4c85..2b59206abb89 100644
--- a/ee/app/assets/javascripts/merge_requests/queries/approval_summary.subscription.graphql
+++ b/ee/app/assets/javascripts/merge_requests/queries/approval_summary.subscription.graphql
@@ -2,6 +2,7 @@ subscription approvalSummarySubscription($issuableId: IssuableID!) {
   mergeRequestApprovalStateUpdated(issuableId: $issuableId) {
     ... on MergeRequest {
       id
+      approved
       approvalsLeft
       approvalsRequired
       approvedBy {
diff --git a/ee/spec/frontend/merge_requests/components/reviewers/approval_summary_spec.js b/ee/spec/frontend/merge_requests/components/reviewers/approval_summary_spec.js
index bd6b03878c6d..7e959965c7ed 100644
--- a/ee/spec/frontend/merge_requests/components/reviewers/approval_summary_spec.js
+++ b/ee/spec/frontend/merge_requests/components/reviewers/approval_summary_spec.js
@@ -16,6 +16,7 @@ const mockData = ({ approvalsRequired = 1, approvalsLeft = 1, approvedBy = [] }
       id: 1,
       mergeRequest: {
         id: 1,
+        approved: approvalsLeft === 0,
         approvalsLeft,
         approvalsRequired,
         approvedBy: {
@@ -79,6 +80,16 @@ describe('Reviewers drawer approval summary component', () => {
 
       expect(wrapper.text()).toBe('Requires 1 approval from Code Owners.');
     });
+
+    it('renders approval given when approved', async () => {
+      createComponent({
+        resolver: jest.fn().mockResolvedValue(mockData({ approvalsLeft: 0 })),
+      });
+
+      await waitForPromises();
+
+      expect(wrapper.text()).toBe('All required approvals given');
+    });
   });
 
   describe('when approval is optional', () => {
@@ -98,6 +109,8 @@ describe('Reviewers drawer approval summary component', () => {
 
     await waitForPromises();
 
+    expect(wrapper.text()).toBe('Requires 1 approval from Code Owners.');
+
     mockedSubscription.next({
       data: {
         mergeRequestApprovalStateUpdated: mockData({
@@ -110,6 +123,6 @@ describe('Reviewers drawer approval summary component', () => {
 
     await waitForPromises();
 
-    expect(wrapper.text()).toBe('Requires 0 approvals from Code Owners.');
+    expect(wrapper.text()).toBe('All required approvals given');
   });
 });
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 4012fba884fd..f39d109ff51a 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -5661,6 +5661,9 @@ msgstr ""
 msgid "All protected branches"
 msgstr ""
 
+msgid "All required approvals given"
+msgstr ""
+
 msgid "All required approvals must be given."
 msgstr ""
 
-- 
GitLab