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
4.1 KiB
Ruby
131 lines
4.1 KiB
Ruby
require "rails_helper"
|
|
|
|
describe Poll::Shift do
|
|
let(:poll) { create(:poll) }
|
|
let(:booth) { create(:poll_booth) }
|
|
let(:user) { create(:user, username: "Ana", email: "ana@example.com") }
|
|
let(:officer) { create(:poll_officer, user: user) }
|
|
let(:recount_shift) do
|
|
build(:poll_shift, booth: booth, officer: officer, date: Date.current, task: :recount_scrutiny)
|
|
end
|
|
|
|
describe "validations" do
|
|
let(:shift) { build(:poll_shift) }
|
|
|
|
it "is valid" do
|
|
expect(shift).to be_valid
|
|
end
|
|
|
|
it "is not valid without a booth" do
|
|
shift.booth = nil
|
|
expect(shift).not_to be_valid
|
|
end
|
|
|
|
it "is not valid without an officer" do
|
|
shift.officer = nil
|
|
expect(shift).not_to be_valid
|
|
end
|
|
|
|
it "is not valid without a date" do
|
|
shift.date = nil
|
|
expect(shift).not_to be_valid
|
|
end
|
|
|
|
it "is not valid without a task" do
|
|
shift.task = nil
|
|
expect(shift).not_to be_valid
|
|
end
|
|
|
|
it "is not valid with same booth, officer, date and task" do
|
|
recount_shift.save!
|
|
|
|
expect(build(:poll_shift, booth: booth,
|
|
officer: officer,
|
|
date: Date.current,
|
|
task: :recount_scrutiny)).not_to be_valid
|
|
end
|
|
|
|
it "is valid with same booth, officer and date but different task" do
|
|
recount_shift.save!
|
|
|
|
expect(build(:poll_shift, booth: booth,
|
|
officer: officer,
|
|
date: Date.current,
|
|
task: :vote_collection)).to be_valid
|
|
end
|
|
|
|
it "is valid with same booth, officer and task but different date" do
|
|
recount_shift.save!
|
|
|
|
expect(build(:poll_shift, booth: booth,
|
|
officer: officer,
|
|
date: Date.tomorrow,
|
|
task: :recount_scrutiny)).to be_valid
|
|
end
|
|
end
|
|
|
|
describe "officer_assignments" do
|
|
it "creates and destroy corresponding officer_assignments" do
|
|
booth_assignment1 = create(:poll_booth_assignment, booth: booth)
|
|
booth_assignment2 = create(:poll_booth_assignment, booth: booth)
|
|
|
|
expect do
|
|
create(:poll_shift, booth: booth, officer: officer, date: Date.current)
|
|
end.to change { Poll::OfficerAssignment.all.count }.by(2)
|
|
|
|
officer_assignments = Poll::OfficerAssignment.all
|
|
oa1 = officer_assignments.first
|
|
oa2 = officer_assignments.second
|
|
|
|
expect(oa1.officer).to eq(officer)
|
|
expect(oa1.date).to eq(Date.current)
|
|
expect(oa1.booth_assignment).to eq(booth_assignment1)
|
|
expect(oa1.final).to be_falsey
|
|
|
|
expect(oa2.officer).to eq(officer)
|
|
expect(oa2.date).to eq(Date.current)
|
|
expect(oa2.booth_assignment).to eq(booth_assignment2)
|
|
expect(oa2.final).to be_falsey
|
|
|
|
create(:poll_officer_assignment, officer: officer,
|
|
booth_assignment: booth_assignment1,
|
|
date: Date.tomorrow)
|
|
|
|
expect { Poll::Shift.last.destroy }.to change { Poll::OfficerAssignment.all.count }.by(-2)
|
|
end
|
|
|
|
it "creates final officer_assignments" do
|
|
booth_assignment = create(:poll_booth_assignment, poll: poll, booth: booth)
|
|
recount_shift.save!
|
|
|
|
officer_assignments = Poll::OfficerAssignment.all
|
|
expect(officer_assignments.count).to eq(1)
|
|
|
|
officer_assignment = officer_assignments.first
|
|
|
|
expect(officer_assignment.officer).to eq(officer)
|
|
expect(officer_assignment.date).to eq(Date.current)
|
|
expect(officer_assignment.booth_assignment).to eq(booth_assignment)
|
|
expect(officer_assignment.final).to be_truthy
|
|
end
|
|
end
|
|
|
|
describe "#persist_data" do
|
|
let(:shift) { create(:poll_shift, officer: officer, booth: booth) }
|
|
|
|
it "maintains officer data after destroying associated user" do
|
|
shift.officer.user.destroy!
|
|
|
|
expect(shift.officer_name).to eq "Ana"
|
|
expect(shift.officer_email).to eq "ana@example.com"
|
|
end
|
|
|
|
it "maintains officer data after destroying officer role" do
|
|
shift.officer.destroy!
|
|
|
|
expect(shift.officer_name).to eq "Ana"
|
|
expect(shift.officer_email).to eq "ana@example.com"
|
|
end
|
|
end
|
|
end
|