spec/factories/polls.rb
FactoryBot.define do
factory :poll do
sequence(:name) { |n| "Poll #{SecureRandom.hex}" }
slug { "this-is-a-slug" }
starts_at { 1.month.ago }
ends_at { 1.month.from_now }
to_create { |poll| poll.save(validate: false) }
trait :expired do
starts_at { 1.month.ago }
ends_at { 15.days.ago }
end
trait :old do
starts_at { 3.months.ago }
ends_at { 2.months.ago }
end
trait :future do
starts_at { 1.day.from_now }
end
trait :published do
published { true }
end
trait :hidden do
hidden_at { Time.current }
end
trait :for_budget do
budget
end
trait :with_image do
after(:create) { |poll| create(:image, imageable: poll) }
end
trait :with_author do
author factory: :user
end
transient { officers { [] } }
after(:create) do |poll, evaluator|
evaluator.officers.each do |officer|
create(:poll_officer_assignment, poll: poll, officer: officer)
end
end
factory :poll_with_author, traits: [:with_author]
end
factory :poll_question, class: "Poll::Question" do
poll
author factory: :user
sequence(:title) { |n| "Question title #{n}" }
trait :yes_no do
after(:create) do |question|
create(:poll_question_answer, question: question, title: "Yes")
create(:poll_question_answer, question: question, title: "No")
end
end
trait :abc do
after(:create) do |question, evaluator|
%w[A B C].each do |letter|
create(:poll_question_answer, question: question, title: "Answer #{letter}")
end
end
end
factory :poll_question_unique do
after(:create) do |question|
create(:votation_type_unique, questionable: question)
end
end
factory :poll_question_multiple do
transient { max_votes { 3 } }
after(:create) do |question, evaluator|
create(:votation_type_multiple, questionable: question, max_votes: evaluator.max_votes)
end
end
end
factory :poll_question_answer, class: "Poll::Question::Answer" do
sequence(:title) { |n| "Answer title #{n}" }
sequence(:description) { |n| "Answer description #{n}" }
sequence(:given_order) { |n| n }
transient { poll { association(:poll) } }
question { association(:poll_question, poll: poll) }
trait :with_image do
after(:create) { |answer| create(:image, imageable: answer) }
end
trait :with_document do
after(:create) { |answer| create(:document, documentable: answer) }
end
trait :with_video do
after(:create) { |answer| create(:poll_answer_video, answer: answer) }
end
factory :future_poll_question_answer do
poll { association(:poll, :future) }
end
end
factory :poll_answer_video, class: "Poll::Question::Answer::Video" do
title { "Sample video title" }
url { "https://youtu.be/nhuNb0XtRhQ" }
transient { poll { association(:poll) } }
answer { association(:poll_question_answer, poll: poll) }
end
factory :poll_booth, class: "Poll::Booth" do
sequence(:name) { |n| "Booth #{n}" }
sequence(:location) { |n| "Street #{n}" }
end
factory :poll_booth_assignment, class: "Poll::BoothAssignment" do
poll
booth factory: :poll_booth
end
factory :poll_officer_assignment, class: "Poll::OfficerAssignment" do
officer factory: :poll_officer
date { Date.current }
transient { poll { association(:poll) } }
transient { booth { association(:poll_booth) } }
booth_assignment do
association :poll_booth_assignment, poll: poll, booth: booth
end
trait :final do
final { true }
end
end
factory :poll_shift, class: "Poll::Shift" do
booth factory: :poll_booth
officer factory: :poll_officer
date { Date.current }
trait :vote_collection_task do
task { 0 }
end
trait :recount_scrutiny_task do
task { 1 }
end
end
factory :poll_voter, class: "Poll::Voter" do
user factory: [:user, :level_two]
from_web
transient { budget { nil } }
poll { budget&.poll || association(:poll, budget: budget) }
trait :from_web do
origin { "web" }
end
trait :from_booth do
origin { "booth" }
transient { booth { association(:poll_booth) } }
booth_assignment do
association :poll_booth_assignment, poll: poll, booth: booth
end
officer_assignment do
association :poll_officer_assignment,
booth_assignment: booth_assignment,
officer: officer || association(:poll_officer)
end
end
trait :valid_document do
document_type { "1" }
document_number { "12345678Z" }
end
trait :invalid_document do
document_type { "1" }
document_number { "99999999A" }
end
end
factory :poll_answer, class: "Poll::Answer" do
question factory: [:poll_question, :yes_no]
author factory: [:user, :level_two]
answer { question.question_answers.sample.title }
end
factory :poll_partial_result, class: "Poll::PartialResult" do
question factory: [:poll_question, :yes_no]
author factory: :user
origin { "web" }
answer { question.question_answers.sample.title }
end
factory :poll_recount, class: "Poll::Recount" do
author factory: :user
origin { "web" }
trait :from_booth do
origin { "booth" }
transient { poll { nil } }
booth_assignment do
association :poll_booth_assignment, poll: poll
end
end
end
factory :poll_ballot_sheet, class: "Poll::BallotSheet" do
poll
officer_assignment factory: :poll_officer_assignment
data { "1234;9876;5678\n1000;2000;3000;9999" }
end
factory :poll_ballot, class: "Poll::Ballot" do
ballot_sheet factory: :poll_ballot_sheet
data { "1,2,3" }
end
factory :officing_residence, class: "Officing::Residence" do
user
officer factory: :poll_officer
document_number
document_type { "1" }
year_of_birth { "1980" }
trait :invalid do
year_of_birth { Time.current.year }
end
end
factory :active_poll
end