Keep a blank line before and after private Keep a blank line before and after protected Remove extra empty line at class body end Remove extra blank line Add final newline Use 2 (not 3) spaces for indentation Use 2 (not 4) spaces for indentation Remove space before comma Add space after comma Remove trailing whitespaces Remove unnecessary spacing Use snake_case for variable names Do not use then for multi-line if Remove unused block argument - i Use the new Ruby 1.9 hash syntax Remove unused assignment to variable Indent when as deep as case Align attributes Align end with def
367 lines
13 KiB
Ruby
367 lines
13 KiB
Ruby
require 'rails_helper'
|
|
|
|
describe SpendingProposal do
|
|
let(:spending_proposal) { build(:spending_proposal) }
|
|
|
|
it "should be valid" do
|
|
expect(spending_proposal).to be_valid
|
|
end
|
|
|
|
it "should not be valid without an author" do
|
|
spending_proposal.author = nil
|
|
expect(spending_proposal).to_not be_valid
|
|
end
|
|
|
|
describe "#title" do
|
|
it "should not be valid without a title" do
|
|
spending_proposal.title = nil
|
|
expect(spending_proposal).to_not be_valid
|
|
end
|
|
|
|
it "should not be valid when very short" do
|
|
spending_proposal.title = "abc"
|
|
expect(spending_proposal).to_not be_valid
|
|
end
|
|
|
|
it "should not be valid when very long" do
|
|
spending_proposal.title = "a" * 81
|
|
expect(spending_proposal).to_not be_valid
|
|
end
|
|
end
|
|
|
|
describe "#description" do
|
|
it "should be sanitized" do
|
|
spending_proposal.description = "<script>alert('danger');</script>"
|
|
spending_proposal.valid?
|
|
expect(spending_proposal.description).to eq("alert('danger');")
|
|
end
|
|
|
|
it "should not be valid when very long" do
|
|
spending_proposal.description = "a" * 6001
|
|
expect(spending_proposal).to_not be_valid
|
|
end
|
|
end
|
|
|
|
describe "#feasible_explanation" do
|
|
it "should be valid if valuation not finished" do
|
|
spending_proposal.feasible_explanation = ""
|
|
spending_proposal.valuation_finished = false
|
|
expect(spending_proposal).to be_valid
|
|
end
|
|
|
|
it "should be valid if valuation finished and feasible" do
|
|
spending_proposal.feasible_explanation = ""
|
|
spending_proposal.feasible = true
|
|
spending_proposal.valuation_finished = true
|
|
expect(spending_proposal).to be_valid
|
|
end
|
|
|
|
it "should not be valid if valuation finished and unfeasible" do
|
|
spending_proposal.feasible_explanation = ""
|
|
spending_proposal.feasible = false
|
|
spending_proposal.valuation_finished = true
|
|
expect(spending_proposal).to_not be_valid
|
|
end
|
|
end
|
|
|
|
describe "dossier info" do
|
|
describe "#feasibility" do
|
|
it "can be feasible" do
|
|
spending_proposal.feasible = true
|
|
expect(spending_proposal.feasibility).to eq "feasible"
|
|
end
|
|
|
|
it "can be not-feasible" do
|
|
spending_proposal.feasible = false
|
|
expect(spending_proposal.feasibility).to eq "not_feasible"
|
|
end
|
|
|
|
it "can be undefined" do
|
|
spending_proposal.feasible = nil
|
|
expect(spending_proposal.feasibility).to eq "undefined"
|
|
end
|
|
end
|
|
|
|
describe "#unfeasible?" do
|
|
it "returns true when not feasible" do
|
|
spending_proposal.feasible = false
|
|
expect(spending_proposal.unfeasible?).to eq true
|
|
end
|
|
|
|
it "returns false when feasible" do
|
|
spending_proposal.feasible = true
|
|
expect(spending_proposal.unfeasible?).to eq false
|
|
end
|
|
end
|
|
|
|
describe "#unfeasible_email_pending?" do
|
|
let(:spending_proposal) { create(:spending_proposal) }
|
|
|
|
it "returns true when marked as unfeasibable and valuation_finished" do
|
|
spending_proposal.update(feasible: false, valuation_finished: true)
|
|
expect(spending_proposal.unfeasible_email_pending?).to eq true
|
|
end
|
|
|
|
it "returns false when marked as feasible" do
|
|
spending_proposal.update(feasible: true)
|
|
expect(spending_proposal.unfeasible_email_pending?).to eq false
|
|
end
|
|
|
|
it "returns false when marked as feasable and valuation_finished" do
|
|
spending_proposal.update(feasible: true, valuation_finished: true)
|
|
expect(spending_proposal.unfeasible_email_pending?).to eq false
|
|
end
|
|
|
|
it "returns false when unfeasible email already sent" do
|
|
spending_proposal.update(unfeasible_email_sent_at: 1.day.ago)
|
|
expect(spending_proposal.unfeasible_email_pending?).to eq false
|
|
end
|
|
end
|
|
|
|
describe "#send_unfeasible_email" do
|
|
let(:spending_proposal) { create(:spending_proposal) }
|
|
|
|
it "sets the time when the unfeasible email was sent" do
|
|
expect(spending_proposal.unfeasible_email_sent_at).to_not be
|
|
spending_proposal.send_unfeasible_email
|
|
expect(spending_proposal.unfeasible_email_sent_at).to be
|
|
end
|
|
|
|
it "send an email" do
|
|
expect {spending_proposal.send_unfeasible_email}.to change { ActionMailer::Base.deliveries.count }.by(1)
|
|
end
|
|
end
|
|
|
|
describe "#code" do
|
|
let(:spending_proposal) { create(:spending_proposal) }
|
|
|
|
it "returns the proposal id" do
|
|
expect(spending_proposal.code).to include("#{spending_proposal.id}")
|
|
end
|
|
|
|
it "returns the administrator id when assigned" do
|
|
spending_proposal.administrator = create(:administrator)
|
|
expect(spending_proposal.code).to include("#{spending_proposal.id}-A#{spending_proposal.administrator.id}")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "by_admin" do
|
|
it "should return spending proposals assigned to specific administrator" do
|
|
spending_proposal1 = create(:spending_proposal, administrator_id: 33)
|
|
spending_proposal2 = create(:spending_proposal)
|
|
|
|
by_admin = SpendingProposal.by_admin(33)
|
|
|
|
expect(by_admin.size).to eq(1)
|
|
expect(by_admin.first).to eq(spending_proposal1)
|
|
end
|
|
end
|
|
|
|
describe "by_valuator" do
|
|
it "should return spending proposals assigned to specific valuator" do
|
|
spending_proposal1 = create(:spending_proposal)
|
|
spending_proposal2 = create(:spending_proposal)
|
|
spending_proposal3 = create(:spending_proposal)
|
|
|
|
valuator1 = create(:valuator)
|
|
valuator2 = create(:valuator)
|
|
|
|
spending_proposal1.valuators << valuator1
|
|
spending_proposal2.valuators << valuator2
|
|
spending_proposal3.valuators << [valuator1, valuator2]
|
|
|
|
by_valuator = SpendingProposal.by_valuator(valuator1.id)
|
|
|
|
expect(by_valuator.size).to eq(2)
|
|
expect(by_valuator.sort).to eq([spending_proposal1, spending_proposal3].sort)
|
|
end
|
|
end
|
|
|
|
describe "scopes" do
|
|
describe "valuation_open" do
|
|
it "should return all spending proposals with false valuation_finished" do
|
|
spending_proposal1 = create(:spending_proposal, valuation_finished: true)
|
|
spending_proposal2 = create(:spending_proposal)
|
|
|
|
valuation_open = SpendingProposal.valuation_open
|
|
|
|
expect(valuation_open.size).to eq(1)
|
|
expect(valuation_open.first).to eq(spending_proposal2)
|
|
end
|
|
end
|
|
|
|
describe "without_admin" do
|
|
it "should return all open spending proposals without assigned admin" do
|
|
spending_proposal1 = create(:spending_proposal, valuation_finished: true)
|
|
spending_proposal2 = create(:spending_proposal, administrator: create(:administrator))
|
|
spending_proposal3 = create(:spending_proposal)
|
|
|
|
without_admin = SpendingProposal.without_admin
|
|
|
|
expect(without_admin.size).to eq(1)
|
|
expect(without_admin.first).to eq(spending_proposal3)
|
|
end
|
|
end
|
|
|
|
describe "managed" do
|
|
it "should return all open spending proposals with assigned admin but without assigned valuators" do
|
|
spending_proposal1 = create(:spending_proposal, administrator: create(:administrator))
|
|
spending_proposal2 = create(:spending_proposal, administrator: create(:administrator), valuation_finished: true)
|
|
spending_proposal3 = create(:spending_proposal, administrator: create(:administrator))
|
|
spending_proposal1.valuators << create(:valuator)
|
|
|
|
managed = SpendingProposal.managed
|
|
|
|
expect(managed.size).to eq(1)
|
|
expect(managed.first).to eq(spending_proposal3)
|
|
end
|
|
end
|
|
|
|
describe "valuating" do
|
|
it "should return all spending proposals with assigned valuator but valuation not finished" do
|
|
spending_proposal1 = create(:spending_proposal)
|
|
spending_proposal2 = create(:spending_proposal)
|
|
spending_proposal3 = create(:spending_proposal, valuation_finished: true)
|
|
|
|
spending_proposal2.valuators << create(:valuator)
|
|
spending_proposal3.valuators << create(:valuator)
|
|
|
|
valuating = SpendingProposal.valuating
|
|
|
|
expect(valuating.size).to eq(1)
|
|
expect(valuating.first).to eq(spending_proposal2)
|
|
end
|
|
end
|
|
|
|
describe "valuation_finished" do
|
|
it "should return all spending proposals with valuation finished" do
|
|
spending_proposal1 = create(:spending_proposal)
|
|
spending_proposal2 = create(:spending_proposal)
|
|
spending_proposal3 = create(:spending_proposal, valuation_finished: true)
|
|
|
|
spending_proposal2.valuators << create(:valuator)
|
|
spending_proposal3.valuators << create(:valuator)
|
|
|
|
valuation_finished = SpendingProposal.valuation_finished
|
|
|
|
expect(valuation_finished.size).to eq(1)
|
|
expect(valuation_finished.first).to eq(spending_proposal3)
|
|
end
|
|
end
|
|
|
|
describe "feasible" do
|
|
it "should return all feasible spending proposals" do
|
|
feasible_spending_proposal = create(:spending_proposal, feasible: true)
|
|
create(:spending_proposal)
|
|
|
|
expect(SpendingProposal.feasible).to eq [feasible_spending_proposal]
|
|
end
|
|
end
|
|
|
|
describe "unfeasible" do
|
|
it "should return all unfeasible spending proposals" do
|
|
unfeasible_spending_proposal = create(:spending_proposal, feasible: false)
|
|
create(:spending_proposal, feasible: true)
|
|
|
|
expect(SpendingProposal.unfeasible).to eq [unfeasible_spending_proposal]
|
|
end
|
|
end
|
|
|
|
describe "not_unfeasible" do
|
|
it "should return all not unfeasible spending proposals" do
|
|
not_unfeasible_spending_proposal_1 = create(:spending_proposal, feasible: true)
|
|
not_unfeasible_spending_proposal_2 = create(:spending_proposal)
|
|
create(:spending_proposal, feasible: false)
|
|
|
|
not_unfeasibles = SpendingProposal.not_unfeasible
|
|
|
|
expect(not_unfeasibles.size).to eq(2)
|
|
expect(not_unfeasibles.include?(not_unfeasible_spending_proposal_1)).to eq(true)
|
|
expect(not_unfeasibles.include?(not_unfeasible_spending_proposal_2)).to eq(true)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'Supports' do
|
|
let(:user) { create(:user, :level_two) }
|
|
let(:luser) { create(:user) }
|
|
let(:district) { create(:geozone) }
|
|
let(:city_sp) { create(:spending_proposal) }
|
|
let(:district_sp) { create(:spending_proposal, geozone: district) }
|
|
|
|
describe '#reason_for_not_being_votable_by' do
|
|
it "rejects not logged in users" do
|
|
expect(city_sp.reason_for_not_being_votable_by(nil)).to eq(:not_logged_in)
|
|
expect(district_sp.reason_for_not_being_votable_by(nil)).to eq(:not_logged_in)
|
|
end
|
|
|
|
it "rejects not verified users" do
|
|
expect(city_sp.reason_for_not_being_votable_by(luser)).to eq(:not_verified)
|
|
expect(district_sp.reason_for_not_being_votable_by(luser)).to eq(:not_verified)
|
|
end
|
|
|
|
it "rejects unfeasible spending proposals" do
|
|
unfeasible = create(:spending_proposal, feasible: false, valuation_finished: true)
|
|
expect(unfeasible.reason_for_not_being_votable_by(user)).to eq(:unfeasible)
|
|
end
|
|
|
|
it "rejects organizations" do
|
|
create(:organization, user: user)
|
|
expect(city_sp.reason_for_not_being_votable_by(user)).to eq(:organization)
|
|
expect(district_sp.reason_for_not_being_votable_by(user)).to eq(:organization)
|
|
end
|
|
|
|
it "rejects votes when voting is not allowed (via admin setting)" do
|
|
Setting["feature.spending_proposal_features.voting_allowed"] = nil
|
|
expect(city_sp.reason_for_not_being_votable_by(user)).to eq(:not_voting_allowed)
|
|
expect(district_sp.reason_for_not_being_votable_by(user)).to eq(:not_voting_allowed)
|
|
end
|
|
|
|
it "accepts valid votes when voting is allowed" do
|
|
Setting["feature.spending_proposal_features.voting_allowed"] = true
|
|
expect(city_sp.reason_for_not_being_votable_by(user)).to be_nil
|
|
expect(district_sp.reason_for_not_being_votable_by(user)).to be_nil
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "responsible_name" do
|
|
let(:user) { create(:user, document_number: "123456") }
|
|
let!(:spending_proposal) { create(:spending_proposal, author: user) }
|
|
|
|
it "gets updated with the document_number" do
|
|
expect(spending_proposal.responsible_name).to eq("123456")
|
|
end
|
|
|
|
it "does not get updated if the user is erased" do
|
|
user.erase
|
|
expect(user.document_number).to be_blank
|
|
spending_proposal.touch
|
|
expect(spending_proposal.responsible_name).to eq("123456")
|
|
end
|
|
end
|
|
|
|
describe "total votes" do
|
|
it "takes into account physical votes in addition to web votes" do
|
|
sp = create(:spending_proposal)
|
|
sp.register_vote(create(:user, :level_two), true)
|
|
expect(sp.total_votes).to eq(1)
|
|
sp.physical_votes = 10
|
|
expect(sp.total_votes).to eq(11)
|
|
end
|
|
end
|
|
|
|
describe "#with_supports" do
|
|
it "should return proposals with supports" do
|
|
sp1 = create(:spending_proposal)
|
|
sp2 = create(:spending_proposal)
|
|
create(:vote, votable: sp1)
|
|
|
|
expect(SpendingProposal.with_supports).to include(sp1)
|
|
expect(SpendingProposal.with_supports).to_not include(sp2)
|
|
end
|
|
end
|
|
|
|
end
|