From 5ddc49644b4a823ee21c5beb75eda09f24d1ff4e Mon Sep 17 00:00:00 2001
From: Artur Fedorov <afedorov@gitlab.com>
Date: Wed, 12 Mar 2025 15:49:49 +0100
Subject: [PATCH] Add additional checks for group projects

Add fallback values for grapqhql response
in case of response has some missing values

Changelog: fixed
EE: true
---
 .../shared/group_projects_dropdown.vue        |  9 +++++----
 .../shared/group_projects_dropdown_spec.js    | 20 +++++++++++++++++++
 2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/ee/app/assets/javascripts/security_orchestration/components/shared/group_projects_dropdown.vue b/ee/app/assets/javascripts/security_orchestration/components/shared/group_projects_dropdown.vue
index b15a071c7415..5e1a4548bb94 100644
--- a/ee/app/assets/javascripts/security_orchestration/components/shared/group_projects_dropdown.vue
+++ b/ee/app/assets/javascripts/security_orchestration/components/shared/group_projects_dropdown.vue
@@ -32,10 +32,11 @@ export default {
          * otherwise after performing backend search and selecting found item
          * selection is overwritten
          */
-        return uniqBy([...this.projects, ...data.group.projects.nodes], 'id');
+        const { projects: { nodes = [] } = {} } = data.group || {};
+        return uniqBy([...this.projects, ...nodes], 'id');
       },
       result({ data }) {
-        this.pageInfo = data?.group?.projects.pageInfo || {};
+        this.pageInfo = data?.group?.projects?.pageInfo || {};
 
         if (this.selectedButNotLoadedProjectIds.length > 0) {
           this.fetchGroupProjectsByIds();
@@ -176,8 +177,8 @@ export default {
           query: getGroupProjects,
           variables,
         });
-
-        this.projects = uniqBy([...this.projects, ...data.group.projects.nodes], 'id');
+        const { projects: { nodes = [] } = {} } = data.group || {};
+        this.projects = uniqBy([...this.projects, ...nodes], 'id');
       } catch {
         this.$emit('projects-query-error');
       }
diff --git a/ee/spec/frontend/security_orchestration/components/shared/group_projects_dropdown_spec.js b/ee/spec/frontend/security_orchestration/components/shared/group_projects_dropdown_spec.js
index b9d09244ed86..dd3e71860b2e 100644
--- a/ee/spec/frontend/security_orchestration/components/shared/group_projects_dropdown_spec.js
+++ b/ee/spec/frontend/security_orchestration/components/shared/group_projects_dropdown_spec.js
@@ -206,6 +206,26 @@ describe('GroupProjectsDropdown', () => {
       });
     });
 
+    describe('when fetch query returns group as null', () => {
+      it('renders empty list when group is null', async () => {
+        createComponent({
+          handlers: {
+            handlers: {
+              getGroupProjects: jest.fn().mockResolvedValue({
+                data: {
+                  id: 1,
+                  group: null,
+                },
+              }),
+            },
+          },
+        });
+
+        await waitForPromises();
+        expect(wrapper.emitted('projects-query-error')).toHaveLength(1);
+      });
+    });
+
     describe('when a query is loading a new page of projects', () => {
       it('should render the loading spinner', async () => {
         createComponent({ handlers: mockApolloHandlers([], true) });
-- 
GitLab