Files
grecia/spec/models/poll/voter_spec.rb
Javi Martín d410fcbc0e Split scope tests
In the scenario where we want to test scopes and use `match_array`, we
usually declare variables we never use, which raises a warning in the
Ruby interpreter (since the main cause for an unused variable is a
typo).

So I've decided to just split the tests into cases where every record is
returned and cases were no records are returned, just like we do in
other places.

There are several other options we've considered:

1. Don't declare unused variables, but declare the ones we use
2. Prefix unused variables with un underscore
3. Declare just one variable being an array containing all elements, and
access the elements using Array#[]
4. Don't declare any variables, and compare results against attributes
such as titles

None of these options was met with enthusiasm.
2019-09-30 15:46:58 +02:00

180 lines
5.2 KiB
Ruby

require "rails_helper"
describe Poll::Voter do
describe "validations" do
let(:poll) { create(:poll) }
let(:booth) { create(:poll_booth) }
let(:booth_assignment) { create(:poll_booth_assignment, poll: poll, booth: booth) }
let(:voter) { create(:poll_voter) }
let(:user) { create(:user, :level_two) }
it "is valid" do
expect(voter).to be_valid
end
it "is not valid without a user" do
voter.user = nil
expect(voter).not_to be_valid
end
it "is not valid without a poll" do
voter.poll = nil
expect(voter).not_to be_valid
end
it "is valid if has not voted" do
voter = build(:poll_voter, :valid_document)
expect(voter).to be_valid
end
it "is not valid if the user has already voted in the same poll or booth_assignment" do
voter1 = create(:poll_voter, user: user, poll: poll)
voter2 = build(:poll_voter, user: user, poll: poll)
expect(voter2).not_to be_valid
expect(voter2.errors.messages[:document_number]).to eq(["User has already voted"])
end
it "is not valid if the user has already voted in the same poll/booth" do
voter1 = create(:poll_voter, user: user, poll: poll, booth_assignment: booth_assignment)
voter2 = build(:poll_voter, user: user, poll: poll, booth_assignment: booth_assignment)
expect(voter2).not_to be_valid
expect(voter2.errors.messages[:document_number]).to eq(["User has already voted"])
end
it "is not valid if the user has already voted in different booth in the same poll" do
create(:poll_voter, :from_booth, user: user, poll: poll, booth: create(:poll_booth))
voter = build(:poll_voter, :from_booth, user: user, poll: poll, booth: booth)
expect(voter).not_to be_valid
expect(voter.errors.messages[:document_number]).to eq(["User has already voted"])
end
it "is valid if the user has already voted in the same booth in different poll" do
create(:poll_voter, :from_booth, user: user, booth: booth, poll: create(:poll))
voter = build(:poll_voter, :from_booth, user: user, booth: booth, poll: poll)
expect(voter).to be_valid
end
it "is not valid if the user has voted via web" do
answer = create(:poll_answer)
create(:poll_voter, :from_web, user: answer.author, poll: answer.poll)
voter = build(:poll_voter, poll: answer.question.poll, user: answer.author)
expect(voter).not_to be_valid
expect(voter.errors.messages[:document_number]).to eq(["User has already voted"])
end
context "origin" do
it "is not valid without an origin" do
voter.origin = nil
expect(voter).not_to be_valid
end
it "is not valid without a valid origin" do
voter.origin = "invalid_origin"
expect(voter).not_to be_valid
end
it "is valid with a booth origin" do
voter.origin = "booth"
voter.officer_assignment = create(:poll_officer_assignment)
expect(voter).to be_valid
end
it "is valid with a web origin" do
voter.origin = "web"
expect(voter).to be_valid
end
end
context "assignments" do
it "is not valid without a booth_assignment_id when origin is booth" do
voter.origin = "booth"
voter.booth_assignment_id = nil
expect(voter).not_to be_valid
end
it "is not valid without an officer_assignment_id when origin is booth" do
voter.origin = "booth"
voter.officer_assignment_id = nil
expect(voter).not_to be_valid
end
it "is valid without assignments when origin is web" do
voter.origin = "web"
voter.booth_assignment_id = nil
voter.officer_assignment_id = nil
expect(voter).to be_valid
end
end
end
describe "scopes" do
describe "#web" do
it "returns voters with a web origin" do
voter = create(:poll_voter, :from_web)
expect(Poll::Voter.web).to eq [voter]
end
it "does not return voters with a booth origin" do
create(:poll_voter, :from_booth)
expect(Poll::Voter.web).to be_empty
end
end
describe "#booth" do
it "returns voters with a booth origin" do
voter = create(:poll_voter, :from_booth)
expect(Poll::Voter.booth).to eq [voter]
end
it "does not return voters with a web origin" do
create(:poll_voter, :from_web)
expect(Poll::Voter.booth).to be_empty
end
end
end
describe "save" do
it "sets demographic info" do
geozone = create(:geozone)
user = create(:user,
geozone: geozone,
date_of_birth: 30.years.ago,
gender: "female")
voter = build(:poll_voter, user: user)
voter.save
expect(voter.geozone).to eq(geozone)
expect(voter.age).to eq(30)
expect(voter.gender).to eq("female")
end
it "sets user info" do
user = create(:user, document_number: "1234A", document_type: "1")
voter = build(:poll_voter, user: user, token: "1234abcd")
voter.save
expect(voter.document_number).to eq("1234A")
expect(voter.document_type).to eq("1")
expect(voter.token).to eq("1234abcd")
end
end
end