milestone_spec.rb 2.7 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
A
Andrew8xx8 已提交
10
#  state       :string           default(FALSE), not null
D
Dmitriy Zaporozhets 已提交
11 12
#  created_at  :datetime         not null
#  updated_at  :datetime         not null
D
Dmitriy Zaporozhets 已提交
13 14
#

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

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

23 24 25 26
  describe "Mass assignment" do
    it { should_not allow_mass_assignment_of(:project_id) }
  end

27 28
  describe "Validation" do
    it { should validate_presence_of(:title) }
A
Andrey Kumanyaev 已提交
29
    it { should validate_presence_of(:project) }
30 31
  end

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

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

41
    it "should count closed issues" do
42
      IssueObserver.current_user = issue.author
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
D
Dmitriy Zaporozhets 已提交
111
end