From 2e2cef35dd847c85fa820c69d3daf609bf13687a Mon Sep 17 00:00:00 2001 From: mfluharty Date: Wed, 20 Oct 2021 12:46:49 -0600 Subject: [PATCH 1/3] Create feature flag and licensed feature Add method in helper that checks for both Pass it to the frontend as a string --- app/helpers/graph_helper.rb | 4 ++ app/views/projects/pipelines/charts.html.haml | 3 +- ee/app/helpers/ee/graph_helper.rb | 6 +++ ee/app/models/license.rb | 1 + .../project_quality_summary_page.yml | 8 ++++ ee/spec/helpers/ee/graph_helper_spec.rb | 38 +++++++++++++++++++ spec/helpers/graph_helper_spec.rb | 12 ++++++ 7 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 ee/config/feature_flags/development/project_quality_summary_page.yml diff --git a/app/helpers/graph_helper.rb b/app/helpers/graph_helper.rb index 3a94f7d47c22fb..45ca820f7b3e71 100644 --- a/app/helpers/graph_helper.rb +++ b/app/helpers/graph_helper.rb @@ -26,6 +26,10 @@ def success_ratio(counts) def should_render_dora_charts false end + + def should_render_quality_summary + false + end end GraphHelper.prepend_mod_with('GraphHelper') diff --git a/app/views/projects/pipelines/charts.html.haml b/app/views/projects/pipelines/charts.html.haml index 992407adf715e2..21e871246d72cb 100644 --- a/app/views/projects/pipelines/charts.html.haml +++ b/app/views/projects/pipelines/charts.html.haml @@ -1,4 +1,5 @@ - page_title _('CI/CD Analytics') #js-project-pipelines-charts-app{ data: { project_path: @project.full_path, - should_render_dora_charts: should_render_dora_charts.to_s } } + should_render_dora_charts: should_render_dora_charts.to_s, + should_render_quality_summary: should_render_quality_summary.to_s } } diff --git a/ee/app/helpers/ee/graph_helper.rb b/ee/app/helpers/ee/graph_helper.rb index a959b4e7fce306..81631d77654445 100644 --- a/ee/app/helpers/ee/graph_helper.rb +++ b/ee/app/helpers/ee/graph_helper.rb @@ -12,5 +12,11 @@ def should_render_dora_charts can?(current_user, :read_dora4_analytics, container) end + + override :should_render_quality_summary + def should_render_quality_summary + @project.feature_available?(:project_quality_summary) && + ::Feature.enabled?(:project_quality_summary_page, @project, default_enabled: :yaml) + end end end diff --git a/ee/app/models/license.rb b/ee/app/models/license.rb index ee2e135c47fe77..eb70a00a98a373 100644 --- a/ee/app/models/license.rb +++ b/ee/app/models/license.rb @@ -177,6 +177,7 @@ class License < ApplicationRecord kubernetes_cluster_vulnerabilities license_scanning personal_access_token_expiration_policy + project_quality_summary prometheus_alerts pseudonymizer quality_management diff --git a/ee/config/feature_flags/development/project_quality_summary_page.yml b/ee/config/feature_flags/development/project_quality_summary_page.yml new file mode 100644 index 00000000000000..eac7db4e99f4f8 --- /dev/null +++ b/ee/config/feature_flags/development/project_quality_summary_page.yml @@ -0,0 +1,8 @@ +--- +name: project_quality_summary_page +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/72724 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/343687 +milestone: '14.4' +type: development +group: group::testing +default_enabled: false diff --git a/ee/spec/helpers/ee/graph_helper_spec.rb b/ee/spec/helpers/ee/graph_helper_spec.rb index 8d59bd1824ab2c..746f78cd38fa5b 100644 --- a/ee/spec/helpers/ee/graph_helper_spec.rb +++ b/ee/spec/helpers/ee/graph_helper_spec.rb @@ -58,4 +58,42 @@ it_behaves_like '#should_render_dora_charts for a specific type of container' end end + + describe '#should_render_quality_summary' do + subject { helper.should_render_quality_summary } + + before do + self.instance_variable_set(:@project, project) + end + + context 'when licensed feature is available' do + before do + stub_licensed_features(project_quality_summary: true) + end + + context 'when feature flag is enabled' do + before do + stub_feature_flags(project_quality_summary_page: true) + end + + it { is_expected.to eq(true) } + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(project_quality_summary_page: false) + end + + it { is_expected.to eq(false) } + end + end + + context 'when licensed feature is not available' do + before do + stub_licensed_features(project_quality_summary: false) + end + + it { is_expected.to eq(false) } + end + end end diff --git a/spec/helpers/graph_helper_spec.rb b/spec/helpers/graph_helper_spec.rb index 0930417accb8da..a5d4e1313e1172 100644 --- a/spec/helpers/graph_helper_spec.rb +++ b/spec/helpers/graph_helper_spec.rb @@ -27,4 +27,16 @@ expect(should_render_dora_charts).to be(false) end end + + describe '#should_render_quality_summary' do + let(:project) { create(:project, :private) } + + before do + self.instance_variable_set(:@project, project) + end + + it 'always returns false' do + expect(should_render_quality_summary).to be(false) + end + end end -- GitLab From 4fdfda0652f333667d5d55ab3a966a2ab9ef2720 Mon Sep 17 00:00:00 2001 From: mfluharty Date: Wed, 20 Oct 2021 13:11:02 -0600 Subject: [PATCH 2/3] Add Project Quality tab to pipeline charts Blank placeholder tab for now Only show it if the licensed feature is available and the feature flag is enabled --- .../pipelines/charts/components/app.vue | 12 ++++++++++ .../projects/pipelines/charts/index.js | 2 ++ .../project_quality_summary/app.vue | 4 ++++ locale/gitlab.pot | 3 +++ .../pipelines/charts/components/app_spec.js | 24 +++++++++++++++++-- 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 ee/app/assets/javascripts/project_quality_summary/app.vue diff --git a/app/assets/javascripts/projects/pipelines/charts/components/app.vue b/app/assets/javascripts/projects/pipelines/charts/components/app.vue index 25bacc1cc4a3c7..d41693286a29af 100644 --- a/app/assets/javascripts/projects/pipelines/charts/components/app.vue +++ b/app/assets/javascripts/projects/pipelines/charts/components/app.vue @@ -11,12 +11,17 @@ export default { DeploymentFrequencyCharts: () => import('ee_component/dora/components/deployment_frequency_charts.vue'), LeadTimeCharts: () => import('ee_component/dora/components/lead_time_charts.vue'), + ProjectQualitySummary: () => import('ee_component/project_quality_summary/app.vue'), }, inject: { shouldRenderDoraCharts: { type: Boolean, default: false, }, + shouldRenderQualitySummary: { + type: Boolean, + default: false, + }, }, data() { return { @@ -31,6 +36,10 @@ export default { chartsToShow.push('deployment-frequency', 'lead-time'); } + if (this.shouldRenderQualitySummary) { + chartsToShow.push('project-quality'); + } + return chartsToShow; }, }, @@ -68,6 +77,9 @@ export default { + + + diff --git a/app/assets/javascripts/projects/pipelines/charts/index.js b/app/assets/javascripts/projects/pipelines/charts/index.js index 5f5ee44c2048dd..003b61d94b1baa 100644 --- a/app/assets/javascripts/projects/pipelines/charts/index.js +++ b/app/assets/javascripts/projects/pipelines/charts/index.js @@ -14,6 +14,7 @@ const mountPipelineChartsApp = (el) => { const { projectPath } = el.dataset; const shouldRenderDoraCharts = parseBoolean(el.dataset.shouldRenderDoraCharts); + const shouldRenderQualitySummary = parseBoolean(el.dataset.shouldRenderQualitySummary); return new Vue({ el, @@ -25,6 +26,7 @@ const mountPipelineChartsApp = (el) => { provide: { projectPath, shouldRenderDoraCharts, + shouldRenderQualitySummary, }, render: (createElement) => createElement(ProjectPipelinesCharts, {}), }); diff --git a/ee/app/assets/javascripts/project_quality_summary/app.vue b/ee/app/assets/javascripts/project_quality_summary/app.vue new file mode 100644 index 00000000000000..3a452daa5be234 --- /dev/null +++ b/ee/app/assets/javascripts/project_quality_summary/app.vue @@ -0,0 +1,4 @@ + + diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 1720b2be13f7c0..2c4da9f38970eb 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -26706,6 +26706,9 @@ msgstr "" msgid "Project ID" msgstr "" +msgid "Project Quality" +msgstr "" + msgid "Project Templates" msgstr "" diff --git a/spec/frontend/projects/pipelines/charts/components/app_spec.js b/spec/frontend/projects/pipelines/charts/components/app_spec.js index 987a215eb4ccca..b4067f6a72ba7c 100644 --- a/spec/frontend/projects/pipelines/charts/components/app_spec.js +++ b/spec/frontend/projects/pipelines/charts/components/app_spec.js @@ -11,6 +11,7 @@ jest.mock('~/lib/utils/url_utility'); const DeploymentFrequencyChartsStub = { name: 'DeploymentFrequencyCharts', render: () => {} }; const LeadTimeChartsStub = { name: 'LeadTimeCharts', render: () => {} }; +const ProjectQualitySummaryStub = { name: 'ProjectQualitySummary', render: () => {} }; describe('ProjectsPipelinesChartsApp', () => { let wrapper; @@ -23,10 +24,12 @@ describe('ProjectsPipelinesChartsApp', () => { { provide: { shouldRenderDoraCharts: true, + shouldRenderQualitySummary: true, }, stubs: { DeploymentFrequencyCharts: DeploymentFrequencyChartsStub, LeadTimeCharts: LeadTimeChartsStub, + ProjectQualitySummary: ProjectQualitySummaryStub, }, }, mountOptions, @@ -44,6 +47,7 @@ describe('ProjectsPipelinesChartsApp', () => { const findLeadTimeCharts = () => wrapper.find(LeadTimeChartsStub); const findDeploymentFrequencyCharts = () => wrapper.find(DeploymentFrequencyChartsStub); const findPipelineCharts = () => wrapper.find(PipelineCharts); + const findProjectQualitySummary = () => wrapper.find(ProjectQualitySummaryStub); describe('when all charts are available', () => { beforeEach(() => { @@ -70,6 +74,10 @@ describe('ProjectsPipelinesChartsApp', () => { expect(findLeadTimeCharts().exists()).toBe(true); }); + it('renders the project quality summary', () => { + expect(findProjectQualitySummary().exists()).toBe(true); + }); + it('sets the tab and url when a tab is clicked', async () => { let chartsPath; setWindowLocation(`${TEST_HOST}/gitlab-org/gitlab-test/-/pipelines/charts`); @@ -163,9 +171,11 @@ describe('ProjectsPipelinesChartsApp', () => { }); }); - describe('when the dora charts are not available', () => { + describe('when the dora charts are not available and project quality summary is not available', () => { beforeEach(() => { - createComponent({ provide: { shouldRenderDoraCharts: false } }); + createComponent({ + provide: { shouldRenderDoraCharts: false, shouldRenderQualitySummary: false }, + }); }); it('does not render tabs', () => { @@ -176,4 +186,14 @@ describe('ProjectsPipelinesChartsApp', () => { expect(findPipelineCharts().exists()).toBe(true); }); }); + + describe('when the project quality summary is not available', () => { + beforeEach(() => { + createComponent({ provide: { shouldRenderQualitySummary: false } }); + }); + + it('does not render the tab', () => { + expect(findProjectQualitySummary().exists()).toBe(false); + }); + }); }); -- GitLab From b85686a8aa001ba40c59d5dc50bebee6ca65859a Mon Sep 17 00:00:00 2001 From: mfluharty Date: Tue, 26 Oct 2021 13:33:16 -0600 Subject: [PATCH 3/3] Changes from feedback Namespace and de-capitalize second word in tab title Remove unnecessary stub for feature flag that defaults to true --- .../projects/pipelines/charts/components/app.vue | 2 +- ee/spec/helpers/ee/graph_helper_spec.rb | 4 ---- locale/gitlab.pot | 6 +++--- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/projects/pipelines/charts/components/app.vue b/app/assets/javascripts/projects/pipelines/charts/components/app.vue index d41693286a29af..7379d5caed7aa9 100644 --- a/app/assets/javascripts/projects/pipelines/charts/components/app.vue +++ b/app/assets/javascripts/projects/pipelines/charts/components/app.vue @@ -77,7 +77,7 @@ export default { - + diff --git a/ee/spec/helpers/ee/graph_helper_spec.rb b/ee/spec/helpers/ee/graph_helper_spec.rb index 746f78cd38fa5b..3ff2635b4a303b 100644 --- a/ee/spec/helpers/ee/graph_helper_spec.rb +++ b/ee/spec/helpers/ee/graph_helper_spec.rb @@ -72,10 +72,6 @@ end context 'when feature flag is enabled' do - before do - stub_feature_flags(project_quality_summary_page: true) - end - it { is_expected.to eq(true) } end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 2c4da9f38970eb..26aaf2fa9c9634 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -26706,9 +26706,6 @@ msgstr "" msgid "Project ID" msgstr "" -msgid "Project Quality" -msgstr "" - msgid "Project Templates" msgstr "" @@ -28218,6 +28215,9 @@ msgstr "" msgid "PushoverService|Total commits count: %{total_commits_count}" msgstr "" +msgid "QualitySummary|Project quality" +msgstr "" + msgid "Quarters" msgstr "" -- GitLab