milestone_spec.rb 3.4 KB
Newer Older
D
Dmitriy Zaporozhets 已提交
1 2 3 4
# == Schema Information
#
# Table name: milestones
#
D
Dmitriy Zaporozhets 已提交
5 6 7
#  id          :integer          not null, primary key
#  title       :string(255)      not null
#  project_id  :integer          not null
D
Dmitriy Zaporozhets 已提交
8 9
#  description :text
#  due_date    :date
D
Dmitriy Zaporozhets 已提交
10 11
#  created_at  :datetime
#  updated_at  :datetime
D
Dmitriy Zaporozhets 已提交
12
#  state       :string(255)
D
Dmitriy Zaporozhets 已提交
13
#  iid         :integer
D
Dmitriy Zaporozhets 已提交
14 15
#

D
Dmitriy Zaporozhets 已提交
16 17 18
require 'spec_helper'

describe Milestone do
19 20 21 22 23
  describe "Associations" do
    it { should belong_to(:project) }
    it { should have_many(:issues) }
  end

24 25 26
  describe "Mass assignment" do
  end

27
  describe "Validation" do
28
    before { subject.stub(set_iid: false) }
29
    it { should validate_presence_of(:title) }
A
Andrey Kumanyaev 已提交
30
    it { should validate_presence_of(:project) }
31 32
  end

33 34
  let(:milestone) { create(:milestone) }
  let(:issue) { create(:issue) }
35

36 37
  describe "#percent_complete" do
    it "should not count open issues" do
38
      milestone.issues << issue
39
      milestone.percent_complete.should == 0
40 41
    end

42
    it "should count closed issues" do
A
Andrew8xx8 已提交
43
      issue.close
44 45 46
      milestone.issues << issue
      milestone.percent_complete.should == 100
    end
47

48 49
    it "should recover from dividing by zero" do
      milestone.issues.should_receive(:count).and_return(0)
50 51 52 53
      milestone.percent_complete.should == 100
    end
  end

54 55 56 57
  describe "#expires_at" do
    it "should be nil when due_date is unset" do
      milestone.update_attributes(due_date: nil)
      milestone.expires_at.should be_nil
58 59
    end

60 61 62 63
    it "should not be nil when due_date is set" do
      milestone.update_attributes(due_date: Date.tomorrow)
      milestone.expires_at.should be_present
    end
64
  end
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

  describe :expired? do
    context "expired" do
      before do
        milestone.stub(due_date: Date.today.prev_year)
      end

      it { milestone.expired?.should be_true }
    end

    context "not expired" do
      before do
        milestone.stub(due_date: Date.today.next_year)
      end

      it { milestone.expired?.should be_false }
    end
  end

  describe :percent_complete do
    before do
      milestone.stub(
        closed_items_count: 3,
        total_items_count: 4
      )
    end

    it { milestone.percent_complete.should == 75 }
  end

  describe :items_count do
    before do
      milestone.issues << create(:issue)
A
Andrew8xx8 已提交
98
      milestone.issues << create(:closed_issue)
99 100 101 102 103 104 105 106 107 108 109 110
      milestone.merge_requests << create(:merge_request)
    end

    it { milestone.closed_items_count.should == 1 }
    it { milestone.open_items_count.should == 2 }
    it { milestone.total_items_count.should == 3 }
    it { milestone.is_empty?.should be_false }
  end

  describe :can_be_closed? do
    it { milestone.can_be_closed?.should be_true }
  end
A
Andrew8xx8 已提交
111 112

  describe :is_empty? do
113
    before do
A
Andrew8xx8 已提交
114 115
      issue = create :closed_issue, milestone: milestone
      merge_request = create :merge_request, milestone: milestone
116
    end
A
Andrew8xx8 已提交
117

118
    it 'Should return total count of issues and merge requests assigned to milestone' do
A
Andrew8xx8 已提交
119 120 121 122 123
      milestone.total_items_count.should eq 2
    end
  end

  describe :can_be_closed? do
124
    before do
A
Andrew8xx8 已提交
125
      milestone = create :milestone
126 127 128 129
      create :closed_issue, milestone: milestone

      issue = create :issue
    end
A
Andrew8xx8 已提交
130

J
Johannes Schleifenbaum 已提交
131
    it 'should be true if milestone active and all nested issues closed' do
A
Andrew8xx8 已提交
132 133 134
      milestone.can_be_closed?.should be_true
    end

J
Johannes Schleifenbaum 已提交
135
    it 'should be false if milestone active and not all nested issues closed' do
136
      issue.milestone = milestone
A
Andrey Kumanyaev 已提交
137
      issue.save
A
Andrew8xx8 已提交
138 139 140 141 142

      milestone.can_be_closed?.should be_false
    end
  end

D
Dmitriy Zaporozhets 已提交
143
end