From 9235b1442795985e9e83293592094f2ce457521f Mon Sep 17 00:00:00 2001
From: Deepika Guliani <dguliani@gitlab.com>
Date: Mon, 22 May 2023 10:40:59 +0530
Subject: [PATCH] Change work item add note permission to `createNote`

Changelog: fixed
---
 .../components/notes/work_item_add_note.vue         |  6 +++---
 .../work_items/graphql/work_item.fragment.graphql   |  1 +
 .../components/notes/work_item_add_note_spec.js     | 13 ++++++++++++-
 spec/frontend/work_items/mock_data.js               | 13 +++++++++++++
 4 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/app/assets/javascripts/work_items/components/notes/work_item_add_note.vue b/app/assets/javascripts/work_items/components/notes/work_item_add_note.vue
index 330db7ff2ee48676..c330eccb1868c1f6 100644
--- a/app/assets/javascripts/work_items/components/notes/work_item_add_note.vue
+++ b/app/assets/javascripts/work_items/components/notes/work_item_add_note.vue
@@ -137,8 +137,8 @@ export default {
     isProjectArchived() {
       return this.workItem?.project?.archived;
     },
-    canUpdate() {
-      return this.workItem?.userPermissions?.updateWorkItem;
+    canCreateNote() {
+      return this.workItem?.userPermissions?.createNote;
     },
     workItemState() {
       return this.workItem?.state;
@@ -243,7 +243,7 @@ export default {
   <li :class="timelineEntryClass">
     <work-item-note-signed-out v-if="!signedIn" />
     <work-item-comment-locked
-      v-else-if="!canUpdate"
+      v-else-if="!canCreateNote"
       :work-item-type="workItemType"
       :is-project-archived="isProjectArchived"
     />
diff --git a/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql b/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
index 02243baf28d63bb1..f25ddf7d3f45df5c 100644
--- a/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
@@ -29,6 +29,7 @@ fragment WorkItem on WorkItem {
     updateWorkItem
     adminParentLink
     setWorkItemMetadata
+    createNote
   }
   widgets {
     ...WorkItemWidgets
diff --git a/spec/frontend/work_items/components/notes/work_item_add_note_spec.js b/spec/frontend/work_items/components/notes/work_item_add_note_spec.js
index 9bb84947db541fc0..e6d20dcb0d9bb99e 100644
--- a/spec/frontend/work_items/components/notes/work_item_add_note_spec.js
+++ b/spec/frontend/work_items/components/notes/work_item_add_note_spec.js
@@ -32,12 +32,14 @@ describe('Work item add note', () => {
 
   const findCommentForm = () => wrapper.findComponent(WorkItemCommentForm);
   const findTextarea = () => wrapper.findByTestId('note-reply-textarea');
+  const findWorkItemLockedComponent = () => wrapper.findComponent(WorkItemCommentLocked);
 
   const createComponent = async ({
     mutationHandler = mutationSuccessHandler,
     canUpdate = true,
+    canCreateNote = true,
     workItemIid = '1',
-    workItemResponse = workItemByIidResponseFactory({ canUpdate }),
+    workItemResponse = workItemByIidResponseFactory({ canUpdate, canCreateNote }),
     signedIn = true,
     isEditing = true,
     workItemType = 'Task',
@@ -265,4 +267,13 @@ describe('Work item add note', () => {
 
     expect(wrapper.attributes('class')).toContain('internal-note');
   });
+
+  describe('when work item`createNote` permission false', () => {
+    it('cannot add comment', async () => {
+      await createComponent({ isEditing: false, canCreateNote: false });
+
+      expect(findWorkItemLockedComponent().exists()).toBe(true);
+      expect(findCommentForm().exists()).toBe(false);
+    });
+  });
 });
diff --git a/spec/frontend/work_items/mock_data.js b/spec/frontend/work_items/mock_data.js
index a6e24d023a9f7ac8..96a692bebeef9546 100644
--- a/spec/frontend/work_items/mock_data.js
+++ b/spec/frontend/work_items/mock_data.js
@@ -109,6 +109,7 @@ export const workItemQueryResponse = {
         updateWorkItem: false,
         setWorkItemMetadata: false,
         adminParentLink: false,
+        createNote: false,
         __typename: 'WorkItemPermissions',
       },
       widgets: [
@@ -212,6 +213,7 @@ export const updateWorkItemMutationResponse = {
           updateWorkItem: false,
           setWorkItemMetadata: false,
           adminParentLink: false,
+          createNote: false,
           __typename: 'WorkItemPermissions',
         },
         widgets: [
@@ -316,6 +318,7 @@ export const convertWorkItemMutationResponse = {
           updateWorkItem: false,
           setWorkItemMetadata: false,
           adminParentLink: false,
+          createNote: false,
           __typename: 'WorkItemPermissions',
         },
         widgets: [
@@ -409,6 +412,7 @@ export const objectiveType = {
 export const workItemResponseFactory = ({
   canUpdate = false,
   canDelete = false,
+  canCreateNote = false,
   adminParentLink = false,
   notificationsWidgetPresent = true,
   currentUserTodosWidgetPresent = true,
@@ -463,6 +467,7 @@ export const workItemResponseFactory = ({
         updateWorkItem: canUpdate,
         setWorkItemMetadata: canUpdate,
         adminParentLink,
+        createNote: canCreateNote,
         __typename: 'WorkItemPermissions',
       },
       widgets: [
@@ -737,6 +742,7 @@ export const createWorkItemMutationResponse = {
           updateWorkItem: false,
           setWorkItemMetadata: false,
           adminParentLink: false,
+          createNote: false,
           __typename: 'WorkItemPermissions',
         },
         widgets: [],
@@ -962,6 +968,7 @@ export const workItemHierarchyEmptyResponse = {
               updateWorkItem: false,
               setWorkItemMetadata: false,
               adminParentLink: false,
+              createNote: false,
               __typename: 'WorkItemPermissions',
             },
             confidential: false,
@@ -1008,6 +1015,7 @@ export const workItemHierarchyNoUpdatePermissionResponse = {
         updateWorkItem: false,
         setWorkItemMetadata: false,
         adminParentLink: false,
+        createNote: false,
         __typename: 'WorkItemPermissions',
       },
       project: {
@@ -1156,6 +1164,7 @@ export const workItemHierarchyResponse = {
               updateWorkItem: true,
               setWorkItemMetadata: true,
               adminParentLink: true,
+              createNote: true,
               __typename: 'WorkItemPermissions',
             },
             author: {
@@ -1250,6 +1259,7 @@ export const workItemObjectiveWithChild = {
     updateWorkItem: true,
     setWorkItemMetadata: true,
     adminParentLink: true,
+    createNote: true,
     __typename: 'WorkItemPermissions',
   },
   author: {
@@ -1319,6 +1329,7 @@ export const workItemHierarchyTreeResponse = {
         updateWorkItem: true,
         setWorkItemMetadata: true,
         adminParentLink: true,
+        createNote: true,
         __typename: 'WorkItemPermissions',
       },
       confidential: false,
@@ -1398,6 +1409,7 @@ export const changeIndirectWorkItemParentMutationResponse = {
           updateWorkItem: true,
           setWorkItemMetadata: true,
           adminParentLink: true,
+          createNote: true,
           __typename: 'WorkItemPermissions',
         },
         description: null,
@@ -1461,6 +1473,7 @@ export const changeWorkItemParentMutationResponse = {
           updateWorkItem: true,
           setWorkItemMetadata: true,
           adminParentLink: true,
+          createNote: true,
           __typename: 'WorkItemPermissions',
         },
         description: null,
-- 
GitLab