summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/cycle_analytics
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/cycle_analytics')
-rw-r--r--spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb49
-rw-r--r--spec/lib/gitlab/cycle_analytics/code_event_fetcher_spec.rb13
-rw-r--r--spec/lib/gitlab/cycle_analytics/code_stage_spec.rb129
-rw-r--r--spec/lib/gitlab/cycle_analytics/events_spec.rb182
-rw-r--r--spec/lib/gitlab/cycle_analytics/issue_event_fetcher_spec.rb9
-rw-r--r--spec/lib/gitlab/cycle_analytics/issue_stage_spec.rb136
-rw-r--r--spec/lib/gitlab/cycle_analytics/plan_event_fetcher_spec.rb17
-rw-r--r--spec/lib/gitlab/cycle_analytics/plan_stage_spec.rb116
-rw-r--r--spec/lib/gitlab/cycle_analytics/production_event_fetcher_spec.rb9
-rw-r--r--spec/lib/gitlab/cycle_analytics/review_event_fetcher_spec.rb9
-rw-r--r--spec/lib/gitlab/cycle_analytics/review_stage_spec.rb90
-rw-r--r--spec/lib/gitlab/cycle_analytics/staging_event_fetcher_spec.rb13
-rw-r--r--spec/lib/gitlab/cycle_analytics/staging_stage_spec.rb99
-rw-r--r--spec/lib/gitlab/cycle_analytics/test_event_fetcher_spec.rb13
-rw-r--r--spec/lib/gitlab/cycle_analytics/test_stage_spec.rb57
15 files changed, 0 insertions, 941 deletions
diff --git a/spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb
deleted file mode 100644
index 056c1b5bc9f..00000000000
--- a/spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::BaseEventFetcher do
- let(:max_events) { 2 }
- let(:project) { create(:project, :repository) }
- let(:user) { create(:user, :admin) }
- let(:start_time_attrs) { Issue.arel_table[:created_at] }
- let(:end_time_attrs) { [Issue::Metrics.arel_table[:first_associated_with_milestone_at]] }
- let(:options) do
- { start_time_attrs: start_time_attrs,
- end_time_attrs: end_time_attrs,
- from: 30.days.ago,
- project: project }
- end
-
- subject do
- described_class.new(stage: :issue,
- options: options).fetch
- end
-
- before do
- allow_any_instance_of(Gitlab::ReferenceExtractor).to receive(:issues).and_return(Issue.all)
- allow_any_instance_of(described_class).to receive(:serialize) do |event|
- event
- end
- allow_any_instance_of(described_class)
- .to receive(:allowed_ids).and_return(nil)
-
- stub_const('Gitlab::CycleAnalytics::BaseEventFetcher::MAX_EVENTS', max_events)
-
- setup_events(count: 3)
- end
-
- it 'limits the rows to the max number' do
- expect(subject.count).to eq(max_events)
- end
-
- def setup_events(count:)
- count.times do
- issue = create(:issue, project: project, created_at: 2.days.ago)
- milestone = create(:milestone, project: project)
-
- issue.update(milestone: milestone)
- create_merge_request_closing_issue(user, project, issue)
- end
- end
-end
diff --git a/spec/lib/gitlab/cycle_analytics/code_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/code_event_fetcher_spec.rb
deleted file mode 100644
index a1a173abe57..00000000000
--- a/spec/lib/gitlab/cycle_analytics/code_event_fetcher_spec.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::CodeEventFetcher do
- let(:stage_name) { :code }
-
- it_behaves_like 'default query config' do
- it 'has a default order' do
- expect(event.order).not_to be_nil
- end
- end
-end
diff --git a/spec/lib/gitlab/cycle_analytics/code_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/code_stage_spec.rb
deleted file mode 100644
index 17104715580..00000000000
--- a/spec/lib/gitlab/cycle_analytics/code_stage_spec.rb
+++ /dev/null
@@ -1,129 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::CodeStage do
- let(:stage_name) { :code }
-
- let(:project) { create(:project) }
- let(:issue_1) { create(:issue, project: project, created_at: 90.minutes.ago) }
- let(:issue_2) { create(:issue, project: project, created_at: 60.minutes.ago) }
- let(:issue_3) { create(:issue, project: project, created_at: 60.minutes.ago) }
- let(:mr_1) { create(:merge_request, source_project: project, created_at: 15.minutes.ago) }
- let(:mr_2) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'A') }
- let(:stage_options) { { from: 2.days.ago, current_user: project.creator, project: project } }
- let(:stage) { described_class.new(options: stage_options) }
-
- before do
- issue_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago, first_mentioned_in_commit_at: 45.minutes.ago)
- issue_2.metrics.update!(first_added_to_board_at: 60.minutes.ago, first_mentioned_in_commit_at: 40.minutes.ago)
- issue_3.metrics.update!(first_added_to_board_at: 60.minutes.ago, first_mentioned_in_commit_at: 40.minutes.ago)
- create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'B')
- create(:merge_requests_closing_issues, merge_request: mr_1, issue: issue_1)
- create(:merge_requests_closing_issues, merge_request: mr_2, issue: issue_2)
- end
-
- it_behaves_like 'base stage'
-
- context 'when using the new query backend' do
- include_examples 'Gitlab::Analytics::CycleAnalytics::DataCollector backend examples' do
- let(:expected_record_count) { 2 }
- let(:expected_ordered_attribute_values) { [mr_2.title, mr_1.title] }
- end
- end
-
- describe '#project_median' do
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.project_median).to eq(ISSUES_MEDIAN)
- end
-
- include_examples 'calculate #median with date range'
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes merge requests that closes issues' do
- expect(subject.count).to eq(2)
- expect(subject.map { |event| event[:title] }).to contain_exactly(mr_1.title, mr_2.title)
- end
- end
-
- context 'when group is given' do
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:project_2) { create(:project, group: group) }
- let(:project_3) { create(:project, group: group) }
- let(:issue_2_1) { create(:issue, project: project_2, created_at: 90.minutes.ago) }
- let(:issue_2_2) { create(:issue, project: project_3, created_at: 60.minutes.ago) }
- let(:issue_2_3) { create(:issue, project: project_2, created_at: 60.minutes.ago) }
- let(:mr_2_1) { create(:merge_request, source_project: project_2, created_at: 15.minutes.ago) }
- let(:mr_2_2) { create(:merge_request, source_project: project_3, created_at: 10.minutes.ago, source_branch: 'A') }
- let(:stage) { described_class.new(options: { from: 2.days.ago, current_user: user, group: group }) }
-
- before do
- group.add_owner(user)
- issue_2_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago, first_mentioned_in_commit_at: 45.minutes.ago)
- issue_2_2.metrics.update!(first_added_to_board_at: 60.minutes.ago, first_mentioned_in_commit_at: 40.minutes.ago)
- issue_2_3.metrics.update!(first_added_to_board_at: 60.minutes.ago, first_mentioned_in_commit_at: 40.minutes.ago)
- create(:merge_requests_closing_issues, merge_request: mr_2_1, issue: issue_2_1)
- create(:merge_requests_closing_issues, merge_request: mr_2_2, issue: issue_2_2)
- end
-
- describe '#group_median' do
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.group_median).to eq(ISSUES_MEDIAN)
- end
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes merge requests that close issues' do
- expect(subject.count).to eq(2)
- expect(subject.map { |event| event[:title] }).to contain_exactly(mr_2_1.title, mr_2_2.title)
- end
- end
-
- context 'when subgroup is given' do
- let(:subgroup) { create(:group, parent: group) }
- let(:project_4) { create(:project, group: subgroup) }
- let(:project_5) { create(:project, group: subgroup) }
- let(:issue_3_1) { create(:issue, project: project_4, created_at: 90.minutes.ago) }
- let(:issue_3_2) { create(:issue, project: project_5, created_at: 60.minutes.ago) }
- let(:issue_3_3) { create(:issue, project: project_5, created_at: 60.minutes.ago) }
- let(:mr_3_1) { create(:merge_request, source_project: project_4, created_at: 15.minutes.ago) }
- let(:mr_3_2) { create(:merge_request, source_project: project_5, created_at: 10.minutes.ago, source_branch: 'A') }
-
- before do
- issue_3_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago, first_mentioned_in_commit_at: 45.minutes.ago)
- issue_3_2.metrics.update!(first_added_to_board_at: 60.minutes.ago, first_mentioned_in_commit_at: 40.minutes.ago)
- issue_3_3.metrics.update!(first_added_to_board_at: 60.minutes.ago, first_mentioned_in_commit_at: 40.minutes.ago)
- create(:merge_requests_closing_issues, merge_request: mr_3_1, issue: issue_3_1)
- create(:merge_requests_closing_issues, merge_request: mr_3_2, issue: issue_3_2)
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes merge requests that close issues' do
- expect(subject.count).to eq(4)
- expect(subject.map { |event| event[:title] }).to contain_exactly(mr_2_1.title, mr_2_2.title, mr_3_1.title, mr_3_2.title)
- end
-
- it 'exposes merge requests that close issues with full path for subgroup' do
- expect(subject.count).to eq(4)
- expect(subject.find { |event| event[:title] == mr_3_1.title }[:url]).to include("#{subgroup.full_path}")
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/cycle_analytics/events_spec.rb b/spec/lib/gitlab/cycle_analytics/events_spec.rb
deleted file mode 100644
index 553f33a66c4..00000000000
--- a/spec/lib/gitlab/cycle_analytics/events_spec.rb
+++ /dev/null
@@ -1,182 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'value stream analytics events', :aggregate_failures do
- let_it_be(:project) { create(:project, :repository) }
- let_it_be(:user) { create(:user, :admin) }
- let(:from_date) { 10.days.ago }
- let!(:context) { create(:issue, project: project, created_at: 2.days.ago) }
-
- let(:events) do
- CycleAnalytics::ProjectLevel
- .new(project, options: { from: from_date, current_user: user })[stage]
- .events
- end
-
- let(:event) { events.first }
-
- before do
- setup(context)
- end
-
- describe '#issue_events' do
- let(:stage) { :issue }
-
- it 'has correct attributes' do
- expect(event[:total_time]).not_to be_empty
- expect(event[:title]).to eq(context.title)
- expect(event[:url]).not_to be_nil
- expect(event[:iid]).to eq(context.iid.to_s)
- expect(event[:created_at]).to end_with('ago')
- expect(event[:author][:web_url]).not_to be_nil
- expect(event[:author][:avatar_url]).not_to be_nil
- expect(event[:author][:name]).to eq(context.author.name)
- end
- end
-
- describe '#plan_events' do
- let(:stage) { :plan }
-
- before do
- create_commit_referencing_issue(context)
-
- # Adding extra duration because the new VSA backend filters out 0 durations between these columns
- context.metrics.update!(first_mentioned_in_commit_at: context.metrics.first_associated_with_milestone_at + 1.day)
- end
-
- it 'has correct attributes' do
- expect(event[:total_time]).not_to be_empty
- expect(event[:title]).to eq(context.title)
- expect(event[:url]).not_to be_nil
- expect(event[:iid]).to eq(context.iid.to_s)
- expect(event[:created_at]).to end_with('ago')
- expect(event[:author][:web_url]).not_to be_nil
- expect(event[:author][:avatar_url]).not_to be_nil
- expect(event[:author][:name]).to eq(context.author.name)
- end
- end
-
- describe '#code_events' do
- let(:stage) { :code }
- let!(:merge_request) { MergeRequest.first }
-
- before do
- create_commit_referencing_issue(context)
- end
-
- it 'has correct attributes' do
- expect(event[:total_time]).not_to be_empty
- expect(event[:title]).to eq('Awesome merge_request')
- expect(event[:iid]).to eq(context.iid.to_s)
- expect(event[:created_at]).to end_with('ago')
- expect(event[:author][:web_url]).not_to be_nil
- expect(event[:author][:avatar_url]).not_to be_nil
- expect(event[:author][:name]).to eq(MergeRequest.first.author.name)
- end
- end
-
- describe '#test_events', :sidekiq_might_not_need_inline do
- let(:stage) { :test }
-
- let(:merge_request) { MergeRequest.first }
- let!(:context) { create(:issue, project: project, created_at: 2.days.ago) }
-
- let!(:pipeline) do
- create(:ci_pipeline,
- ref: merge_request.source_branch,
- sha: merge_request.diff_head_sha,
- project: project,
- head_pipeline_of: merge_request)
- end
-
- before do
- create(:ci_build, :success, pipeline: pipeline, author: user)
- create(:ci_build, :success, pipeline: pipeline, author: user)
-
- pipeline.run!
- pipeline.succeed!
- merge_merge_requests_closing_issue(user, project, context)
- end
-
- it 'has correct attributes' do
- expect(event[:name]).not_to be_nil
- expect(event[:id]).not_to be_nil
- expect(event[:url]).not_to be_nil
- expect(event[:branch]).not_to be_nil
- expect(event[:branch][:url]).not_to be_nil
- expect(event[:short_sha]).not_to be_nil
- expect(event[:commit_url]).not_to be_nil
- expect(event[:date]).not_to be_nil
- expect(event[:total_time]).not_to be_empty
- end
- end
-
- describe '#review_events' do
- let(:stage) { :review }
- let!(:context) { create(:issue, project: project, created_at: 2.days.ago) }
-
- before do
- merge_merge_requests_closing_issue(user, project, context)
- end
-
- it 'has correct attributes' do
- expect(event[:total_time]).not_to be_empty
- expect(event[:title]).to eq('Awesome merge_request')
- expect(event[:iid]).to eq(context.iid.to_s)
- expect(event[:url]).not_to be_nil
- expect(event[:state]).not_to be_nil
- expect(event[:created_at]).not_to be_nil
- expect(event[:author][:web_url]).not_to be_nil
- expect(event[:author][:avatar_url]).not_to be_nil
- expect(event[:author][:name]).to eq(MergeRequest.first.author.name)
- end
- end
-
- describe '#staging_events', :sidekiq_might_not_need_inline do
- let(:stage) { :staging }
- let(:merge_request) { MergeRequest.first }
-
- let!(:pipeline) do
- create(:ci_pipeline,
- ref: merge_request.source_branch,
- sha: merge_request.diff_head_sha,
- project: project,
- head_pipeline_of: merge_request)
- end
-
- before do
- create(:ci_build, :success, pipeline: pipeline, author: user)
- create(:ci_build, :success, pipeline: pipeline, author: user)
-
- pipeline.run!
- pipeline.succeed!
-
- merge_merge_requests_closing_issue(user, project, context)
- deploy_master(user, project)
- end
-
- it 'has correct attributes' do
- expect(event[:name]).not_to be_nil
- expect(event[:id]).not_to be_nil
- expect(event[:url]).not_to be_nil
- expect(event[:branch]).not_to be_nil
- expect(event[:branch][:url]).not_to be_nil
- expect(event[:short_sha]).not_to be_nil
- expect(event[:commit_url]).not_to be_nil
- expect(event[:date]).not_to be_nil
- expect(event[:total_time]).not_to be_empty
- expect(event[:author][:web_url]).not_to be_nil
- expect(event[:author][:avatar_url]).not_to be_nil
- expect(event[:author][:name]).to eq(MergeRequest.first.author.name)
- end
- end
-
- def setup(context)
- milestone = create(:milestone, project: project)
- context.update!(milestone: milestone)
- mr = create_merge_request_closing_issue(user, project, context, commit_message: "References #{context.to_reference}")
-
- ProcessCommitWorker.new.perform(project.id, user.id, mr.commits.last.to_hash)
- end
-end
diff --git a/spec/lib/gitlab/cycle_analytics/issue_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/issue_event_fetcher_spec.rb
deleted file mode 100644
index 7a49ee53e8f..00000000000
--- a/spec/lib/gitlab/cycle_analytics/issue_event_fetcher_spec.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::IssueEventFetcher do
- let(:stage_name) { :issue }
-
- it_behaves_like 'default query config'
-end
diff --git a/spec/lib/gitlab/cycle_analytics/issue_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/issue_stage_spec.rb
deleted file mode 100644
index c7ab2b9b84b..00000000000
--- a/spec/lib/gitlab/cycle_analytics/issue_stage_spec.rb
+++ /dev/null
@@ -1,136 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::IssueStage do
- let(:stage_name) { :issue }
- let(:project) { create(:project) }
- let(:issue_1) { create(:issue, project: project, created_at: 90.minutes.ago) }
- let(:issue_2) { create(:issue, project: project, created_at: 60.minutes.ago) }
- let(:issue_3) { create(:issue, project: project, created_at: 30.minutes.ago) }
- let!(:issue_without_milestone) { create(:issue, project: project, created_at: 1.minute.ago) }
- let(:stage_options) { { from: 2.days.ago, current_user: project.creator, project: project } }
- let(:stage) { described_class.new(options: stage_options) }
-
- before do
- issue_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago )
- issue_2.metrics.update!(first_added_to_board_at: 30.minutes.ago)
- issue_3.metrics.update!(first_added_to_board_at: 15.minutes.ago)
- end
-
- it_behaves_like 'base stage'
-
- context 'when using the new query backend' do
- include_examples 'Gitlab::Analytics::CycleAnalytics::DataCollector backend examples' do
- let(:expected_record_count) { 3 }
- let(:expected_ordered_attribute_values) { [issue_3.title, issue_2.title, issue_1.title] }
- end
- end
-
- describe '#median' do
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.project_median).to eq(ISSUES_MEDIAN)
- end
-
- include_examples 'calculate #median with date range'
- end
-
- describe '#events' do
- it 'exposes issues with metrics' do
- result = stage.events
-
- expect(result.count).to eq(3)
- expect(result.map { |event| event[:title] }).to contain_exactly(issue_1.title, issue_2.title, issue_3.title)
- end
- end
- context 'when group is given' do
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:project_2) { create(:project, group: group) }
- let(:project_3) { create(:project, group: group) }
- let(:issue_2_1) { create(:issue, project: project_2, created_at: 90.minutes.ago) }
- let(:issue_2_2) { create(:issue, project: project_3, created_at: 60.minutes.ago) }
- let(:issue_2_3) { create(:issue, project: project_2, created_at: 60.minutes.ago) }
- let(:stage) { described_class.new(options: { from: 2.days.ago, current_user: user, group: group }) }
-
- before do
- group.add_owner(user)
- issue_2_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago)
- issue_2_2.metrics.update!(first_added_to_board_at: 30.minutes.ago)
- end
-
- describe '#group_median' do
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.group_median).to eq(ISSUES_MEDIAN)
- end
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes merge requests that close issues' do
- expect(subject.count).to eq(2)
- expect(subject.map { |event| event[:title] }).to contain_exactly(issue_2_1.title, issue_2_2.title)
- end
- end
-
- context 'when only part of projects is chosen' do
- let(:stage) { described_class.new(options: { from: 2.days.ago, current_user: user, group: group, projects: [project_2.id] }) }
-
- describe '#group_median' do
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.group_median).to eq(ISSUES_MEDIAN)
- end
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes merge requests that close issues' do
- expect(subject.count).to eq(1)
- expect(subject.map { |event| event[:title] }).to contain_exactly(issue_2_1.title)
- end
- end
- end
-
- context 'when subgroup is given' do
- let(:subgroup) { create(:group, parent: group) }
- let(:project_4) { create(:project, group: subgroup) }
- let(:project_5) { create(:project, group: subgroup) }
- let(:issue_3_1) { create(:issue, project: project_4, created_at: 90.minutes.ago) }
- let(:issue_3_2) { create(:issue, project: project_5, created_at: 60.minutes.ago) }
- let(:issue_3_3) { create(:issue, project: project_5, created_at: 60.minutes.ago) }
-
- before do
- issue_3_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago)
- issue_3_2.metrics.update!(first_added_to_board_at: 30.minutes.ago)
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes merge requests that close issues' do
- expect(subject.count).to eq(4)
- expect(subject.map { |event| event[:title] }).to contain_exactly(issue_2_1.title, issue_2_2.title, issue_3_1.title, issue_3_2.title)
- end
-
- it 'exposes merge requests that close issues with full path for subgroup' do
- expect(subject.count).to eq(4)
- expect(subject.find { |event| event[:title] == issue_3_1.title }[:url]).to include("#{subgroup.full_path}")
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/cycle_analytics/plan_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/plan_event_fetcher_spec.rb
deleted file mode 100644
index bc14a772d34..00000000000
--- a/spec/lib/gitlab/cycle_analytics/plan_event_fetcher_spec.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::PlanEventFetcher do
- let(:stage_name) { :plan }
-
- it_behaves_like 'default query config' do
- context 'no commits' do
- it 'does not blow up if there are no commits' do
- allow(event).to receive(:event_result).and_return([{}])
-
- expect { event.fetch }.not_to raise_error
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/cycle_analytics/plan_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/plan_stage_spec.rb
deleted file mode 100644
index 2547c05c025..00000000000
--- a/spec/lib/gitlab/cycle_analytics/plan_stage_spec.rb
+++ /dev/null
@@ -1,116 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::PlanStage do
- let(:stage_name) { :plan }
- let(:project) { create(:project) }
- let!(:issue_1) { create(:issue, project: project, created_at: 90.minutes.ago) }
- let!(:issue_2) { create(:issue, project: project, created_at: 60.minutes.ago) }
- let!(:issue_3) { create(:issue, project: project, created_at: 30.minutes.ago) }
- let!(:issue_without_milestone) { create(:issue, project: project, created_at: 1.minute.ago) }
- let(:stage_options) { { from: 2.days.ago, current_user: project.creator, project: project } }
- let(:stage) { described_class.new(options: stage_options) }
-
- before do
- issue_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago, first_mentioned_in_commit_at: 10.minutes.ago)
- issue_2.metrics.update!(first_added_to_board_at: 30.minutes.ago, first_mentioned_in_commit_at: 20.minutes.ago)
- issue_3.metrics.update!(first_added_to_board_at: 15.minutes.ago)
- end
-
- it_behaves_like 'base stage'
-
- context 'when using the new query backend' do
- include_examples 'Gitlab::Analytics::CycleAnalytics::DataCollector backend examples' do
- let(:expected_record_count) { 2 }
- let(:expected_ordered_attribute_values) { [issue_1.title, issue_2.title] }
- end
- end
-
- describe '#project_median' do
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.project_median).to eq(ISSUES_MEDIAN)
- end
-
- include_examples 'calculate #median with date range'
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes issues with metrics' do
- expect(subject.count).to eq(2)
- expect(subject.map { |event| event[:title] }).to contain_exactly(issue_1.title, issue_2.title)
- end
- end
-
- context 'when group is given' do
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:project_2) { create(:project, group: group) }
- let(:project_3) { create(:project, group: group) }
- let(:issue_2_1) { create(:issue, project: project_2, created_at: 90.minutes.ago) }
- let(:issue_2_2) { create(:issue, project: project_3, created_at: 60.minutes.ago) }
- let(:issue_2_3) { create(:issue, project: project_2, created_at: 60.minutes.ago) }
- let(:stage) { described_class.new(options: { from: 2.days.ago, current_user: user, group: group }) }
-
- before do
- group.add_owner(user)
- issue_2_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago, first_mentioned_in_commit_at: 10.minutes.ago)
- issue_2_2.metrics.update!(first_added_to_board_at: 30.minutes.ago, first_mentioned_in_commit_at: 20.minutes.ago)
- issue_2_3.metrics.update!(first_added_to_board_at: 15.minutes.ago)
- end
-
- describe '#group_median' do
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.group_median).to eq(ISSUES_MEDIAN)
- end
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes merge requests that close issues' do
- expect(subject.count).to eq(2)
- expect(subject.map { |event| event[:title] }).to contain_exactly(issue_2_1.title, issue_2_2.title)
- end
- end
-
- context 'when subgroup is given' do
- let(:subgroup) { create(:group, parent: group) }
- let(:project_4) { create(:project, group: subgroup) }
- let(:project_5) { create(:project, group: subgroup) }
- let(:issue_3_1) { create(:issue, project: project_4, created_at: 90.minutes.ago) }
- let(:issue_3_2) { create(:issue, project: project_5, created_at: 60.minutes.ago) }
- let(:issue_3_3) { create(:issue, project: project_5, created_at: 60.minutes.ago) }
-
- before do
- issue_3_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago, first_mentioned_in_commit_at: 10.minutes.ago)
- issue_3_2.metrics.update!(first_added_to_board_at: 30.minutes.ago, first_mentioned_in_commit_at: 20.minutes.ago)
- issue_3_3.metrics.update!(first_added_to_board_at: 15.minutes.ago)
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes merge requests that close issues' do
- expect(subject.count).to eq(4)
- expect(subject.map { |event| event[:title] }).to contain_exactly(issue_2_1.title, issue_2_2.title, issue_3_1.title, issue_3_2.title)
- end
-
- it 'exposes merge requests that close issues with full path for subgroup' do
- expect(subject.count).to eq(4)
- expect(subject.find { |event| event[:title] == issue_3_1.title }[:url]).to include("#{subgroup.full_path}")
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/cycle_analytics/production_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/production_event_fetcher_spec.rb
deleted file mode 100644
index 86b07a95cbb..00000000000
--- a/spec/lib/gitlab/cycle_analytics/production_event_fetcher_spec.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::ProductionEventFetcher do
- let(:stage_name) { :production }
-
- it_behaves_like 'default query config'
-end
diff --git a/spec/lib/gitlab/cycle_analytics/review_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/review_event_fetcher_spec.rb
deleted file mode 100644
index fe13cc6b065..00000000000
--- a/spec/lib/gitlab/cycle_analytics/review_event_fetcher_spec.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::ReviewEventFetcher do
- let(:stage_name) { :review }
-
- it_behaves_like 'default query config'
-end
diff --git a/spec/lib/gitlab/cycle_analytics/review_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/review_stage_spec.rb
deleted file mode 100644
index 5593013740e..00000000000
--- a/spec/lib/gitlab/cycle_analytics/review_stage_spec.rb
+++ /dev/null
@@ -1,90 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::ReviewStage do
- let(:stage_name) { :review }
- let(:project) { create(:project) }
- let(:issue_1) { create(:issue, project: project, created_at: 90.minutes.ago) }
- let(:issue_2) { create(:issue, project: project, created_at: 60.minutes.ago) }
- let(:issue_3) { create(:issue, project: project, created_at: 60.minutes.ago) }
- let(:mr_1) { create(:merge_request, :closed, source_project: project, created_at: 60.minutes.ago) }
- let(:mr_2) { create(:merge_request, :closed, source_project: project, created_at: 40.minutes.ago, source_branch: 'A') }
- let(:mr_3) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'B') }
- let!(:mr_4) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'C') }
- let(:stage) { described_class.new(options: { from: 2.days.ago, current_user: project.creator, project: project }) }
-
- before do
- mr_1.metrics.update!(merged_at: 30.minutes.ago)
- mr_2.metrics.update!(merged_at: 10.minutes.ago)
-
- create(:merge_requests_closing_issues, merge_request: mr_1, issue: issue_1)
- create(:merge_requests_closing_issues, merge_request: mr_2, issue: issue_2)
- create(:merge_requests_closing_issues, merge_request: mr_3, issue: issue_3)
- end
-
- it_behaves_like 'base stage'
-
- describe '#project_median' do
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.project_median).to eq(ISSUES_MEDIAN)
- end
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes merge requests that close issues' do
- expect(subject.count).to eq(2)
- expect(subject.map { |event| event[:title] }).to contain_exactly(mr_1.title, mr_2.title)
- end
- end
-
- context 'when group is given' do
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:project_2) { create(:project, group: group) }
- let(:project_3) { create(:project, group: group) }
- let(:issue_2_1) { create(:issue, project: project_2, created_at: 90.minutes.ago) }
- let(:issue_2_2) { create(:issue, project: project_3, created_at: 60.minutes.ago) }
- let(:issue_2_3) { create(:issue, project: project_2, created_at: 60.minutes.ago) }
- let(:mr_2_1) { create(:merge_request, :closed, source_project: project_2, created_at: 60.minutes.ago) }
- let(:mr_2_2) { create(:merge_request, :closed, source_project: project_3, created_at: 40.minutes.ago, source_branch: 'A') }
- let(:mr_2_3) { create(:merge_request, source_project: project_2, created_at: 10.minutes.ago, source_branch: 'B') }
- let!(:mr_2_4) { create(:merge_request, source_project: project_3, created_at: 10.minutes.ago, source_branch: 'C') }
- let(:stage) { described_class.new(options: { from: 2.days.ago, current_user: user, group: group }) }
-
- before do
- group.add_owner(user)
- mr_2_1.metrics.update!(merged_at: 30.minutes.ago)
- mr_2_2.metrics.update!(merged_at: 10.minutes.ago)
-
- create(:merge_requests_closing_issues, merge_request: mr_2_1, issue: issue_2_1)
- create(:merge_requests_closing_issues, merge_request: mr_2_2, issue: issue_2_2)
- create(:merge_requests_closing_issues, merge_request: mr_2_3, issue: issue_2_3)
- end
-
- describe '#group_median' do
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.group_median).to eq(ISSUES_MEDIAN)
- end
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes merge requests that close issues' do
- expect(subject.count).to eq(2)
- expect(subject.map { |event| event[:title] }).to contain_exactly(mr_2_1.title, mr_2_2.title)
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/cycle_analytics/staging_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/staging_event_fetcher_spec.rb
deleted file mode 100644
index bdf1b99c4c9..00000000000
--- a/spec/lib/gitlab/cycle_analytics/staging_event_fetcher_spec.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::StagingEventFetcher do
- let(:stage_name) { :staging }
-
- it_behaves_like 'default query config' do
- it 'has a default order' do
- expect(event.order).not_to be_nil
- end
- end
-end
diff --git a/spec/lib/gitlab/cycle_analytics/staging_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/staging_stage_spec.rb
deleted file mode 100644
index 852f7041dc6..00000000000
--- a/spec/lib/gitlab/cycle_analytics/staging_stage_spec.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::StagingStage do
- let(:stage_name) { :staging }
-
- let(:project) { create(:project) }
- let(:issue_1) { create(:issue, project: project, created_at: 90.minutes.ago) }
- let(:issue_2) { create(:issue, project: project, created_at: 60.minutes.ago) }
- let(:issue_3) { create(:issue, project: project, created_at: 60.minutes.ago) }
- let(:mr_1) { create(:merge_request, :closed, source_project: project, created_at: 60.minutes.ago) }
- let(:mr_2) { create(:merge_request, :closed, source_project: project, created_at: 40.minutes.ago, source_branch: 'A') }
- let(:mr_3) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'B') }
- let(:build_1) { create(:ci_build, project: project) }
- let(:build_2) { create(:ci_build, project: project) }
-
- let(:stage_options) { { from: 2.days.ago, current_user: project.creator, project: project } }
- let(:stage) { described_class.new(options: stage_options) }
-
- before do
- mr_1.metrics.update!(merged_at: 80.minutes.ago, first_deployed_to_production_at: 50.minutes.ago, pipeline_id: build_1.commit_id)
- mr_2.metrics.update!(merged_at: 60.minutes.ago, first_deployed_to_production_at: 30.minutes.ago, pipeline_id: build_2.commit_id)
- mr_3.metrics.update!(merged_at: 10.minutes.ago, first_deployed_to_production_at: 3.days.ago, pipeline_id: create(:ci_build, project: project).commit_id)
-
- create(:merge_requests_closing_issues, merge_request: mr_1, issue: issue_1)
- create(:merge_requests_closing_issues, merge_request: mr_2, issue: issue_2)
- create(:merge_requests_closing_issues, merge_request: mr_3, issue: issue_3)
- end
-
- it_behaves_like 'base stage'
-
- describe '#project_median' do
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.project_median).to eq(ISSUES_MEDIAN)
- end
-
- it_behaves_like 'calculate #median with date range'
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes builds connected to merge request' do
- expect(subject.count).to eq(2)
- expect(subject.map { |event| event[:name] }).to contain_exactly(build_1.name, build_2.name)
- end
- end
-
- context 'when group is given' do
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:project_2) { create(:project, group: group) }
- let(:project_3) { create(:project, group: group) }
- let(:issue_2_1) { create(:issue, project: project_2, created_at: 90.minutes.ago) }
- let(:issue_2_2) { create(:issue, project: project_3, created_at: 60.minutes.ago) }
- let(:issue_2_3) { create(:issue, project: project_2, created_at: 60.minutes.ago) }
- let(:mr_1) { create(:merge_request, :closed, source_project: project_2, created_at: 60.minutes.ago) }
- let(:mr_2) { create(:merge_request, :closed, source_project: project_3, created_at: 40.minutes.ago, source_branch: 'A') }
- let(:mr_3) { create(:merge_request, source_project: project_2, created_at: 10.minutes.ago, source_branch: 'B') }
- let(:build_1) { create(:ci_build, project: project_2) }
- let(:build_2) { create(:ci_build, project: project_3) }
- let(:stage) { described_class.new(options: { from: 2.days.ago, current_user: user, group: group }) }
-
- before do
- group.add_owner(user)
- mr_1.metrics.update!(merged_at: 80.minutes.ago, first_deployed_to_production_at: 50.minutes.ago, pipeline_id: build_1.commit_id)
- mr_2.metrics.update!(merged_at: 60.minutes.ago, first_deployed_to_production_at: 30.minutes.ago, pipeline_id: build_2.commit_id)
- mr_3.metrics.update!(merged_at: 10.minutes.ago, first_deployed_to_production_at: 3.days.ago, pipeline_id: create(:ci_build, project: project_2).commit_id)
-
- create(:merge_requests_closing_issues, merge_request: mr_1, issue: issue_2_1)
- create(:merge_requests_closing_issues, merge_request: mr_2, issue: issue_2_2)
- create(:merge_requests_closing_issues, merge_request: mr_3, issue: issue_2_3)
- end
-
- describe '#group_median' do
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.group_median).to eq(ISSUES_MEDIAN)
- end
- end
-
- describe '#events' do
- subject { stage.events }
-
- it 'exposes merge requests that close issues' do
- expect(subject.count).to eq(2)
- expect(subject.map { |event| event[:name] }).to contain_exactly(build_1.name, build_2.name)
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/cycle_analytics/test_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/test_event_fetcher_spec.rb
deleted file mode 100644
index 1277385d0b4..00000000000
--- a/spec/lib/gitlab/cycle_analytics/test_event_fetcher_spec.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::TestEventFetcher do
- let(:stage_name) { :test }
-
- it_behaves_like 'default query config' do
- it 'has a default order' do
- expect(event.order).not_to be_nil
- end
- end
-end
diff --git a/spec/lib/gitlab/cycle_analytics/test_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/test_stage_spec.rb
deleted file mode 100644
index 49ee6624260..00000000000
--- a/spec/lib/gitlab/cycle_analytics/test_stage_spec.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::CycleAnalytics::TestStage do
- let(:stage_name) { :test }
- let(:project) { create(:project) }
- let(:stage_options) { { from: 2.days.ago, current_user: project.creator, project: project } }
- let(:stage) { described_class.new(options: stage_options) }
-
- it_behaves_like 'base stage'
-
- describe '#median' do
- let(:mr_1) { create(:merge_request, :closed, source_project: project, created_at: 60.minutes.ago) }
- let(:mr_2) { create(:merge_request, :closed, source_project: project, created_at: 40.minutes.ago, source_branch: 'A') }
- let(:mr_3) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'B') }
- let(:mr_4) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'C') }
- let(:mr_5) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'D') }
- let(:ci_build1) { create(:ci_build, project: project) }
- let(:ci_build2) { create(:ci_build, project: project) }
-
- before do
- issue_1 = create(:issue, project: project, created_at: 90.minutes.ago)
- issue_2 = create(:issue, project: project, created_at: 60.minutes.ago)
- issue_3 = create(:issue, project: project, created_at: 60.minutes.ago)
- mr_1.metrics.update!(latest_build_started_at: 32.minutes.ago, latest_build_finished_at: 2.minutes.ago, pipeline_id: ci_build1.commit_id)
- mr_2.metrics.update!(latest_build_started_at: 62.minutes.ago, latest_build_finished_at: 32.minutes.ago, pipeline_id: ci_build2.commit_id)
- mr_3.metrics.update!(latest_build_started_at: nil, latest_build_finished_at: nil)
- mr_4.metrics.update!(latest_build_started_at: nil, latest_build_finished_at: nil)
- mr_5.metrics.update!(latest_build_started_at: nil, latest_build_finished_at: nil)
-
- create(:merge_requests_closing_issues, merge_request: mr_1, issue: issue_1)
- create(:merge_requests_closing_issues, merge_request: mr_2, issue: issue_2)
- create(:merge_requests_closing_issues, merge_request: mr_3, issue: issue_3)
- create(:merge_requests_closing_issues, merge_request: mr_4, issue: issue_3)
- create(:merge_requests_closing_issues, merge_request: mr_5, issue: issue_3)
- end
-
- around do |example|
- freeze_time { example.run }
- end
-
- it 'counts median from issues with metrics' do
- expect(stage.project_median).to eq(ISSUES_MEDIAN)
- end
-
- include_examples 'calculate #median with date range'
-
- context 'when using the new query backend' do
- include_examples 'Gitlab::Analytics::CycleAnalytics::DataCollector backend examples' do
- let(:expected_record_count) { 2 }
- let(:attribute_to_verify) { :id }
- let(:expected_ordered_attribute_values) { [mr_1.metrics.pipeline.builds.first.id, mr_2.metrics.pipeline.builds.first.id] }
- end
- end
- end
-end