From 313d8d2e119846d95cc9391979a685015367715b Mon Sep 17 00:00:00 2001 From: Bertocq Date: Mon, 15 Jan 2018 20:42:29 +0100 Subject: [PATCH] Adjust date ranges of prev/next phases when enabling/disabling a Budget::Phase, with model specs --- app/models/budget.rb | 1 + app/models/budget/phase.rb | 10 +++++ spec/models/budget/phase_spec.rb | 77 ++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) diff --git a/app/models/budget.rb b/app/models/budget.rb index bf3fc13f5..aba7b04ae 100644 --- a/app/models/budget.rb +++ b/app/models/budget.rb @@ -172,3 +172,4 @@ class Budget < ActiveRecord::Base end end + diff --git a/app/models/budget/phase.rb b/app/models/budget/phase.rb index d5fc42060..462d64ef6 100644 --- a/app/models/budget/phase.rb +++ b/app/models/budget/phase.rb @@ -18,6 +18,7 @@ class Budget before_validation :sanitize_description + after_save :adjust_date_ranges scope :enabled, -> { where(enabled: true) } scope :drafting, -> { find_by_kind('drafting') } @@ -38,6 +39,15 @@ class Budget prev_phase&.enabled? ? prev_phase : prev_phase&.prev_enabled_phase end + def adjust_date_ranges + if enabled? + next_enabled_phase&.update_column(:starts_at, ends_at) + prev_enabled_phase&.update_column(:ends_at, starts_at) + elsif enabled_changed? + next_enabled_phase&.update_column(:starts_at, starts_at) + end + end + def dates_range_valid? if starts_at.present? && ends_at.present? && starts_at >= ends_at errors.add(:starts_at, I18n.t('budgets.phases.errors.dates_range_invalid')) diff --git a/spec/models/budget/phase_spec.rb b/spec/models/budget/phase_spec.rb index fba482534..5f9ea34c2 100644 --- a/spec/models/budget/phase_spec.rb +++ b/spec/models/budget/phase_spec.rb @@ -121,6 +121,83 @@ describe Budget::Phase do end end + describe "#adjust_date_ranges" do + let(:prev_enabled_phase) { second_phase.prev_enabled_phase } + let(:next_enabled_phase) { second_phase.next_enabled_phase } + + describe "when enabled" do + it "adjusts previous enabled phase end date to its own start date" do + expect(prev_enabled_phase.ends_at).to eq(second_phase.starts_at) + end + + it "adjusts next enabled phase start date to its own end date" do + expect(next_enabled_phase.starts_at).to eq(second_phase.ends_at) + end + end + + describe "when being enabled" do + before do + second_phase.update_attributes(enabled: false, + starts_at: Date.current, + ends_at: Date.current + 2.days) + end + + it "adjusts previous enabled phase end date to its own start date" do + expect{ + second_phase.update_attributes(enabled: true) + }.to change{ + prev_enabled_phase.ends_at.to_date + }.to(Date.current) + end + + it "adjusts next enabled phase start date to its own end date" do + expect{ + second_phase.update_attributes(enabled: true) + }.to change{ + next_enabled_phase.starts_at.to_date + }.to(Date.current + 2.days) + end + end + + describe "when disabled" do + before do + second_phase.update_attributes(enabled: false) + end + + it "doesn't change previous enabled phase end date" do + expect { + second_phase.update_attributes(starts_at: Date.current, + ends_at: Date.current + 2.days) + }.not_to (change{ prev_enabled_phase.ends_at }) + end + + it "doesn't change next enabled phase start date" do + expect{ + second_phase.update_attributes(starts_at: Date.current, + ends_at: Date.current + 2.days) + }.not_to (change{ next_enabled_phase.starts_at }) + end + end + + describe "when being disabled" do + it "doesn't adjust previous enabled phase end date to its own start date" do + expect { + second_phase.update_attributes(enabled: false, + starts_at: Date.current, + ends_at: Date.current + 2.days) + }.not_to (change{ prev_enabled_phase.ends_at }) + end + + it "adjusts next enabled phase start date to its own start date" do + expect { + second_phase.update_attributes(enabled: false, + starts_at: Date.current, + ends_at: Date.current + 2.days) + }.to change{ next_enabled_phase.starts_at.to_date }.to(Date.current) + end + end + end + describe "next & prev enabled phases" do before do second_phase.update_attributes(enabled: false)