From a81de9ab4fc3c3720449069e91ee2431fd9eb024 Mon Sep 17 00:00:00 2001 From: Timothy Andrew <mail@timothyandrew.net> Date: Fri, 26 Aug 2016 12:49:32 +0530 Subject: [PATCH] Add a spec for the `CycleAnalytics#issue` method. --- Gemfile | 1 + Gemfile.lock | 1 + spec/models/cycle_analytics/issue_spec.rb | 80 +++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 spec/models/cycle_analytics/issue_spec.rb diff --git a/Gemfile b/Gemfile index 194379dd687..d13084fdd7f 100644 --- a/Gemfile +++ b/Gemfile @@ -319,6 +319,7 @@ group :test do gem 'webmock', '~> 1.21.0' gem 'test_after_commit', '~> 0.4.2' gem 'sham_rack', '~> 1.3.6' + gem 'timecop', '~> 0.8.0' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index 0c28975060c..e170285cc57 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -971,6 +971,7 @@ DEPENDENCIES teaspoon-jasmine (~> 2.2.0) test_after_commit (~> 0.4.2) thin (~> 1.7.0) + timecop (~> 0.8.0) turbolinks (~> 2.5.0) u2f (~> 0.2.1) uglifier (~> 2.7.2) diff --git a/spec/models/cycle_analytics/issue_spec.rb b/spec/models/cycle_analytics/issue_spec.rb new file mode 100644 index 00000000000..ba66c99631c --- /dev/null +++ b/spec/models/cycle_analytics/issue_spec.rb @@ -0,0 +1,80 @@ +require 'spec_helper' + +describe 'CycleAnalytics#issue', models: true do + let(:project) { create(:project) } + subject { CycleAnalytics.new } + + context "when calculating the median of times between: + start: issue created_at + end: milestone first added to issue + OR + list-label first added to issue + " do + context "when a milestone is added to the issue" do + it "calculates the median of available durations" do + start_and_end_times = Array.new(5) do + start_time = Time.now + end_time = rand(1..10).days.from_now + + milestone = create(:milestone, project: project) + issue = Timecop.freeze(start_time) { create(:issue, project: project) } + Timecop.freeze(end_time) { issue.update(milestone: milestone) } + + [start_time, end_time] + end + + median_start_time, median_end_time = start_and_end_times[2] + expect(subject.issue).to eq(median_end_time - median_start_time) + end + end + + context "when a label is added to the issue" do + it "calculates the median of available durations when the label is a list-label" do + start_and_end_times = Array.new(5) do + start_time = Time.now + end_time = rand(1..10).days.from_now + + list_label = create(:label, lists: [create(:list)]) + issue = Timecop.freeze(start_time) { create(:issue, project: project) } + Timecop.freeze(end_time) { issue.update(label_ids: [list_label.id]) } + + [start_time, end_time] + end + + median_start_time, median_end_time = start_and_end_times[2] + expect(subject.issue).to eq(median_end_time - median_start_time) + end + + it "does not make a calculation for regular labels" do + 5.times do + start_time = Time.now + end_time = rand(1..10).days.from_now + + regular_label = create(:label) + issue = Timecop.freeze(start_time) { create(:issue, project: project) } + Timecop.freeze(end_time) { issue.update(label_ids: [regular_label.id]) } + + [start_time, end_time] + end + + expect(subject.issue).to be_nil + end + end + + context "when a milestone and list-label are both added to the issue" do + it "uses the time the milestone was added as the 'end time'" do + start_time = Time.now + milestone_add_time = rand(1..10).days.from_now + list_label_add_time = rand(1..10).days.from_now + + milestone = create(:milestone, project: project) + list_label = create(:label, lists: [create(:list)]) + issue = Timecop.freeze(start_time) { create(:issue, project: project) } + Timecop.freeze(milestone_add_time) { issue.update(milestone: milestone) } + Timecop.freeze(list_label_add_time) { issue.update(label_ids: [list_label.id]) } + + expect(subject.issue).to eq(milestone_add_time - start_time) + end + end + end +end -- GitLab