diff --git a/lib/tasks/consul.rake b/lib/tasks/consul.rake index 03c510743..fea722ae5 100644 --- a/lib/tasks/consul.rake +++ b/lib/tasks/consul.rake @@ -5,6 +5,7 @@ namespace :consul do desc "Runs tasks needed to upgrade from 1.0.0 to 1.1.0" task "execute_release_1.1.0_tasks": [ "budgets:set_original_heading_id", - "migrations:valuation_taggings" + "migrations:valuation_taggings", + "migrations:budget_admins_and_valuators" ] end diff --git a/lib/tasks/migrations.rake b/lib/tasks/migrations.rake index d9b829e86..f545b620e 100644 --- a/lib/tasks/migrations.rake +++ b/lib/tasks/migrations.rake @@ -4,4 +4,17 @@ namespace :migrations do ApplicationLogger.new.info "Updating valuation taggings context" Tagging.where(context: "valuation").update_all(context: "valuation_tags") end + + desc "Migrates budget staff" + task budget_admins_and_valuators: :environment do + ApplicationLogger.new.info "Updating budget administrators and valuators" + Budget.find_each do |budget| + investments = budget.investments.with_hidden + + budget.update!( + administrator_ids: investments.where.not(administrator: nil).distinct.pluck(:administrator_id), + valuator_ids: Budget::ValuatorAssignment.where(investment: investments).distinct.pluck(:valuator_id) + ) + end + end end diff --git a/spec/lib/tasks/migrations_spec.rb b/spec/lib/tasks/migrations_spec.rb index ae6da3a54..6e375e50e 100644 --- a/spec/lib/tasks/migrations_spec.rb +++ b/spec/lib/tasks/migrations_spec.rb @@ -1,22 +1,68 @@ require "rails_helper" describe "Migration tasks" do - let(:run_rake_task) do - Rake::Task["migrations:valuation_taggings"].reenable - Rake.application.invoke_task("migrations:valuation_taggings") + describe "valuation_taggins" do + let(:run_rake_task) do + Rake::Task["migrations:valuation_taggings"].reenable + Rake.application.invoke_task("migrations:valuation_taggings") + end + + it "updates taggings" do + valuation_tagging = create(:tagging, context: "valuation") + another_valuation_tagging = create(:tagging, context: "valuation") + valuation_tags_tagging = create(:tagging, context: "valuation_tags") + tags_tagging = create(:tagging) + + run_rake_task + + expect(valuation_tagging.reload.context).to eq "valuation_tags" + expect(another_valuation_tagging.reload.context).to eq "valuation_tags" + expect(valuation_tags_tagging.reload.context).to eq "valuation_tags" + expect(tags_tagging.reload.context).to eq "tags" + end end - it "updates taggings" do - valuation_tagging = create(:tagging, context: "valuation") - another_valuation_tagging = create(:tagging, context: "valuation") - valuation_tags_tagging = create(:tagging, context: "valuation_tags") - tags_tagging = create(:tagging) + describe "budget_admins_and_valuators" do + let(:run_rake_task) do + Rake::Task["migrations:budget_admins_and_valuators"].reenable + Rake.application.invoke_task("migrations:budget_admins_and_valuators") + end - run_rake_task + let(:old_budget) { create(:budget) } + let(:current_budget) { create(:budget) } - expect(valuation_tagging.reload.context).to eq "valuation_tags" - expect(another_valuation_tagging.reload.context).to eq "valuation_tags" - expect(valuation_tags_tagging.reload.context).to eq "valuation_tags" - expect(tags_tagging.reload.context).to eq "tags" + it "assigns administrators from existing investments" do + harold = create(:administrator) + john = create(:administrator) + root = create(:administrator) + + create(:budget_investment, budget: old_budget, administrator: john) + create(:budget_investment, budget: old_budget, administrator: harold) + create(:budget_investment, budget: old_budget, administrator: nil) + + create(:budget_investment, budget: current_budget, administrator: root) + + run_rake_task + + expect(old_budget.administrators).to match_array [john, harold] + expect(current_budget.administrators).to match_array [root] + end + + it "assigns valuators from existing investments" do + tyrion = create(:valuator) + cersei = create(:valuator) + jaime = create(:valuator) + + create(:budget_investment, budget: old_budget, valuators: [cersei]) + create(:budget_investment, budget: old_budget, valuators: [jaime, cersei]) + create(:budget_investment, budget: old_budget, valuators: []) + + create(:budget_investment, budget: current_budget, valuators: [tyrion, jaime]) + + run_rake_task + + expect(old_budget.valuators).to match_array [cersei, jaime] + expect(current_budget.valuators).to match_array [tyrion, jaime] + end end end