Adjust date ranges of prev/next phases when enabling/disabling a Budget::Phase, with model specs

This commit is contained in:
Bertocq
2018-01-15 20:42:29 +01:00
parent 601351d160
commit 313d8d2e11
3 changed files with 88 additions and 0 deletions

View File

@@ -172,3 +172,4 @@ class Budget < ActiveRecord::Base
end
end

View File

@@ -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'))

View File

@@ -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)