From 5a934de5a62197f0e23541370e663b1054811335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Sat, 21 Sep 2019 11:59:20 +0200 Subject: [PATCH 1/2] Add test for lines order calculating winners We were creating the investments with more ballot counts first in every test, so the tests would pass if we ordered the investments by creation date instead of ordering them by the number of ballot lines. --- spec/models/budget/result_spec.rb | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/spec/models/budget/result_spec.rb b/spec/models/budget/result_spec.rb index 73139f93d..b7b925b57 100644 --- a/spec/models/budget/result_spec.rb +++ b/spec/models/budget/result_spec.rb @@ -6,8 +6,19 @@ describe Budget::Result do let(:budget) { create(:budget) } let(:heading) { create(:budget_heading, budget: budget, price: 1000) } - context "When there is no winners" do - it "calculates the correct winner set" do + context "When there are no winners" do + it "assigns investments ordered by ballot lines until budget is met" do + create(:budget_investment, :selected, heading: heading, price: 100, ballot_lines_count: 500) + create(:budget_investment, :selected, heading: heading, price: 300, ballot_lines_count: 800) + create(:budget_investment, :selected, heading: heading, price: 200, ballot_lines_count: 900) + create(:budget_investment, :selected, heading: heading, price: 500, ballot_lines_count: 600) + + Budget::Result.new(budget, heading).calculate_winners + + expect(heading.investments.winners.pluck(:ballot_lines_count)).to match_array([900, 800, 600]) + end + + it "excludes incompatible investments" do investment1 = create(:budget_investment, :selected, heading: heading, price: 200, ballot_lines_count: 900, winner: false) investment2 = create(:budget_investment, :selected, heading: heading, price: 300, ballot_lines_count: 800, winner: false) investment3 = create(:budget_investment, :incompatible, heading: heading, price: 500, ballot_lines_count: 700, winner: false) From 1bb53b11fbf289b00b41a61ec5d52ca9bca7e2da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Sat, 21 Sep 2019 12:21:48 +0200 Subject: [PATCH 2/2] Add a test for an edge case calculating winners We weren't testing what happens if the next investment exceeds the budget, but the following one doesn't. --- spec/models/budget/result_spec.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/spec/models/budget/result_spec.rb b/spec/models/budget/result_spec.rb index b7b925b57..6ce990c52 100644 --- a/spec/models/budget/result_spec.rb +++ b/spec/models/budget/result_spec.rb @@ -18,6 +18,16 @@ describe Budget::Result do expect(heading.investments.winners.pluck(:ballot_lines_count)).to match_array([900, 800, 600]) end + it "selects cheaper investments when running out of budget" do + create(:budget_investment, :selected, heading: heading, price: 800, ballot_lines_count: 900) + create(:budget_investment, :selected, heading: heading, price: 300, ballot_lines_count: 800) + create(:budget_investment, :selected, heading: heading, price: 200, ballot_lines_count: 600) + + Budget::Result.new(budget, heading).calculate_winners + + expect(heading.investments.winners.pluck(:ballot_lines_count)).to match_array([900, 600]) + end + it "excludes incompatible investments" do investment1 = create(:budget_investment, :selected, heading: heading, price: 200, ballot_lines_count: 900, winner: false) investment2 = create(:budget_investment, :selected, heading: heading, price: 300, ballot_lines_count: 800, winner: false)