spec/models/poll/ballot_spec.rb
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