Merge pull request #4522 from consul/budget_without_phases
Fix crash with budgets with disabled current phase
This commit is contained in:
@@ -10,7 +10,7 @@ class Admin::Budgets::DurationComponent < ApplicationComponent
|
||||
end
|
||||
|
||||
def duration
|
||||
distance_of_time_in_words(durable.starts_at, durable.ends_at)
|
||||
distance_of_time_in_words(durable.starts_at, durable.ends_at) if durable.starts_at && durable.ends_at
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -19,7 +19,11 @@ class Admin::Budgets::IndexComponent < ApplicationComponent
|
||||
end
|
||||
|
||||
def current_enabled_phase_number(budget)
|
||||
budget.phases.enabled.order(:id).pluck(:kind).index(budget.phase) + 1
|
||||
current_enabled_phase_index(budget) + 1
|
||||
end
|
||||
|
||||
def current_enabled_phase_index(budget)
|
||||
budget.phases.enabled.order(:id).pluck(:kind).index(budget.phase) || -1
|
||||
end
|
||||
|
||||
def dates(budget)
|
||||
|
||||
@@ -72,11 +72,11 @@ class Budget < ApplicationRecord
|
||||
end
|
||||
|
||||
def starts_at
|
||||
phases.published.first.starts_at
|
||||
phases.published.first&.starts_at
|
||||
end
|
||||
|
||||
def ends_at
|
||||
phases.published.last.ends_at
|
||||
phases.published.last&.ends_at
|
||||
end
|
||||
|
||||
def description
|
||||
|
||||
@@ -43,6 +43,22 @@ describe Admin::Budgets::DurationComponent, type: :component do
|
||||
|
||||
expect(page.text).to eq "about 1 year"
|
||||
end
|
||||
|
||||
it "is not defined when no end date is defined" do
|
||||
durable = double(starts_at: Time.zone.local(2015, 8, 1, 12, 0, 0), ends_at: nil)
|
||||
|
||||
render Admin::Budgets::DurationComponent.new(durable).duration
|
||||
|
||||
expect(page.text).to be_empty
|
||||
end
|
||||
|
||||
it "is not defined when no start date is defined" do
|
||||
durable = double(starts_at: nil, ends_at: Time.zone.local(2016, 9, 30, 16, 30, 00))
|
||||
|
||||
render Admin::Budgets::DurationComponent.new(durable).duration
|
||||
|
||||
expect(page.text).to be_empty
|
||||
end
|
||||
end
|
||||
|
||||
attr_reader :content
|
||||
@@ -52,6 +68,6 @@ describe Admin::Budgets::DurationComponent, type: :component do
|
||||
end
|
||||
|
||||
def page
|
||||
Capybara::Node::Simple.new(content)
|
||||
Capybara::Node::Simple.new(content.to_s)
|
||||
end
|
||||
end
|
||||
|
||||
27
spec/components/admin/budgets/index_component_spec.rb
Normal file
27
spec/components/admin/budgets/index_component_spec.rb
Normal file
@@ -0,0 +1,27 @@
|
||||
require "rails_helper"
|
||||
|
||||
describe Admin::Budgets::IndexComponent, type: :component do
|
||||
before do
|
||||
allow(ViewComponent::Base).to receive(:test_controller).and_return("Admin::BudgetsController")
|
||||
allow_any_instance_of(Admin::BudgetsController).to receive(:valid_filters).and_return(["all"])
|
||||
allow_any_instance_of(Admin::BudgetsController).to receive(:current_filter).and_return("all")
|
||||
end
|
||||
|
||||
it "displays current phase zero for budgets with no current phase" do
|
||||
budget = create(:budget, :accepting, name: "Not enabled phase")
|
||||
budget.phases.accepting.update!(enabled: false)
|
||||
|
||||
render_inline Admin::Budgets::IndexComponent.new(Budget.page(1))
|
||||
|
||||
expect(page.find("tr", text: "Not enabled phase")).to have_content "0/8"
|
||||
end
|
||||
|
||||
it "displays phase zero out of zero for budgets with no enabled phases" do
|
||||
budget = create(:budget, name: "Without phases")
|
||||
budget.phases.each { |phase| phase.update!(enabled: false) }
|
||||
|
||||
render_inline Admin::Budgets::IndexComponent.new(Budget.page(1))
|
||||
|
||||
expect(page.find("tr", text: "Without phases")).to have_content "0/0"
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user