Merge pull request #4522 from consul/budget_without_phases

Fix crash with budgets with disabled current phase
This commit is contained in:
Javi Martín
2021-06-02 19:13:33 +02:00
committed by GitHub
5 changed files with 52 additions and 5 deletions

View File

@@ -10,7 +10,7 @@ class Admin::Budgets::DurationComponent < ApplicationComponent
end end
def duration 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 end
private private

View File

@@ -19,7 +19,11 @@ class Admin::Budgets::IndexComponent < ApplicationComponent
end end
def current_enabled_phase_number(budget) 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 end
def dates(budget) def dates(budget)

View File

@@ -72,11 +72,11 @@ class Budget < ApplicationRecord
end end
def starts_at def starts_at
phases.published.first.starts_at phases.published.first&.starts_at
end end
def ends_at def ends_at
phases.published.last.ends_at phases.published.last&.ends_at
end end
def description def description

View File

@@ -43,6 +43,22 @@ describe Admin::Budgets::DurationComponent, type: :component do
expect(page.text).to eq "about 1 year" expect(page.text).to eq "about 1 year"
end 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 end
attr_reader :content attr_reader :content
@@ -52,6 +68,6 @@ describe Admin::Budgets::DurationComponent, type: :component do
end end
def page def page
Capybara::Node::Simple.new(content) Capybara::Node::Simple.new(content.to_s)
end end
end end

View 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