Welcome to mirror list, hosted at ThFree Co, Russian Federation.

issue_stage_spec.rb « cycle_analytics « gitlab « lib « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c7ab2b9b84bfe8877e8577257d9222553f583bce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# 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