diff --git a/app/models/budget/ballot.rb b/app/models/budget/ballot.rb index bf7851883..9b9a089d6 100644 --- a/app/models/budget/ballot.rb +++ b/app/models/budget/ballot.rb @@ -11,12 +11,12 @@ class Budget investments.sum(:price).to_i end - def amount_spent(heading) - investments.by_heading(heading).sum(:price).to_i + def amount_spent(heading_id) + investments.by_heading(heading_id).sum(:price).to_i end def amount_available(heading) - budget.heading_price(heading) - amount_spent(heading) + budget.heading_price(heading) - amount_spent(heading.try(:id)) end end end diff --git a/app/models/budget/investment.rb b/app/models/budget/investment.rb index 32ea9ad92..329c2fce2 100644 --- a/app/models/budget/investment.rb +++ b/app/models/budget/investment.rb @@ -42,6 +42,7 @@ class Budget scope :undecided, -> { where(feasibility: "undecided") } scope :with_supports, -> { where('cached_votes_up > 0') } + scope :by_heading, -> (heading_id) { where(heading_id: heading_id) } scope :by_budget, -> (budget_id) { where(budget_id: budget_id) } scope :by_admin, -> (admin_id) { where(administrator_id: admin_id) } scope :by_tag, -> (tag_name) { tagged_with(tag_name) } diff --git a/spec/models/budget/ballot_spec.rb b/spec/models/budget/ballot_spec.rb index df31c9eae..ee6be74f1 100644 --- a/spec/models/budget/ballot_spec.rb +++ b/spec/models/budget/ballot_spec.rb @@ -16,9 +16,7 @@ describe Budget::Ballot do expect(ballot.total_amount_spent).to eq 30000 end - end - describe "#amount_spent by heading" do it "returns the amount spent on all investments assigned to a specific heading" do heading = create(:budget_heading) inv1 = create(:budget_investment, :feasible, price: 10000, heading: heading) @@ -40,4 +38,31 @@ describe Budget::Ballot do end end -end \ No newline at end of file + describe "#amount_available" do + it "returns how much is left after taking some investments" do + budget = create(:budget, price: 200000) + heading = create(:budget_heading, budget: budget) + inv1 = create(:budget_investment, :feasible, price: 10000, heading: heading) + inv2 = create(:budget_investment, :feasible, price: 20000, heading: create(:budget_heading)) + inv3 = create(:budget_investment, :feasible, price: 25000) + inv4 = create(:budget_investment, :feasible, price: 40000, heading: heading) + + inv1 = create(:budget_investment, :feasible, price: 10000) + inv2 = create(:budget_investment, :feasible, price: 20000) + + ballot = create(:budget_ballot, budget: budget) + ballot.investments << inv1 + ballot.investments << inv2 + + expect(ballot.amount_available(heading)).to eq 1000000 + expect(ballot.amount_available(nil)).to eq 170000 + + ballot.investments << inv3 + ballot.investments << inv4 + + expect(ballot.amount_available(heading)).to eq 960000 + expect(ballot.amount_available(nil)).to eq 145000 + end + end + +end diff --git a/spec/models/budget_spec.rb b/spec/models/budget_spec.rb index d874148a1..398bb1cff 100644 --- a/spec/models/budget_spec.rb +++ b/spec/models/budget_spec.rb @@ -1,15 +1,52 @@ require 'rails_helper' describe Budget do - it "validates the phase" do - budget = create(:budget) - Budget::VALID_PHASES.each do |phase| - budget.phase = phase - expect(budget).to be_valid + describe "phase" do + let(:budget) { create(:budget) } + + it "is validated" do + Budget::VALID_PHASES.each do |phase| + budget.phase = phase + expect(budget).to be_valid + end + + budget.phase = 'inexisting' + expect(budget).to_not be_valid end - budget.phase = 'inexisting' - expect(budget).to_not be_valid + it "produces auxiliary methods" do + budget.phase = "on_hold" + expect(budget).to be_on_hold + + budget.phase = "accepting" + expect(budget).to be_accepting + + budget.phase = "selecting" + expect(budget).to be_selecting + + budget.phase = "balloting" + expect(budget).to be_balloting + + budget.phase = "finished" + expect(budget).to be_finished + end + end + + describe "heading_price" do + let(:budget) { create(:budget, price: 1000) } + + it "returns the budget price if no heading is provided" do + expect(budget.heading_price(nil)).to eq(1000) + end + + it "returns the heading price if the heading provided is part of the budget" do + heading = create(:budget_heading, price: 100, budget: budget) + expect(budget.heading_price(heading)).to eq(100) + end + + it "returns -1 if the heading provided is not part of the budget" do + expect(budget.heading_price(create(:budget_heading))).to eq(-1) + end end end