Note we're excluding a few files: * Configuration files that weren't generated by us * Migration files that weren't generated by us * The Gemfile, since it includes an important comment that must be on the same line as the gem declaration * The Budget::Stats class, since the heading statistics are a mess and having shorter lines would require a lot of refactoring
131 lines
5.1 KiB
Ruby
131 lines
5.1 KiB
Ruby
require "rails_helper"
|
|
|
|
describe Poll::Ballot do
|
|
let(:budget) { create(:budget) }
|
|
let(:group) { create(:budget_group, budget: budget) }
|
|
let(:heading) { create(:budget_heading, group: group, price: 10000000) }
|
|
let(:investment) { create(:budget_investment, :selected, price: 5000000, heading: heading) }
|
|
let(:poll) { create(:poll, budget: budget) }
|
|
let(:poll_ballot_sheet) { create(:poll_ballot_sheet, poll: poll) }
|
|
let(:poll_ballot) do
|
|
create(:poll_ballot, ballot_sheet: poll_ballot_sheet, external_id: 1, data: investment.id)
|
|
end
|
|
before { create(:budget_ballot, budget: budget, physical: true, poll_ballot: poll_ballot) }
|
|
|
|
describe "#verify" do
|
|
it "adds ballot lines until there are sufficiente funds" do
|
|
investment2 = create(:budget_investment, :selected, price: 2000000, heading: heading)
|
|
investment3 = create(:budget_investment, :selected, price: 2000000, heading: heading)
|
|
investment4 = create(:budget_investment, :selected, price: 2000000, heading: heading)
|
|
|
|
poll_ballot.update!(data: [investment.id, investment2.id, investment3.id, investment4.id].join(","))
|
|
poll_ballot.verify
|
|
|
|
expect(poll_ballot.ballot.investment_ids).to match_array [investment.id, investment2.id, investment3.id]
|
|
end
|
|
|
|
it "adds ballot lines if they are from valid headings" do
|
|
other_heading = create(:budget_heading, group: group, price: 10000000)
|
|
|
|
investment2 = create(:budget_investment, :selected, price: 2000000, heading: heading)
|
|
investment3 = create(:budget_investment, :selected, price: 2000000, heading: heading)
|
|
investment4 = create(:budget_investment, :selected, price: 2000000, heading: other_heading)
|
|
|
|
poll_ballot.update!(data: [investment.id, investment2.id, investment3.id, investment4.id].join(","))
|
|
poll_ballot.verify
|
|
|
|
expect(poll_ballot.ballot.investment_ids).to match_array [investment.id, investment2.id, investment3.id]
|
|
end
|
|
|
|
it "adds ballot lines if they are from selectable" do
|
|
investment2 = create(:budget_investment, :selected, price: 2000000, heading: heading)
|
|
investment3 = create(:budget_investment, :selected, price: 2000000, heading: heading)
|
|
investment4 = create(:budget_investment, price: 2000000, heading: heading)
|
|
|
|
poll_ballot.update!(data: [investment.id, investment2.id, investment3.id, investment4.id].join(","))
|
|
poll_ballot.verify
|
|
|
|
expect(poll_ballot.ballot.investment_ids).to match_array [investment.id, investment2.id, investment3.id]
|
|
end
|
|
end
|
|
|
|
describe "#add_investment" do
|
|
describe "Money" do
|
|
it "is not valid if insufficient funds" do
|
|
investment.update!(price: heading.price + 1)
|
|
expect(poll_ballot.add_investment(investment.id)).to be(false)
|
|
end
|
|
|
|
it "is valid if sufficient funds" do
|
|
investment.update!(price: heading.price - 1)
|
|
expect(poll_ballot.add_investment(investment.id)).to be(true)
|
|
end
|
|
end
|
|
|
|
describe "Heading" do
|
|
it "is not valid if investment heading is not valid" do
|
|
expect(poll_ballot.add_investment(investment.id)).to be(true)
|
|
|
|
other_heading = create(:budget_heading, group: group, price: 10000000)
|
|
other_investment = create(:budget_investment, :selected, price: 1000000, heading: other_heading)
|
|
|
|
expect(poll_ballot.add_investment(other_investment.id)).to be(false)
|
|
end
|
|
|
|
it "is valid if investment heading is valid" do
|
|
expect(poll_ballot.add_investment(investment.id)).to be(true)
|
|
|
|
other_investment = create(:budget_investment, :selected, price: 1000000, heading: heading)
|
|
|
|
expect(poll_ballot.add_investment(other_investment.id)).to be(true)
|
|
end
|
|
end
|
|
|
|
describe "Selectibility" do
|
|
it "is not valid if investment is unselected" do
|
|
investment.update!(selected: false)
|
|
expect(poll_ballot.add_investment(investment.id)).to be(false)
|
|
end
|
|
|
|
it "is valid if investment is selected" do
|
|
investment.update!(selected: true, price: 20000)
|
|
expect(poll_ballot.add_investment(investment.id)).to be(true)
|
|
end
|
|
end
|
|
|
|
describe "Budget" do
|
|
it "is not valid if investment belongs to a different budget" do
|
|
other_budget = create(:budget)
|
|
investment.update!(budget: other_budget)
|
|
expect(poll_ballot.add_investment(investment.id)).to be(nil)
|
|
end
|
|
|
|
it "is valid if investment belongs to the poll's budget" do
|
|
expect(poll_ballot.add_investment(investment.id)).to be(true)
|
|
end
|
|
end
|
|
|
|
describe "Already added" do
|
|
it "is not valid if already exists" do
|
|
poll_ballot.add_investment(investment.id)
|
|
expect(poll_ballot.add_investment(investment.id)).to be(nil)
|
|
end
|
|
|
|
it "is valid if does not already exist" do
|
|
expect(poll_ballot.add_investment(investment.id)).to be(true)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#find_investment" do
|
|
it "returns the investment if found" do
|
|
expect(poll_ballot.find_investment(investment.id)).to eq(investment)
|
|
end
|
|
|
|
it "finds investments with trailing zeros" do
|
|
expect(poll_ballot.find_investment("0#{investment.id}")).to eq(investment)
|
|
expect(poll_ballot.find_investment("00#{investment.id}")).to eq(investment)
|
|
end
|
|
end
|
|
end
|