From 369585475e26223dbef213195bfe794ed40eb51b Mon Sep 17 00:00:00 2001
From: Fernando Arias <farias@gitlab.com>
Date: Sun, 4 Sep 2022 12:23:34 +0200
Subject: [PATCH 1/2] First pass legacy license compliance widget removal

* Remove frontend flags
* Update unit and browser automation tests

Changelog: changed
EE: true
---
 .../mr_widget_options.vue                     | 20 +----
 .../ee/projects/merge_requests_controller.rb  |  1 -
 .../projects/merge_requests/show.html.haml    |  2 +-
 .../refactor_license_compliance_extension.yml |  8 --
 .../user_sees_status_checks_widget_spec.rb    |  1 -
 .../ee_mr_widget_options_spec.js              | 85 ++++++++++++-------
 qa/qa/ee/page/component/license_management.rb | 26 +-----
 qa/qa/ee/page/merge_request/show.rb           | 11 +--
 8 files changed, 61 insertions(+), 93 deletions(-)
 delete mode 100644 ee/config/feature_flags/development/refactor_license_compliance_extension.yml

diff --git a/ee/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue b/ee/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
index 5b086fe767074437..acb30e78bd0ee099 100644
--- a/ee/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
+++ b/ee/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
@@ -1,6 +1,5 @@
 <script>
 import { GlSprintf, GlLink, GlSafeHtmlDirective } from '@gitlab/ui';
-import MrWidgetLicenses from 'ee/vue_shared/license_compliance/mr_widget_license_report.vue';
 import reportsMixin from 'ee/vue_shared/security_reports/mixins/reports_mixin';
 import { registerExtension } from '~/vue_merge_request_widget/components/extensions';
 import { s__, __, sprintf } from '~/locale';
@@ -20,7 +19,6 @@ export default {
   components: {
     GlSprintf,
     GlLink,
-    MrWidgetLicenses,
     WidgetContainer,
     MrWidgetGeoSecondaryNode,
     MrWidgetPolicyViolation,
@@ -93,9 +91,6 @@ export default {
         !this.shouldShowExtension
       );
     },
-    shouldShowLicenseComplianceExtension() {
-      return window.gon?.features?.refactorLicenseComplianceExtension;
-    },
     hasLoadPerformanceMetrics() {
       return (
         this.mr.loadPerformanceMetrics?.degraded?.length > 0 ||
@@ -224,7 +219,7 @@ export default {
   },
   methods: {
     registerLicenseCompliance() {
-      if (this.shouldShowLicenseComplianceExtension) {
+      if (this.shouldShowExtension) {
         registerExtension(licenseComplianceExtension);
       }
     },
@@ -486,19 +481,6 @@ export default {
         </gl-sprintf>
       </mr-widget-enable-feature-prompt>
 
-      <mr-widget-licenses
-        v-if="shouldRenderLicenseReport && !shouldShowLicenseComplianceExtension"
-        :api-url="mr.licenseScanning.managed_licenses_path"
-        :approvals-api-path="mr.apiApprovalsPath"
-        :licenses-api-path="licensesApiPath"
-        :pipeline-path="mr.pipeline.path"
-        :can-manage-licenses="mr.licenseScanning.can_manage_licenses"
-        :full-report-path="mr.licenseScanning.full_report_path"
-        :license-management-settings-path="mr.licenseScanning.settings_path"
-        :license-compliance-docs-path="mr.licenseComplianceDocsPath"
-        report-section-class="mr-widget-border-top"
-      />
-
       <grouped-test-reports-app
         v-if="shouldRenderTestReport && !shouldRenderRefactoredTestReport"
         class="js-reports-container"
diff --git a/ee/app/controllers/ee/projects/merge_requests_controller.rb b/ee/app/controllers/ee/projects/merge_requests_controller.rb
index 233cdcbfde237ae4..b3364b258a8e8713 100644
--- a/ee/app/controllers/ee/projects/merge_requests_controller.rb
+++ b/ee/app/controllers/ee/projects/merge_requests_controller.rb
@@ -19,7 +19,6 @@ module MergeRequestsController
           push_frontend_feature_flag(:refactor_mr_widgets_extensions, @project)
           push_frontend_feature_flag(:refactor_mr_widget_test_summary, @project)
           push_frontend_feature_flag(:refactor_mr_widgets_extensions_user, current_user)
-          push_frontend_feature_flag(:refactor_license_compliance_extension, @project)
           push_frontend_feature_flag(:suggested_reviewers, @project)
         end
 
diff --git a/ee/app/views/projects/merge_requests/show.html.haml b/ee/app/views/projects/merge_requests/show.html.haml
index 49f09ac910202566..446ba2b1f925c0a8 100644
--- a/ee/app/views/projects/merge_requests/show.html.haml
+++ b/ee/app/views/projects/merge_requests/show.html.haml
@@ -15,7 +15,7 @@
     window.gl.mrWidgetData.coverage_fuzzing_help_path = '#{help_page_path("user/application_security/coverage_fuzzing/index")}';
     window.gl.mrWidgetData.visual_review_app_available = '#{@project.feature_available?(:visual_review_app)}' === 'true';
     window.gl.mrWidgetData.license_scanning_comparison_path = '#{license_scanning_reports_project_merge_request_path(@project, @merge_request) if @project.feature_available?(:license_scanning)}'
-    window.gl.mrWidgetData.license_scanning_comparison_collapsed_path = '#{license_scanning_reports_collapsed_project_merge_request_path(@project, @merge_request) if Feature.enabled?(:refactor_license_compliance_extension, @project) && @project.feature_available?(:license_scanning)}'
+    window.gl.mrWidgetData.license_scanning_comparison_collapsed_path = '#{license_scanning_reports_collapsed_project_merge_request_path(@project, @merge_request) if @project.feature_available?(:license_scanning)}'
     window.gl.mrWidgetData.container_scanning_comparison_path = '#{container_scanning_reports_project_merge_request_path(@project, @merge_request) if @project.feature_available?(:container_scanning)}'
     window.gl.mrWidgetData.dependency_scanning_comparison_path = '#{dependency_scanning_reports_project_merge_request_path(@project, @merge_request) if @project.feature_available?(:dependency_scanning)}'
     window.gl.mrWidgetData.sast_comparison_path = '#{sast_reports_project_merge_request_path(@project, @merge_request) if @project.feature_available?(:sast)}'
diff --git a/ee/config/feature_flags/development/refactor_license_compliance_extension.yml b/ee/config/feature_flags/development/refactor_license_compliance_extension.yml
deleted file mode 100644
index b6d3508c1fb078bd..0000000000000000
--- a/ee/config/feature_flags/development/refactor_license_compliance_extension.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: refactor_license_compliance_extension
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84128
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367703
-milestone: '15.0'
-type: development
-group: group::composition analysis
-default_enabled: true
diff --git a/ee/spec/features/merge_request/user_sees_status_checks_widget_spec.rb b/ee/spec/features/merge_request/user_sees_status_checks_widget_spec.rb
index 58116535ca5b2503..c6fb29793816332a 100644
--- a/ee/spec/features/merge_request/user_sees_status_checks_widget_spec.rb
+++ b/ee/spec/features/merge_request/user_sees_status_checks_widget_spec.rb
@@ -26,7 +26,6 @@
     stub_feature_flags(refactor_mr_widgets_extensions: false)
     stub_feature_flags(refactor_mr_widgets_extensions_user: false)
     stub_feature_flags(refactor_security_extension: false)
-    stub_feature_flags(refactor_license_compliance_extension: false)
   end
 
   context 'user is authorized' do
diff --git a/ee/spec/frontend/vue_merge_request_widget/ee_mr_widget_options_spec.js b/ee/spec/frontend/vue_merge_request_widget/ee_mr_widget_options_spec.js
index 44dbf308cd8579ce..5681bc7c550e68c7 100644
--- a/ee/spec/frontend/vue_merge_request_widget/ee_mr_widget_options_spec.js
+++ b/ee/spec/frontend/vue_merge_request_widget/ee_mr_widget_options_spec.js
@@ -3,6 +3,11 @@ import MockAdapter from 'axios-mock-adapter';
 import Vue, { nextTick } from 'vue';
 import VueApollo from 'vue-apollo';
 
+import {
+  registerExtension,
+  registeredExtensions,
+} from '~/vue_merge_request_widget/components/extensions';
+
 // Force Jest to transpile and cache
 // eslint-disable-next-line no-unused-vars
 import _GroupedBrowserPerformanceReportsApp from 'ee/reports/browser_performance_report/grouped_browser_performance_reports_app.vue';
@@ -15,6 +20,10 @@ import MrWidgetOptions from 'ee/vue_merge_request_widget/mr_widget_options.vue';
 // Force Jest to transpile and cache
 // eslint-disable-next-line no-unused-vars
 import _GroupedSecurityReportsApp from 'ee/vue_shared/security_reports/grouped_security_reports_app.vue';
+
+// EE Widget Extensions
+import licenseComplianceExtension from 'ee/vue_merge_request_widget/extensions/license_compliance';
+
 import {
   sastDiffSuccessMock,
   dastDiffSuccessMock,
@@ -935,38 +944,6 @@ describe('ee merge request widget options', () => {
     });
   });
 
-  describe('license scanning report', () => {
-    const licenseManagementApiUrl = `${TEST_HOST}/manage_license_api`;
-
-    it('should be rendered if license scanning data is set', () => {
-      gl.mrWidgetData = {
-        ...mockData,
-        enabled_reports: {
-          license_scanning: true,
-        },
-        license_scanning: {
-          managed_licenses_path: licenseManagementApiUrl,
-          can_manage_licenses: false,
-        },
-      };
-
-      createComponent({ propsData: { mrData: gl.mrWidgetData } });
-
-      expect(wrapper.find('.license-report-widget').exists()).toBe(true);
-    });
-
-    it('should not be rendered if license scanning data is not set', () => {
-      gl.mrWidgetData = {
-        ...mockData,
-        license_scanning: {},
-      };
-
-      createComponent({ propsData: { mrData: gl.mrWidgetData } });
-
-      expect(wrapper.find('.license-report-widget').exists()).toBe(false);
-    });
-  });
-
   describe('CE security report', () => {
     describe.each`
       context                               | canReadVulnerabilities | hasPipeline | shouldRender
@@ -1187,10 +1164,54 @@ describe('ee merge request widget options', () => {
           },
         },
       });
+
       wrapper.vm.mr.state = mergeState;
       await nextTick();
 
       expect(findStatusChecksReport().exists()).toBe(shouldRender);
     });
   });
+
+  describe('license scanning report', () => {
+    afterEach(() => {
+      registeredExtensions.extensions = [];
+    });
+
+    it('should be rendered if license widget is registered', async () => {
+      const licenseComparisonPath =
+        '/group-name/project-name/-/merge_requests/78/license_scanning_reports';
+      const licenseComparisonPathCollapsed =
+        '/group-name/project-name/-/merge_requests/78/license_scanning_reports_collapsed';
+      const fullReportPath = '/group-name/project-name/-/merge_requests/78/full_report';
+      const settingsPath = '/group-name/project-name/-/licenses#licenses';
+      const apiApprovalsPath = '/group-name/project-name/-/licenses#policies';
+
+      gl.mrWidgetData = {
+        ...mockData,
+        license_scanning_comparison_path: licenseComparisonPath,
+        license_scanning_comparison_collapsed_path: licenseComparisonPathCollapsed,
+        api_approvals_path: apiApprovalsPath,
+        license_scanning: {
+          settings_path: settingsPath,
+          full_report_path: fullReportPath,
+        },
+      };
+
+      registerExtension(licenseComplianceExtension);
+
+      await createComponent({ propsData: { mrData: gl.mrWidgetData } });
+
+      expect(wrapper.findComponent({ name: 'WidgetLicenseCompliance' }).exists()).toBe(true);
+    });
+
+    it('should not be rendered if license widget is not registered', () => {
+      gl.mrWidgetData = {
+        ...mockData,
+      };
+
+      createComponent({ propsData: { mrData: gl.mrWidgetData } });
+
+      expect(wrapper.findComponent({ name: 'WidgetLicenseCompliance' }).exists()).toBe(false);
+    });
+  });
 });
diff --git a/qa/qa/ee/page/component/license_management.rb b/qa/qa/ee/page/component/license_management.rb
index 858fbd27912b6445..e4c424daeb9953ce 100644
--- a/qa/qa/ee/page/component/license_management.rb
+++ b/qa/qa/ee/page/component/license_management.rb
@@ -19,11 +19,6 @@ def self.prepended(base)
                 element :icon_status, ':data-qa-selector="`status_${status}_icon`" ' # rubocop:disable QA/ElementWithPattern
               end
 
-              view 'ee/app/assets/javascripts/vue_shared/license_compliance/mr_widget_license_report.vue' do
-                element :license_report_widget
-                element :manage_licenses_button
-              end
-
               view 'app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue' do
                 element :mr_widget_extension
               end
@@ -39,19 +34,13 @@ def self.prepended(base)
           end
 
           def has_approved_license?(name)
-            content_element = feature_flag_controlled_element(:refactor_license_compliance_extension,
-                                            :child_content,
-                                            :report_item_row)
-            within_element(content_element, text: name) do
+            within_element(:child_content, text: name) do
               has_element?(:status_success_icon, wait: 1)
             end
           end
 
           def has_denied_license?(name)
-            content_element = feature_flag_controlled_element(:refactor_license_compliance_extension,
-                                                              :child_content,
-                                                              :report_item_row)
-            within_element(content_element, text: name) do
+            within_element(:child_content, text: name) do
               has_element?(:status_failed_icon, wait: 1)
             end
           end
@@ -59,15 +48,8 @@ def has_denied_license?(name)
           def click_manage_licenses_button
             previous_page = page.current_url
 
-            widget_element = feature_flag_controlled_element(:refactor_license_compliance_extension,
-                                                             :mr_widget_extension,
-                                                             :license_report_widget)
-            within_element(widget_element) do
-              if widget_element == :mr_widget_extension
-                click_element(:mr_widget_extension_actions_button, text: 'Manage Licenses')
-              else
-                click_element(:manage_licenses_button)
-              end
+            within_element(:mr_widget_extension) do
+              click_element(:mr_widget_extension_actions_button, text: 'Manage Licenses')
             end
             # TODO workaround for switched to a new window UI
             wait_until(max_duration: 15, reload: false) do
diff --git a/qa/qa/ee/page/merge_request/show.rb b/qa/qa/ee/page/merge_request/show.rb
index a21bf03e82286511..9bcb0ab4a1ce4db3 100644
--- a/qa/qa/ee/page/merge_request/show.rb
+++ b/qa/qa/ee/page/merge_request/show.rb
@@ -102,15 +102,8 @@ def click_approve
           end
 
           def expand_license_report
-            widget_name = feature_flag_controlled_element(:refactor_license_compliance_extension,
-                                                          :mr_widget_extension,
-                                                          :license_report_widget)
-            within_element(widget_name) do
-              if widget_name == :mr_widget_extension
-                click_element(:toggle_button)
-              else
-                click_element(:expand_report_button)
-              end
+            within_element(:mr_widget_extension) do
+              click_element(:toggle_button)
             end
           end
 
-- 
GitLab


From 1a8792a723782e4f4ee580d7eebec8a2861b3f76 Mon Sep 17 00:00:00 2001
From: Fernando Arias <farias@gitlab.com>
Date: Mon, 5 Sep 2022 18:55:36 +0200
Subject: [PATCH 2/2] Apply maintainer feedback

* Apply patch for unit test refactor
---
 .../ee_mr_widget_options_spec.js              | 65 ++++++++++---------
 1 file changed, 33 insertions(+), 32 deletions(-)

diff --git a/ee/spec/frontend/vue_merge_request_widget/ee_mr_widget_options_spec.js b/ee/spec/frontend/vue_merge_request_widget/ee_mr_widget_options_spec.js
index 5681bc7c550e68c7..838ff62ae11a3467 100644
--- a/ee/spec/frontend/vue_merge_request_widget/ee_mr_widget_options_spec.js
+++ b/ee/spec/frontend/vue_merge_request_widget/ee_mr_widget_options_spec.js
@@ -1177,41 +1177,42 @@ describe('ee merge request widget options', () => {
       registeredExtensions.extensions = [];
     });
 
-    it('should be rendered if license widget is registered', async () => {
-      const licenseComparisonPath =
-        '/group-name/project-name/-/merge_requests/78/license_scanning_reports';
-      const licenseComparisonPathCollapsed =
-        '/group-name/project-name/-/merge_requests/78/license_scanning_reports_collapsed';
-      const fullReportPath = '/group-name/project-name/-/merge_requests/78/full_report';
-      const settingsPath = '/group-name/project-name/-/licenses#licenses';
-      const apiApprovalsPath = '/group-name/project-name/-/licenses#policies';
+    it.each`
+      shouldRegisterExtension | description
+      ${true}                 | ${'extension is registered'}
+      ${false}                | ${'extension is not registered'}
+    `(
+      'should render license widget is "$shouldRegisterExtension" when $description',
+      ({ shouldRegisterExtension }) => {
+        const licenseComparisonPath =
+          '/group-name/project-name/-/merge_requests/78/license_scanning_reports';
+        const licenseComparisonPathCollapsed =
+          '/group-name/project-name/-/merge_requests/78/license_scanning_reports_collapsed';
+        const fullReportPath = '/group-name/project-name/-/merge_requests/78/full_report';
+        const settingsPath = '/group-name/project-name/-/licenses#licenses';
+        const apiApprovalsPath = '/group-name/project-name/-/licenses#policies';
 
-      gl.mrWidgetData = {
-        ...mockData,
-        license_scanning_comparison_path: licenseComparisonPath,
-        license_scanning_comparison_collapsed_path: licenseComparisonPathCollapsed,
-        api_approvals_path: apiApprovalsPath,
-        license_scanning: {
-          settings_path: settingsPath,
-          full_report_path: fullReportPath,
-        },
-      };
-
-      registerExtension(licenseComplianceExtension);
-
-      await createComponent({ propsData: { mrData: gl.mrWidgetData } });
-
-      expect(wrapper.findComponent({ name: 'WidgetLicenseCompliance' }).exists()).toBe(true);
-    });
+        gl.mrWidgetData = {
+          ...mockData,
+          license_scanning_comparison_path: licenseComparisonPath,
+          license_scanning_comparison_collapsed_path: licenseComparisonPathCollapsed,
+          api_approvals_path: apiApprovalsPath,
+          license_scanning: {
+            settings_path: settingsPath,
+            full_report_path: fullReportPath,
+          },
+        };
 
-    it('should not be rendered if license widget is not registered', () => {
-      gl.mrWidgetData = {
-        ...mockData,
-      };
+        if (shouldRegisterExtension) {
+          registerExtension(licenseComplianceExtension);
+        }
 
-      createComponent({ propsData: { mrData: gl.mrWidgetData } });
+        createComponent({ propsData: { mrData: gl.mrWidgetData } });
 
-      expect(wrapper.findComponent({ name: 'WidgetLicenseCompliance' }).exists()).toBe(false);
-    });
+        expect(wrapper.findComponent({ name: 'WidgetLicenseCompliance' }).exists()).toBe(
+          shouldRegisterExtension,
+        );
+      },
+    );
   });
 });
-- 
GitLab