Files
redmine_contracts/test/integration/budget_plugin_migration_test.rb
T

273 lines
9.8 KiB
Ruby

require 'test_helper'
class BudgetPluginMigrationTest < ActionController::IntegrationTest
def setup
configure_overhead_plugin
end
def load_test_fixture
File.read(File.expand_path(File.dirname(__FILE__)) + "/../fixtures/budget_plugin_migration/budget.yml")
end
context "migrate" do
setup do
@data = load_test_fixture
@project_one = Project.generate!
@project_two = Project.generate!
# Stub out the Project finders because we need to match the ids but can't
# be sure what ids object_daddy will give us
Project.stubs(:find_by_id).with(1).returns(@project_one)
Project.stubs(:find_by_id).with(2).returns(@project_one)
@role = Role.generate!
@manager = User.generate!
User.add_to_project(@manager, @project_one, @role)
User.add_to_project(@manager, @project_two, @role)
@other_user = User.generate!
User.add_to_project(@other_user, @project_one, @role)
User.add_to_project(@other_user, @project_two, @role)
end
should "load a YAML dump of the old budget data" do
RedmineContracts::BudgetPluginMigration.migrate(@data)
assert_equal YAML.load(@data), RedmineContracts::BudgetPluginMigration.data
end
should "create a new Deliverable for each old Deliverable" do
assert_difference("Deliverable.count", 3) do
assert_difference("HourlyDeliverable.count", 0) do
assert_difference("FixedDeliverable.count", 3) do
RedmineContracts::BudgetPluginMigration.migrate(@data)
end
end
end
end
should "create a new Contract for each project that had an old deliverable" do
assert_difference("Contract.count", 2) do
RedmineContracts::BudgetPluginMigration.migrate(@data)
end
assert_equal 1, @project_one.reload.contracts.first.deliverables.count
assert_equal 2, @project_two.reload.contracts.first.deliverables.count
end
context "on new Contracts" do
should "default the contract billable rate to $150" do
RedmineContracts::BudgetPluginMigration.migrate(@data)
assert_equal 150, @project_one.reload.contracts.first.billable_rate
assert_equal 150, @project_two.reload.contracts.first.billable_rate
end
should "allow overriding the contract billable rate" do
RedmineContracts::BudgetPluginMigration.migrate(@data, :contract_rate => '100.50')
assert_equal 100.5, @project_one.reload.contracts.first.billable_rate
assert_equal 100.5, @project_two.reload.contracts.first.billable_rate
end
should "pick the first project member as the account executive" do
RedmineContracts::BudgetPluginMigration.migrate(@data)
assert_equal @manager, @project_one.reload.contracts.first.account_executive
assert_equal @manager, @project_two.reload.contracts.first.account_executive
end
should "allow overriding the account executive by login" do
RedmineContracts::BudgetPluginMigration.migrate(@data, :account_executive => @other_user.login)
assert_equal @other_user, @project_one.reload.contracts.first.account_executive
assert_equal @other_user, @project_two.reload.contracts.first.account_executive
end
should "allow overriding the account executive by id" do
RedmineContracts::BudgetPluginMigration.migrate(@data, :account_executive => @other_user.id)
assert_equal @other_user, @project_one.reload.contracts.first.account_executive
assert_equal @other_user, @project_two.reload.contracts.first.account_executive
end
end
should "enable the contracts plugin for each project with a contract" do
@no_deliverables = Project.generate!(:enabled_modules => [])
RedmineContracts::BudgetPluginMigration.migrate(@data)
assert @project_one.reload.module_enabled?(:contracts)
assert @project_two.reload.module_enabled?(:contracts)
assert !@no_deliverables.reload.module_enabled?(:contracts)
end
should "pick the first project member for the deliverable manager" do
RedmineContracts::BudgetPluginMigration.migrate(@data)
assert_equal [@manager, @manager, @manager], Deliverable.all.collect(&:manager)
end
should "allow overriding the deliverable manager by login" do
RedmineContracts::BudgetPluginMigration.migrate(@data, :deliverable_manager => @other_user.login)
assert_equal [@other_user, @other_user, @other_user], Deliverable.all.collect(&:manager)
end
should "allow overriding the deliverable manager by id" do
RedmineContracts::BudgetPluginMigration.migrate(@data, :deliverable_manager => @other_user.id)
assert_equal [@other_user, @other_user, @other_user], Deliverable.all.collect(&:manager)
end
should "create a new Overhead Budget record for any overhead" do
assert_difference("OverheadBudget.count", 3) do
RedmineContracts::BudgetPluginMigration.migrate(@data)
end
d = Deliverable.find_by_title("Deliverable One")
assert_equal 1, d.overhead_budgets.count
assert_equal 200, d.overhead_budget_total
overhead = d.overhead_budgets.first
assert overhead
assert_equal 200, overhead.budget
assert_equal 0, overhead.hours
end
should "create a new Overhead Budget record for any overhead percent" do
assert_difference("OverheadBudget.count", 3) do
RedmineContracts::BudgetPluginMigration.migrate(@data)
end
d = Deliverable.find_by_title("Deliverable 2")
assert_equal 1, d.overhead_budgets.count
overhead = d.overhead_budgets.first
assert overhead
assert_equal 12 * 25 * 1.5, overhead.budget
assert_equal 0, overhead.hours
end
should "create a new Fixed Budget record for any materials" do
assert_difference("FixedBudget.count", 3) do
RedmineContracts::BudgetPluginMigration.migrate(@data)
end
d = Deliverable.find_by_title("Deliverable One")
assert_equal 1, d.fixed_budgets.count
assert_equal 200, d.fixed_budget_total
end
should "create a new Fixed Budget record for any materials percent" do
assert_difference("FixedBudget.count", 3) do
RedmineContracts::BudgetPluginMigration.migrate(@data)
end
d = Deliverable.find_by_title("Deliverable 2")
assert_equal 1, d.fixed_budgets.count
materials = d.fixed_budgets.first
assert materials
assert_equal 12 * 25 * 0.1, materials.budget
assert_equal 0, materials.markup.to_i
end
should "append the YAML dump of the old object to the notes" do
RedmineContracts::BudgetPluginMigration.migrate(@data)
d = Deliverable.find_by_title("Deliverable One")
assert_match /Converted data/, d.notes
assert_match /"profit"=>200.0/, d.notes
end
context "converting Fixed Deliverables" do
should "convert the budget field to total" do
RedmineContracts::BudgetPluginMigration.migrate(@data)
d = FixedDeliverable.find_by_title("Version 1.0")
assert_equal 93_000, d.total
end
should "add a FixedBudget item for the total deliverable" do
RedmineContracts::BudgetPluginMigration.migrate(@data)
d = FixedDeliverable.find_by_title("Version 1.0")
assert_equal 1, d.fixed_budgets.count
fixed_budget_item = d.fixed_budgets.first
assert_equal 30_000, fixed_budget_item.budget
assert_equal "150%", fixed_budget_item.markup
assert_equal "Converted Fixed Deliverable - Version 1.0", fixed_budget_item.title
end
end
context "converting Hourly Deliverables" do
should "convert over into Fixed Deliverables" do
assert_difference("FixedDeliverable.count",3) do
RedmineContracts::BudgetPluginMigration.migrate(@data)
end
end
should "convert the old 'budget' field into the total" do
RedmineContracts::BudgetPluginMigration.migrate(@data)
assert_equal 5600, FixedDeliverable.find_by_title("Deliverable One").total
assert_equal 900, FixedDeliverable.find_by_title("Deliverable 2").total
end
should "create a new Labor Budget" do
assert_difference("LaborBudget.count", 2) do
RedmineContracts::BudgetPluginMigration.migrate(@data)
end
d1 = Deliverable.find_by_title("Deliverable One")
assert_equal 1, d1.labor_budgets.count
assert_equal 100.0 * 50.0, d1.labor_budget_total
labor1 = d1.labor_budgets.first
assert labor1
assert_equal 5000, labor1.budget
assert_equal 100, labor1.hours
d2 = Deliverable.find_by_title("Deliverable 2")
assert_equal 1, d2.labor_budgets.count
assert_equal 12 * 25, d2.labor_budget_total
labor1 = d2.labor_budgets.first
assert labor1
assert_equal 300, labor1.budget
assert_equal 12, labor1.hours
end
end
context "converting issue ids" do
setup do
@issue1 = Issue.generate_for_project!(@project_two, :deliverable_id => 2)
@issue2 = Issue.generate_for_project!(@project_two, :deliverable_id => 4)
@issue3 = Issue.generate_for_project!(@project_one, :deliverable_id => 1)
end
should "keep the same Deliverable assigned" do
RedmineContracts::BudgetPluginMigration.migrate(@data)
assert_equal "Deliverable 2", @issue1.reload.deliverable.title
assert_equal "Version 1.0", @issue2.reload.deliverable.title
end
should "handle primary key differences between the old and new Deliverables" do
RedmineContracts::BudgetPluginMigration.migrate(@data)
# The "third" deliverable has an id of 4
assert_equal "Deliverable 2", @issue1.reload.deliverable.title
assert_equal "Version 1.0", @issue2.reload.deliverable.title
assert_equal "Deliverable One", @issue3.reload.deliverable.title
end
end
end
end