Files
redmine_contracts/test/unit/contract_test.rb
2011-08-08 11:48:35 -07:00

318 lines
13 KiB
Ruby

require File.dirname(__FILE__) + '/../test_helper'
class ContractTest < ActiveSupport::TestCase
should_belong_to :account_executive
should_belong_to :project
should_belong_to :payment_term
should_have_many :deliverables
should_validate_presence_of :name
should_validate_presence_of :account_executive
should_validate_presence_of :project
should_validate_presence_of :start_date
should_validate_presence_of :end_date
should_not_allow_mass_assignment_of :project_id, :project, :discount_type
should_allow_values_for :discount_type, "$", "%", nil, ''
should_not_allow_values_for :discount_type, ["amount", "percent", "bar"]
should_allow_values_for :status, "", nil, 'open', 'locked', 'closed'
should_not_allow_values_for :status, "other", "things", "1"
context "end_date" do
should "be after start_date" do
@contract = Contract.new(:start_date => Date.today, :end_date => Date.yesterday)
assert @contract.invalid?
assert_equal "must be greater than start date", @contract.errors.on(:end_date)
end
end
should "default executed to false" do
@contract = Contract.new
assert_equal false, @contract.executed
end
should "default status to open" do
@contract = Contract.new
assert_equal "open", @contract.status
end
context "#labor_budget" do
should "sum all of the labor budgets of the Deliverables" do
contract = Contract.generate!
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
LaborBudget.generate!(:deliverable => @deliverable_1, :budget => 100)
contract.deliverables << @deliverable_2 = FixedDeliverable.generate!
LaborBudget.generate!(:deliverable => @deliverable_2, :budget => 100)
assert_equal 200, contract.labor_budget
end
end
context "#labor_spent" do
setup do
configure_overhead_plugin
end
should "sum all of the labor spent on the Deliverables" do
@project = Project.generate!
@manager = User.generate!
@role = Role.generate!
User.add_to_project(@manager, @project, @role)
@rate = Rate.generate!(:project => @project,
:user => @manager,
:date_in_effect => Date.yesterday,
:amount => 100)
contract = Contract.generate!
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
@deliverable_1.issues << @issue1 = Issue.generate_for_project!(@project)
TimeEntry.generate!(:hours => 5, :issue => @issue1, :project => @project,
:activity => @billable_activity,
:user => @manager)
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
@deliverable_2.issues << @issue2 = Issue.generate_for_project!(@project)
TimeEntry.generate!(:hours => 20, :issue => @issue2, :project => @project,
:activity => @billable_activity,
:user => @manager)
assert_equal 2500, contract.labor_spent
end
end
context "#overhead_budget" do
should "sum all of the overhead budgets of the Deliverables" do
contract = Contract.generate!
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
OverheadBudget.generate!(:deliverable => @deliverable_1, :budget => 100)
contract.deliverables << @deliverable_2 = FixedDeliverable.generate!
OverheadBudget.generate!(:deliverable => @deliverable_2, :budget => 100)
assert_equal 200, contract.overhead_budget
end
end
context "#overhead_spent" do
setup do
configure_overhead_plugin
end
should "sum all of the overhead spent on the Deliverables" do
@project = Project.generate!
@manager = User.generate!
@role = Role.generate!
User.add_to_project(@manager, @project, @role)
@rate = Rate.generate!(:project => @project,
:user => @manager,
:date_in_effect => Date.yesterday,
:amount => 100)
contract = Contract.generate!
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
@deliverable_1.issues << @issue1 = Issue.generate_for_project!(@project)
TimeEntry.generate!(:hours => 10, :issue => @issue1, :project => @project,
:activity => @non_billable_activity,
:user => @manager)
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
@deliverable_2.issues << @issue2 = Issue.generate_for_project!(@project)
TimeEntry.generate!(:hours => 10, :issue => @issue2, :project => @project,
:activity => @non_billable_activity,
:user => @manager)
assert_equal 2000, contract.overhead_spent
end
end
context "#estimated_hour_budget" do
should "sum all of the labor and overhead budgets of the Deliverables" do
contract = Contract.generate!
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
LaborBudget.generate!(:deliverable => @deliverable_1, :hours => 50)
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
OverheadBudget.generate!(:deliverable => @deliverable_2, :hours => 60)
assert_equal 110, contract.estimated_hour_budget
end
end
context "#estimated_hour_spent" do
should "sum all of the hours spent on the Deliverables" do
@project = Project.generate!
contract = Contract.generate!
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
@deliverable_1.issues << @issue1 = Issue.generate_for_project!(@project)
@deliverable_1.issues << @issue2 = Issue.generate_for_project!(@project)
TimeEntry.generate!(:hours => 10, :issue => @issue1, :project => @project)
TimeEntry.generate!(:hours => 10, :issue => @issue2, :project => @project)
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
@deliverable_2.issues << @issue3 = Issue.generate_for_project!(@project)
@deliverable_2.issues << @issue4 = Issue.generate_for_project!(@project)
TimeEntry.generate!(:hours => 10, :issue => @issue3, :project => @project)
TimeEntry.generate!(:hours => 10, :issue => @issue4, :project => @project)
assert_equal 40, contract.estimated_hour_spent
end
end
context "#total_budget" do
should "sum all of the totals of the Deliverables" do
contract = Contract.generate!(:billable_rate => 100.0)
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!(:total => 10_000)
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
LaborBudget.generate!(:deliverable => @deliverable_2, :hours => 10)
OverheadBudget.generate!(:deliverable => @deliverable_2, :hours => 20)
assert_equal 10_000 + (10 * 100), contract.total_budget
end
end
context "#profit_budget" do
should "sum all of the profit budgets of the Deliverables" do
contract = Contract.generate!(:billable_rate => 100.0)
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!(:total => 10_000)
LaborBudget.generate!(:deliverable => @deliverable_1, :budget => 2000)
OverheadBudget.generate!(:deliverable => @deliverable_1, :budget => 2000)
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
LaborBudget.generate!(:deliverable => @deliverable_2, :hours => 10)
OverheadBudget.generate!(:deliverable => @deliverable_2, :hours => 20)
assert_equal 10_000 - 4000, @deliverable_1.profit_budget
assert_equal (10 * 100.0) - 0, @deliverable_2.profit_budget
assert_equal 7000, contract.profit_budget
end
end
context "#total_spent" do
should "sum all of the total spents on the Deliverables" do
configure_overhead_plugin
contract = Contract.generate!(:billable_rate => 150.0)
@project = Project.generate!
@developer = User.generate!
@role = Role.generate!
User.add_to_project(@developer, @project, @role)
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!(:total => 10_000)
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!(:contract => contract)
@deliverable_2.issues << @issue1 = Issue.generate_for_project!(@project)
TimeEntry.generate!(:hours => 15, :issue => @issue1, :project => @project,
:activity => @billable_activity,
:user => @developer)
assert_equal 10_000, @deliverable_1.total_spent
assert_equal 2250, @deliverable_2.total_spent
assert_equal 12_250, contract.total_spent
end
end
context "#profit_left" do
should "sum all of the profit left on all of the Deliverables" do
configure_overhead_plugin
contract = Contract.generate!(:billable_rate => 150.0)
@project = Project.generate!
@developer = User.generate!
@manager = User.generate!
@role = Role.generate!
User.add_to_project(@developer, @project, @role)
User.add_to_project(@manager, @project, @role)
@rate = Rate.generate!(:project => @project,
:user => @developer,
:date_in_effect => Date.yesterday,
:amount => 55)
@rate = Rate.generate!(:project => @project,
:user => @manager,
:date_in_effect => Date.yesterday,
:amount => 75)
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!(:total => 2000)
@deliverable_1.issues << @issue1 = Issue.generate_for_project!(@project)
TimeEntry.generate!(:hours => 15, :issue => @issue1, :project => @project,
:activity => @billable_activity,
:user => @developer)
TimeEntry.generate!(:hours => 4, :issue => @issue1, :project => @project,
:activity => @non_billable_activity,
:user => @manager)
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!(:contract => contract)
@deliverable_2.issues << @issue2 = Issue.generate_for_project!(@project)
TimeEntry.generate!(:hours => 15, :issue => @issue2, :project => @project,
:activity => @billable_activity,
:user => @developer)
TimeEntry.generate!(:hours => 4, :issue => @issue2, :project => @project,
:activity => @non_billable_activity,
:user => @manager)
@deliverable_2.fixed_budgets << FixedBudget.spawn(:budget => 200, :markup => '$100', :paid => true)
assert_equal 875, @deliverable_1.profit_left
assert_equal 1125, @deliverable_2.profit_left
assert_equal 2000, contract.profit_left
end
end
context "#fixed_budget" do
should "sum all fixed budget amounts on the Deliverables" do
contract = Contract.generate!
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
FixedBudget.generate!(:deliverable => @deliverable_1, :budget => '$1,000')
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
FixedBudget.generate!(:deliverable => @deliverable_2, :budget => '$2,000')
assert_equal 3000, contract.fixed_budget
end
end
context "#fixed_spent" do
should "sum all fixed budget amounts on the Deliverables which are paid" do
contract = Contract.generate!
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
FixedBudget.generate!(:deliverable => @deliverable_1, :budget => '$1,000', :paid => true)
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
FixedBudget.generate!(:deliverable => @deliverable_2, :budget => '$2,000')
assert_equal 1000, contract.fixed_spent
end
end
context "#fixed_markup_budget" do
should "sum all fixed budget markup values on the Deliverables" do
contract = Contract.generate!
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
FixedBudget.generate!(:deliverable => @deliverable_1, :budget => '$1,000', :markup => '$100')
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
FixedBudget.generate!(:deliverable => @deliverable_2, :budget => '$2,000', :markup => '200%')
assert_equal (100) + (2.00 * 2000), contract.fixed_markup_budget
end
end
context "#fixed_markup_spent" do
should "sum all fixed budget markup values on the Deliverables which are paid" do
contract = Contract.generate!
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
FixedBudget.generate!(:deliverable => @deliverable_1, :budget => '$1,000', :markup => '$100', :paid => true)
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
FixedBudget.generate!(:deliverable => @deliverable_2, :budget => '$2,000', :markup => '200%')
assert_equal (100) + (0), contract.fixed_markup_spent
end
end
end