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:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user