Use PHASE_KINDS to calculate "or_later?" methods

This implementation is a bit more robust because we don't have to change
any of the "or_later?" methods if we add or remove a new phase.

We could also use metaprogramming to reduce code duplication in these
methods. So far, I've decided to keep the code simple since the
duplication seems reasonable.
This commit is contained in:
Javi Martín
2019-03-20 17:53:24 +01:00
parent c8146e13db
commit 1f225c59ed
3 changed files with 41 additions and 24 deletions

View File

@@ -126,7 +126,7 @@ class Budget < ApplicationRecord
end
def publishing_prices_or_later?
publishing_prices? || balloting_or_later?
current_phase&.publishing_prices_or_later?
end
def balloting_process?
@@ -134,7 +134,7 @@ class Budget < ApplicationRecord
end
def balloting_or_later?
balloting_process? || finished?
current_phase&.balloting_or_later?
end
def heading_price(heading)

View File

@@ -47,6 +47,14 @@ class Budget
end
end
def publishing_prices_or_later?
in_phase_or_later?("publishing_prices")
end
def balloting_or_later?
in_phase_or_later?("balloting")
end
private
def adjust_date_ranges
@@ -84,5 +92,9 @@ class Budget
end
end
def in_phase_or_later?(phase)
PHASE_KINDS.index(kind) >= PHASE_KINDS.index(phase)
end
end
end

View File

@@ -97,33 +97,38 @@ describe Budget do
expect(budget).to be_finished
end
it "balloting_or_later?" do
budget.phase = "drafting"
expect(budget).not_to be_balloting_or_later
describe "#publishing_prices_or_later?" do
it "returns false before publishing prices" do
budget.phase = "valuating"
expect(budget).not_to be_publishing_prices_or_later
end
budget.phase = "accepting"
expect(budget).not_to be_balloting_or_later
it "returns true while publishing prices" do
budget.phase = "publishing_prices"
expect(budget).to be_publishing_prices_or_later
end
budget.phase = "reviewing"
expect(budget).not_to be_balloting_or_later
it "returns true after publishing prices" do
budget.phase = "balloting"
expect(budget).to be_publishing_prices_or_later
end
end
budget.phase = "selecting"
expect(budget).not_to be_balloting_or_later
describe "#balloting_or_later?" do
it "returns false before balloting" do
budget.phase = "publishing_prices"
expect(budget).not_to be_balloting_or_later
end
budget.phase = "valuating"
expect(budget).not_to be_balloting_or_later
it "returns true while balloting" do
budget.phase = "balloting"
expect(budget).to be_balloting_or_later
end
budget.phase = "publishing_prices"
expect(budget).not_to be_balloting_or_later
budget.phase = "balloting"
expect(budget).to be_balloting_or_later
budget.phase = "reviewing_ballots"
expect(budget).to be_balloting_or_later
budget.phase = "finished"
expect(budget).to be_balloting_or_later
it "returns true after balloting" do
budget.phase = "finished"
expect(budget).to be_balloting_or_later
end
end
end