summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb
blob: e2fdd4918d5160c11ac92f4f613b39a2c4b4eda0 (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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::Analytics::CycleAnalytics::Average do
  let_it_be(:project) { create(:project) }

  let_it_be(:issue_1) do
    # Duration: 10 days
    create(:issue, project: project, created_at: 20.days.ago).tap do |issue|
      issue.metrics.update!(first_mentioned_in_commit_at: 10.days.ago)
    end
  end

  let_it_be(:issue_2) do
    # Duration: 5 days
    create(:issue, project: project, created_at: 20.days.ago).tap do |issue|
      issue.metrics.update!(first_mentioned_in_commit_at: 15.days.ago)
    end
  end

  let(:stage) do
    build(
      :cycle_analytics_project_stage,
      start_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents::IssueCreated.identifier,
      end_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents::IssueFirstMentionedInCommit.identifier,
      project: project
    )
  end

  let(:query) { Issue.joins(:metrics).in_projects(project.id) }

  around do |example|
    freeze_time { example.run }
  end

  subject(:average) { described_class.new(stage: stage, query: query) }

  describe '#seconds' do
    subject(:average_duration_in_seconds) { average.seconds }

    context 'when no results' do
      let(:query) { Issue.none }

      it { is_expected.to eq(nil) }
    end

    context 'returns the average duration in seconds' do
      it { is_expected.to be_within(0.5).of(7.5.days.to_f) }
    end
  end

  describe '#days' do
    subject(:average_duration_in_days) { average.days }

    context 'when no results' do
      let(:query) { Issue.none }

      it { is_expected.to eq(nil) }
    end

    context 'returns the average duration in days' do
      it { is_expected.to be_within(0.01).of(7.5) }
    end
  end
end