diff options
Diffstat (limited to 'spec/lib/gitlab/cycle_analytics')
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 |