Commit 074ff58f authored by charlie ablett's avatar charlie ablett

Merge branch 'ag-add-time-summary' into 'master'

Add endpoint for time summary in group level VSA

See merge request gitlab-org/gitlab!29791
parents 69677adf 569a4bf4
......@@ -8,18 +8,23 @@ module Analytics
check_feature_flag Gitlab::Analytics::CYCLE_ANALYTICS_FEATURE_FLAG
before_action :load_group
before_action :authorize_access
before_action :validate_params
def show
return render_403 unless can?(current_user, :read_group_cycle_analytics, @group)
group_level = GroupLevel.new(group: @group, options: options(group_params))
render json: group_level.summary
end
def time_summary
render json: group_level.time_summary
end
private
def group_level
@group_level ||= GroupLevel.new(group: @group, options: options(group_params))
end
def group_params
hash = { created_after: request_params.created_after, created_before: request_params.created_before }
hash[:project_ids] = request_params.project_ids if request_params.project_ids.any?
......@@ -42,6 +47,10 @@ module Analytics
def allowed_params
params.permit(:created_after, :created_before, project_ids: [])
end
def authorize_access
return render_403 unless can?(current_user, :read_group_cycle_analytics, @group)
end
end
end
end
......@@ -19,6 +19,13 @@ module Analytics
.data
end
def time_summary
@time_summary ||=
Gitlab::Analytics::CycleAnalytics::GroupStageTimeSummary
.new(group, options: options)
.data
end
def permissions(*)
STAGES.each_with_object({}) do |stage, obj|
obj[stage] = true
......
......@@ -14,6 +14,7 @@ namespace :analytics do
end
end
resource :summary, controller: :summary, only: :show
get '/time_summary' => 'summary#time_summary'
end
get '/cycle_analytics', to: redirect('-/analytics/value_stream_analytics')
end
......
......@@ -36,6 +36,7 @@ constraints(::Constraints::GroupUrlConstrainer.new) do
end
end
resource :summary, controller: :summary, only: :show
get '/time_summary' => 'summary#time_summary'
end
get '/cycle_analytics', to: redirect('-/analytics/value_stream_analytics')
end
......
......@@ -15,9 +15,7 @@ describe Analytics::CycleAnalytics::SummaryController do
sign_in(user)
end
describe 'GET `show`' do
subject { get :show, params: params }
shared_examples 'summary endpoint' do
it 'succeeds' do
subject
......@@ -46,4 +44,16 @@ describe Analytics::CycleAnalytics::SummaryController do
include_examples 'cycle analytics data endpoint examples'
include_examples 'group permission check on the controller level'
end
describe 'GET "show"' do
subject { get :show, params: params }
it_behaves_like 'summary endpoint'
end
describe 'GET "time_summary"' do
subject { get :time_summary, params: params }
it_behaves_like 'summary endpoint'
end
end
......@@ -12,6 +12,10 @@ describe Analytics::CycleAnalytics::GroupLevel do
let(:mr) { create_merge_request_closing_issue(user, project, issue, commit_message: "References #{issue.to_reference}") }
let(:pipeline) { create(:ci_empty_pipeline, status: 'created', project: project, ref: mr.source_branch, sha: mr.source_branch_sha, head_pipeline_of: mr) }
around do |example|
Timecop.freeze { example.run }
end
subject { described_class.new(group: group, options: { from: from_date, current_user: user }) }
describe '#permissions' do
......@@ -41,4 +45,22 @@ describe Analytics::CycleAnalytics::GroupLevel do
expect(subject.summary.map { |summary| summary[:value] }).to contain_exactly('0.1', '1', '1')
end
end
describe '#time_summary' do
let(:issue) { create(:issue, project: project) }
before do
# lead_time: 1 day, cycle_time: 2 days
issue.update!(created_at: 5.days.ago)
issue.metrics.update!(first_mentioned_in_commit_at: 4.days.ago)
issue.update!(closed_at: 3.days.ago)
end
it 'returns medians for lead time and cycle type' do
expect(subject.time_summary.map { |summary| summary[:value] }).to contain_exactly('1.0', '2.0')
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment