diff --git a/app/models/budget/phase.rb b/app/models/budget/phase.rb index 6c4e0a3c8..d8b59207f 100644 --- a/app/models/budget/phase.rb +++ b/app/models/budget/phase.rb @@ -18,7 +18,7 @@ class Budget validates_translation :summary, length: { maximum: SUMMARY_MAX_LENGTH } validates_translation :description, length: { maximum: DESCRIPTION_MAX_LENGTH } validates :budget, presence: true - validates :kind, presence: true, uniqueness: { scope: :budget }, inclusion: { in: PHASE_KINDS } + validates :kind, presence: true, uniqueness: { scope: :budget }, inclusion: { in: ->(*) { PHASE_KINDS }} validate :invalid_dates_range? validate :prev_phase_dates_valid? validate :next_phase_dates_valid? diff --git a/lib/tasks/budgets.rake b/lib/tasks/budgets.rake index 172944420..c5ffa9ef6 100644 --- a/lib/tasks/budgets.rake +++ b/lib/tasks/budgets.rake @@ -10,4 +10,23 @@ namespace :budgets do Budget.last.email_unselected end end + + desc "Set published attribute" + task set_published: :environment do + Budget.where(published: nil).each do |budget| + if budget.phase == "drafting" + if budget.phases.enabled.first.present? + next_enabled_phase = budget.phases.enabled.where.not(kind: "drafting").first.kind + else + next_enabled_phase = "informing" + budget.phases.informing.update!(enabled: true) + end + + budget.update!(phase: next_enabled_phase) + budget.update!(published: false) + else + budget.update!(published: true) + end + end + end end diff --git a/lib/tasks/consul.rake b/lib/tasks/consul.rake index 4f169c387..b4775c285 100644 --- a/lib/tasks/consul.rake +++ b/lib/tasks/consul.rake @@ -7,6 +7,7 @@ namespace :consul do desc "Runs tasks needed to upgrade from 1.2.0 to 1.3.0" task "execute_release_1.3.0_tasks": [ "db:load_sdg", - "db:calculate_tsv" + "db:calculate_tsv", + "budgets:set_published" ] end diff --git a/spec/lib/tasks/budgets_spec.rb b/spec/lib/tasks/budgets_spec.rb new file mode 100644 index 000000000..609e218c7 --- /dev/null +++ b/spec/lib/tasks/budgets_spec.rb @@ -0,0 +1,70 @@ +require "rails_helper" + +describe Budget do + let(:run_rake_task) do + Rake::Task["budgets:set_published"].reenable + Rake.application.invoke_task("budgets:set_published") + end + + it "does not change anything if the published attribute is set" do + budget = create(:budget, published: false, phase: "accepting") + + run_rake_task + budget.reload + + expect(budget.phase).to eq "accepting" + expect(budget.published).to be false + end + + it "publishes budgets which are not in draft mode" do + budget = create(:budget, published: nil, phase: "accepting") + + run_rake_task + budget.reload + + expect(budget.phase).to eq "accepting" + expect(budget.published).to be true + end + + it "changes the published attribute to false on drafting budgets" do + stub_const("Budget::Phase::PHASE_KINDS", ["drafting"] + Budget::Phase::PHASE_KINDS) + budget = create(:budget, published: nil) + budget.update_column(:phase, "drafting") + stub_const("Budget::Phase::PHASE_KINDS", Budget::Phase::PHASE_KINDS - ["drafting"]) + + run_rake_task + budget.reload + + expect(budget.published).to be false + expect(budget.phase).to eq "informing" + end + + it "changes the phase to the first enabled phase" do + budget = create(:budget, published: nil) + budget.update_column(:phase, "drafting") + budget.phases.informing.update!(enabled: false) + + expect(budget.phase).to eq "drafting" + + run_rake_task + budget.reload + + expect(budget.phase).to eq "accepting" + expect(budget.published).to be false + end + + it "enables and select the informing phase if there are not any enabled phases" do + budget = create(:budget, published: nil) + budget.update_column(:phase, "drafting") + budget.phases.each { |phase| phase.update!(enabled: false) } + + expect(budget.phase).to eq "drafting" + + run_rake_task + budget.reload + + expect(budget.phase).to eq "informing" + expect(budget.phases.informing.enabled).to be true + expect(budget.published).to be false + end +end