adds Budget::Group model to group headings
many refactors through budget related models
This commit is contained in:
@@ -65,7 +65,13 @@ describe "Abilities::Administrator" do
|
||||
it { should be_able_to(:update, Budget::Investment) }
|
||||
it { should be_able_to(:hide, Budget::Investment) }
|
||||
|
||||
it { should be_able_to(:valuate, create(:budget_investment, budget: create(:budget, valuating: true))) }
|
||||
it { should_not be_able_to(:valuate, create(:budget_investment, budget: create(:budget, valuating: false))) }
|
||||
it { should be_able_to(:valuate, create(:budget_investment,
|
||||
heading: create(:budget_heading,
|
||||
group: create(:budget_group,
|
||||
budget: create(:budget, valuating: true))))) }
|
||||
it { should_not be_able_to(:valuate, create(:budget_investment,
|
||||
heading: create(:budget_heading,
|
||||
group: create(:budget_group,
|
||||
budget: create(:budget, valuating: false))))) }
|
||||
|
||||
end
|
||||
|
||||
@@ -12,9 +12,16 @@ describe "Abilities::Common" do
|
||||
let(:accepting_budget) { create(:budget, phase: 'accepting') }
|
||||
let(:selecting_budget) { create(:budget, phase: 'selecting') }
|
||||
let(:balloting_budget) { create(:budget, phase: 'balloting') }
|
||||
let(:investment_in_accepting_budget) { create(:budget_investment, budget: accepting_budget) }
|
||||
let(:investment_in_selecting_budget) { create(:budget_investment, budget: selecting_budget) }
|
||||
let(:investment_in_balloting_budget) { create(:budget_investment, budget: balloting_budget) }
|
||||
let(:accepting_budget_group) { create(:budget_group, budget: accepting_budget) }
|
||||
let(:selecting_budget_group) { create(:budget_group, budget: selecting_budget) }
|
||||
let(:balloting_budget_group) { create(:budget_group, budget: balloting_budget) }
|
||||
let(:accepting_budget_heading) { create(:budget_heading, group: accepting_budget_group) }
|
||||
let(:selecting_budget_heading) { create(:budget_heading, group: selecting_budget_group) }
|
||||
let(:balloting_budget_heading) { create(:budget_heading, group: balloting_budget_group) }
|
||||
|
||||
let(:investment_in_accepting_budget) { create(:budget_investment, heading: accepting_budget_heading) }
|
||||
let(:investment_in_selecting_budget) { create(:budget_investment, heading: selecting_budget_heading) }
|
||||
let(:investment_in_balloting_budget) { create(:budget_investment, heading: balloting_budget_heading) }
|
||||
let(:ballot_in_accepting_budget) { create(:budget_ballot, budget: accepting_budget) }
|
||||
let(:ballot_in_selecting_budget) { create(:budget_ballot, budget: selecting_budget) }
|
||||
let(:ballot_in_balloting_budget) { create(:budget_ballot, budget: balloting_budget) }
|
||||
|
||||
@@ -7,10 +7,16 @@ describe "Abilities::Valuator" do
|
||||
let(:valuator) { create(:valuator) }
|
||||
let(:non_assigned_investment) { create(:budget_investment) }
|
||||
|
||||
let(:assigned_investment) { create(:budget_investment, budget: create(:budget, valuating: true)) }
|
||||
let(:assigned_investment) { create(:budget_investment,
|
||||
heading: create(:budget_heading,
|
||||
group: create(:budget_group,
|
||||
budget: create(:budget, valuating: true)))) }
|
||||
before(:each) { assigned_investment.valuators << valuator }
|
||||
|
||||
let(:assigned_investment_not_valuating) { create(:budget_investment, budget: create(:budget, valuating: false)) }
|
||||
let(:assigned_investment_not_valuating) { create(:budget_investment,
|
||||
heading: create(:budget_heading,
|
||||
group: create(:budget_group,
|
||||
budget: create(:budget, valuating: false)))) }
|
||||
before(:each) { assigned_investment_not_valuating.valuators << valuator }
|
||||
|
||||
it { should be_able_to(:read, SpendingProposal) }
|
||||
|
||||
@@ -21,18 +21,15 @@ describe Budget::Ballot do
|
||||
heading = create(:budget_heading)
|
||||
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)
|
||||
inv3 = create(:budget_investment, :feasible, price: 40000, heading: heading)
|
||||
|
||||
ballot = create(:budget_ballot)
|
||||
ballot.investments << inv1
|
||||
ballot.investments << inv2
|
||||
ballot.investments << inv3
|
||||
|
||||
expect(ballot.amount_spent(heading.id)).to eq 10000
|
||||
expect(ballot.amount_spent(nil)).to eq 25000
|
||||
|
||||
ballot.investments << inv4
|
||||
ballot.investments << inv3
|
||||
|
||||
expect(ballot.amount_spent(heading.id)).to eq 50000
|
||||
end
|
||||
@@ -40,28 +37,22 @@ describe Budget::Ballot do
|
||||
|
||||
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)
|
||||
budget = create(:budget)
|
||||
group = create(:budget_group, budget: budget)
|
||||
heading = create(:budget_heading, group: group, price: 1000)
|
||||
inv1 = create(:budget_investment, :feasible, price: 100, heading: heading)
|
||||
inv2 = create(:budget_investment, :feasible, price: 200, heading: create(:budget_heading))
|
||||
inv3 = create(:budget_investment, :feasible, price: 400, heading: heading)
|
||||
|
||||
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
|
||||
expect(ballot.amount_available(heading)).to eq 900
|
||||
|
||||
ballot.investments << inv3
|
||||
ballot.investments << inv4
|
||||
|
||||
expect(ballot.amount_available(heading)).to eq 960000
|
||||
expect(ballot.amount_available(nil)).to eq 145000
|
||||
expect(ballot.amount_available(heading)).to eq 500
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -190,38 +190,33 @@ describe Budget::Investment do
|
||||
|
||||
describe 'Permissions' do
|
||||
let(:budget) { create(:budget) }
|
||||
let(:heading) { create(:budget_heading, budget: budget) }
|
||||
let(:group) { create(:budget_group, budget: budget) }
|
||||
let(:heading) { create(:budget_heading, group: group) }
|
||||
let(:user) { create(:user, :level_two) }
|
||||
let(:luser) { create(:user) }
|
||||
let(:city_sp) { create(:budget_investment, budget: budget) }
|
||||
let(:district_sp) { create(:budget_investment, budget: budget, heading: heading) }
|
||||
let(:district_sp) { create(:budget_investment, heading: heading) }
|
||||
|
||||
describe '#reason_for_not_being_selectable_by' do
|
||||
it "rejects not logged in users" do
|
||||
expect(city_sp.reason_for_not_being_selectable_by(nil)).to eq(:not_logged_in)
|
||||
expect(district_sp.reason_for_not_being_selectable_by(nil)).to eq(:not_logged_in)
|
||||
end
|
||||
|
||||
it "rejects not verified users" do
|
||||
expect(city_sp.reason_for_not_being_selectable_by(luser)).to eq(:not_verified)
|
||||
expect(district_sp.reason_for_not_being_selectable_by(luser)).to eq(:not_verified)
|
||||
end
|
||||
|
||||
it "rejects organizations" do
|
||||
create(:organization, user: user)
|
||||
expect(city_sp.reason_for_not_being_selectable_by(user)).to eq(:organization)
|
||||
expect(district_sp.reason_for_not_being_selectable_by(user)).to eq(:organization)
|
||||
end
|
||||
|
||||
it "rejects selections when selecting is not allowed (via admin setting)" do
|
||||
budget.phase = "on_hold"
|
||||
expect(city_sp.reason_for_not_being_selectable_by(user)).to eq(:no_selecting_allowed)
|
||||
expect(district_sp.reason_for_not_being_selectable_by(user)).to eq(:no_selecting_allowed)
|
||||
end
|
||||
|
||||
it "accepts valid selections when selecting is allowed" do
|
||||
budget.phase = "selecting"
|
||||
expect(city_sp.reason_for_not_being_selectable_by(user)).to be_nil
|
||||
expect(district_sp.reason_for_not_being_selectable_by(user)).to be_nil
|
||||
end
|
||||
end
|
||||
@@ -274,7 +269,9 @@ describe Budget::Investment do
|
||||
describe "total votes" do
|
||||
it "takes into account physical votes in addition to web votes" do
|
||||
b = create(:budget, :selecting)
|
||||
sp = create(:budget_investment, budget: b)
|
||||
g = create(:budget_group, budget: b)
|
||||
h = create(:budget_heading, group: g)
|
||||
sp = create(:budget_investment, heading: h)
|
||||
|
||||
sp.register_selection(create(:user, :level_two))
|
||||
expect(sp.total_votes).to eq(1)
|
||||
@@ -299,56 +296,52 @@ describe Budget::Investment do
|
||||
|
||||
describe 'Permissions' do
|
||||
let(:budget) { create(:budget) }
|
||||
let(:heading) { create(:budget_heading, budget: budget) }
|
||||
let(:group) { create(:budget_group, budget: budget) }
|
||||
let(:heading) { create(:budget_heading, group: group) }
|
||||
let(:user) { create(:user, :level_two) }
|
||||
let(:luser) { create(:user) }
|
||||
let(:ballot) { create(:budget_ballot, budget: budget) }
|
||||
let(:city_sp) { create(:budget_investment, budget: budget) }
|
||||
let(:district_sp) { create(:budget_investment, budget: budget, heading: heading) }
|
||||
let(:investment) { create(:budget_investment, heading: heading) }
|
||||
|
||||
describe '#reason_for_not_being_ballotable_by' do
|
||||
it "rejects not logged in users" do
|
||||
expect(city_sp.reason_for_not_being_ballotable_by(nil, ballot)).to eq(:not_logged_in)
|
||||
expect(district_sp.reason_for_not_being_ballotable_by(nil, ballot)).to eq(:not_logged_in)
|
||||
expect(investment.reason_for_not_being_ballotable_by(nil, ballot)).to eq(:not_logged_in)
|
||||
end
|
||||
|
||||
it "rejects not verified users" do
|
||||
expect(city_sp.reason_for_not_being_ballotable_by(luser, ballot)).to eq(:not_verified)
|
||||
expect(district_sp.reason_for_not_being_ballotable_by(luser, ballot)).to eq(:not_verified)
|
||||
expect(investment.reason_for_not_being_ballotable_by(luser, ballot)).to eq(:not_verified)
|
||||
end
|
||||
|
||||
it "rejects organizations" do
|
||||
create(:organization, user: user)
|
||||
expect(city_sp.reason_for_not_being_ballotable_by(user, ballot)).to eq(:organization)
|
||||
expect(district_sp.reason_for_not_being_ballotable_by(user, ballot)).to eq(:organization)
|
||||
expect(investment.reason_for_not_being_ballotable_by(user, ballot)).to eq(:organization)
|
||||
end
|
||||
|
||||
it "rejects votes when voting is not allowed (via admin setting)" do
|
||||
budget.phase = "on_hold"
|
||||
expect(city_sp.reason_for_not_being_ballotable_by(user, ballot)).to eq(:no_ballots_allowed)
|
||||
expect(district_sp.reason_for_not_being_ballotable_by(user, ballot)).to eq(:no_ballots_allowed)
|
||||
expect(investment.reason_for_not_being_ballotable_by(user, ballot)).to eq(:no_ballots_allowed)
|
||||
end
|
||||
|
||||
it "accepts valid ballots when voting is allowed" do
|
||||
budget.phase = "balloting"
|
||||
expect(city_sp.reason_for_not_being_ballotable_by(user, ballot)).to be_nil
|
||||
expect(district_sp.reason_for_not_being_ballotable_by(user, ballot)).to be_nil
|
||||
expect(investment.reason_for_not_being_ballotable_by(user, ballot)).to be_nil
|
||||
end
|
||||
|
||||
it "accepts valid district selections" do
|
||||
budget.phase = "selecting"
|
||||
expect(district_sp.reason_for_not_being_selectable_by(user)).to be_nil
|
||||
expect(investment.reason_for_not_being_selectable_by(user)).to be_nil
|
||||
ballot.heading_id = heading.id
|
||||
expect(district_sp.reason_for_not_being_selectable_by(user)).to be_nil
|
||||
expect(investment.reason_for_not_being_selectable_by(user)).to be_nil
|
||||
end
|
||||
|
||||
it "rejects users with different headings" do
|
||||
budget.phase = "balloting"
|
||||
california = create(:budget_heading, budget: budget)
|
||||
new_york = create(:budget_heading, budget: budget)
|
||||
group = create(:budget_group, budget: budget)
|
||||
california = create(:budget_heading, group: group)
|
||||
new_york = create(:budget_heading, group: group)
|
||||
|
||||
sp1 = create(:budget_investment, :feasible, heading: california, budget: budget)
|
||||
sp2 = create(:budget_investment, :feasible, heading: new_york, budget: budget)
|
||||
sp1 = create(:budget_investment, :feasible, heading: california)
|
||||
sp2 = create(:budget_investment, :feasible, heading: new_york)
|
||||
b = create(:budget_ballot, user: user, heading: california, investments: [sp1])
|
||||
|
||||
expect(sp2.reason_for_not_being_ballotable_by(user, b)).to eq(:different_heading_assigned)
|
||||
@@ -356,9 +349,10 @@ describe Budget::Investment do
|
||||
|
||||
it "rejects proposals with price higher than current available money" do
|
||||
budget.phase = "balloting"
|
||||
carabanchel = create(:budget_heading, budget: budget, price: 35)
|
||||
sp1 = create(:budget_investment, :feasible, heading: carabanchel, price: 30, budget: budget)
|
||||
sp2 = create(:budget_investment, :feasible, heading: carabanchel, price: 10, budget: budget)
|
||||
distritos = create(:budget_group, budget: budget)
|
||||
carabanchel = create(:budget_heading, group: distritos, price: 35)
|
||||
sp1 = create(:budget_investment, :feasible, heading: carabanchel, price: 30)
|
||||
sp2 = create(:budget_investment, :feasible, heading: carabanchel, price: 10)
|
||||
ballot = create(:budget_ballot, user: user, heading: carabanchel, investments: [sp1])
|
||||
|
||||
expect(sp2.reason_for_not_being_ballotable_by(user, ballot)).to eq(:not_enough_money)
|
||||
|
||||
@@ -33,14 +33,11 @@ describe Budget do
|
||||
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
|
||||
let(:budget) { create(:budget) }
|
||||
let(:group) { create(:budget_group, budget: budget) }
|
||||
|
||||
it "returns the heading price if the heading provided is part of the budget" do
|
||||
heading = create(:budget_heading, price: 100, budget: budget)
|
||||
heading = create(:budget_heading, price: 100, group: group)
|
||||
expect(budget.heading_price(heading)).to eq(100)
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user