milestone_spec.rb 4.8 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
require 'spec_helper'

D
Douwe Maan 已提交
18
describe Milestone, models: true do
19
  describe "Associations" do
20 21
    it { is_expected.to belong_to(:project) }
    it { is_expected.to have_many(:issues) }
22 23 24
  end

  describe "Validation" do
25 26 27 28
    before do
      allow(subject).to receive(:set_iid).and_return(false)
    end

29 30
    it { is_expected.to validate_presence_of(:title) }
    it { is_expected.to validate_presence_of(:project) }
31 32
  end

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

36 37 38 39 40 41 42 43 44 45 46 47 48 49
  describe "unique milestone title per project" do
    it "shouldn't accept the same title in a project twice" do
      new_milestone = Milestone.new(project: milestone.project, title: milestone.title)
      expect(new_milestone).not_to be_valid
    end

    it "should accept the same title in another project" do
      project = build(:project)
      new_milestone = Milestone.new(project: project, title: milestone.title)

      expect(new_milestone).to be_valid
    end
  end

50 51
  describe "#percent_complete" do
    it "should not count open issues" do
52
      milestone.issues << issue
53
      expect(milestone.percent_complete).to eq(0)
54 55
    end

56
    it "should count closed issues" do
A
Andrew8xx8 已提交
57
      issue.close
58
      milestone.issues << issue
59
      expect(milestone.percent_complete).to eq(100)
60
    end
61

62
    it "should recover from dividing by zero" do
63
      expect(milestone.issues).to receive(:count).and_return(0)
64
      expect(milestone.percent_complete).to eq(0)
65 66 67
    end
  end

68 69 70
  describe "#expires_at" do
    it "should be nil when due_date is unset" do
      milestone.update_attributes(due_date: nil)
71
      expect(milestone.expires_at).to be_nil
72 73
    end

74 75
    it "should not be nil when due_date is set" do
      milestone.update_attributes(due_date: Date.tomorrow)
76
      expect(milestone.expires_at).to be_present
77
    end
78
  end
79 80 81 82

  describe :expired? do
    context "expired" do
      before do
83
        allow(milestone).to receive(:due_date).and_return(Date.today.prev_year)
84 85
      end

86
      it { expect(milestone.expired?).to be_truthy }
87 88 89 90
    end

    context "not expired" do
      before do
91
        allow(milestone).to receive(:due_date).and_return(Date.today.next_year)
92 93
      end

94
      it { expect(milestone.expired?).to be_falsey }
95 96 97 98 99
    end
  end

  describe :percent_complete do
    before do
100
      allow(milestone).to receive_messages(
101 102 103 104 105
        closed_items_count: 3,
        total_items_count: 4
      )
    end

106
    it { expect(milestone.percent_complete).to eq(75) }
107 108 109 110 111
  end

  describe :items_count do
    before do
      milestone.issues << create(:issue)
A
Andrew8xx8 已提交
112
      milestone.issues << create(:closed_issue)
113 114 115
      milestone.merge_requests << create(:merge_request)
    end

116 117 118 119
    it { expect(milestone.closed_items_count).to eq(1) }
    it { expect(milestone.open_items_count).to eq(2) }
    it { expect(milestone.total_items_count).to eq(3) }
    it { expect(milestone.is_empty?).to be_falsey }
120 121 122
  end

  describe :can_be_closed? do
123
    it { expect(milestone.can_be_closed?).to be_truthy }
124
  end
A
Andrew8xx8 已提交
125 126

  describe :is_empty? do
127
    before do
128 129
      create :closed_issue, milestone: milestone
      create :merge_request, milestone: milestone
130
    end
A
Andrew8xx8 已提交
131

132
    it 'Should return total count of issues and merge requests assigned to milestone' do
133
      expect(milestone.total_items_count).to eq 2
A
Andrew8xx8 已提交
134 135 136 137
    end
  end

  describe :can_be_closed? do
138
    before do
A
Andrew8xx8 已提交
139
      milestone = create :milestone
140 141
      create :closed_issue, milestone: milestone

142
      create :issue
143
    end
A
Andrew8xx8 已提交
144

J
Johannes Schleifenbaum 已提交
145
    it 'should be true if milestone active and all nested issues closed' do
146
      expect(milestone.can_be_closed?).to be_truthy
A
Andrew8xx8 已提交
147 148
    end

J
Johannes Schleifenbaum 已提交
149
    it 'should be false if milestone active and not all nested issues closed' do
150
      issue.milestone = milestone
A
Andrey Kumanyaev 已提交
151
      issue.save
A
Andrew8xx8 已提交
152

153
      expect(milestone.can_be_closed?).to be_falsey
A
Andrew8xx8 已提交
154 155 156
    end
  end

157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
  describe '#sort_issues' do
    let(:milestone) { create(:milestone) }

    let(:issue1) { create(:issue, milestone: milestone, position: 1) }
    let(:issue2) { create(:issue, milestone: milestone, position: 2) }
    let(:issue3) { create(:issue, milestone: milestone, position: 3) }
    let(:issue4) { create(:issue, position: 42) }

    it 'sorts the given issues' do
      milestone.sort_issues([issue3.id, issue2.id, issue1.id])

      issue1.reload
      issue2.reload
      issue3.reload

      expect(issue1.position).to eq(3)
      expect(issue2.position).to eq(2)
      expect(issue3.position).to eq(1)
    end

    it 'ignores issues not part of the milestone' do
      milestone.sort_issues([issue3.id, issue2.id, issue1.id, issue4.id])

      issue4.reload

      expect(issue4.position).to eq(42)
    end
  end
D
Dmitriy Zaporozhets 已提交
185
end