From c6452cd47a8a323e0589db49c2f3cb8f90e8aa9e Mon Sep 17 00:00:00 2001
From: Felipe Artur <fcardozo@gitlab.com>
Date: Tue, 18 Apr 2023 14:13:01 +0000
Subject: [PATCH] Allow to select project value stream using URL parameter

Select project value stream using value_stream_id
parameter on URL.

Changelog: fixed
EE: true
---
 .../projects/cycle_analytics_controller.rb    | 11 +++++---
 .../ee/projects/cycle_analytics_controller.rb | 18 +++++++++++++
 .../cycle_analytics_controller_spec.rb        | 25 +++++++++++++++++++
 3 files changed, 50 insertions(+), 4 deletions(-)
 create mode 100644 ee/app/controllers/ee/projects/cycle_analytics_controller.rb
 create mode 100644 ee/spec/requests/ee/projects/cycle_analytics_controller_spec.rb

diff --git a/app/controllers/projects/cycle_analytics_controller.rb b/app/controllers/projects/cycle_analytics_controller.rb
index f3dea88862f2..da0bda19602c 100644
--- a/app/controllers/projects/cycle_analytics_controller.rb
+++ b/app/controllers/projects/cycle_analytics_controller.rb
@@ -6,10 +6,10 @@ class Projects::CycleAnalyticsController < Projects::ApplicationController
   include CycleAnalyticsParams
   include GracefulTimeoutHandling
   include ProductAnalyticsTracking
+  include Gitlab::Utils::StrongMemoize
   extend ::Gitlab::Utils::Override
 
   before_action :authorize_read_cycle_analytics!
-  before_action :load_value_stream, only: :show
 
   track_event :show,
     name: 'p_analytics_valuestream',
@@ -51,12 +51,13 @@ def show
 
   override :all_cycle_analytics_params
   def all_cycle_analytics_params
-    super.merge({ namespace: @project.project_namespace, value_stream: @value_stream })
+    super.merge({ namespace: @project.project_namespace, value_stream: value_stream })
   end
 
-  def load_value_stream
-    @value_stream = Analytics::CycleAnalytics::ValueStream.build_default_value_stream(@project.project_namespace)
+  def value_stream
+    Analytics::CycleAnalytics::ValueStream.build_default_value_stream(@project.project_namespace)
   end
+  strong_memoize_attr :value_stream
 
   def cycle_analytics_json
     {
@@ -74,3 +75,5 @@ def tracking_project_source
     project
   end
 end
+
+Projects::CycleAnalyticsController.prepend_mod
diff --git a/ee/app/controllers/ee/projects/cycle_analytics_controller.rb b/ee/app/controllers/ee/projects/cycle_analytics_controller.rb
new file mode 100644
index 000000000000..7854fc234b1c
--- /dev/null
+++ b/ee/app/controllers/ee/projects/cycle_analytics_controller.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module EE
+  module Projects
+    module CycleAnalyticsController
+      include ::Gitlab::Utils::StrongMemoize
+      extend ::Gitlab::Utils::Override
+
+      override :value_stream
+      def value_stream
+        return super unless params[:value_stream_id]
+
+        project.project_namespace.value_streams.find_by_id(params[:value_stream_id])
+      end
+      strong_memoize_attr :value_stream
+    end
+  end
+end
diff --git a/ee/spec/requests/ee/projects/cycle_analytics_controller_spec.rb b/ee/spec/requests/ee/projects/cycle_analytics_controller_spec.rb
new file mode 100644
index 000000000000..83eca1b0f512
--- /dev/null
+++ b/ee/spec/requests/ee/projects/cycle_analytics_controller_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::CycleAnalyticsController, feature_category: :product_analytics do
+  let_it_be(:project) { create(:project) }
+  let_it_be(:user) { create(:user) }
+
+  before do
+    sign_in(user)
+    project.add_maintainer(user)
+  end
+
+  context 'with project and value stream id params' do
+    let(:value_stream) { create(:cycle_analytics_value_stream, namespace: project.project_namespace) }
+
+    it 'builds request params with project and value stream' do
+      expect_next_instance_of(Gitlab::Analytics::CycleAnalytics::RequestParams) do |instance|
+        expect(instance).to have_attributes(namespace: project.project_namespace, value_stream: value_stream)
+      end
+
+      get project_cycle_analytics_path(project, value_stream_id: value_stream)
+    end
+  end
+end
-- 
GitLab