lib/decidim/votings/test/factories.rb in decidim-elections-0.24.3 vs lib/decidim/votings/test/factories.rb in decidim-elections-0.25.0.rc1

- old
+ new

@@ -1,10 +1,18 @@ # frozen_string_literal: true require "decidim/core/test/factories" require "decidim/forms/test/factories" +def format_birthdate(birthdate) + format("%04d%02d%02d", birthdate.year, birthdate.month, birthdate.day) # rubocop:disable Style/FormatStringToken +end + +def hash_for(*data) + Digest::SHA256.hexdigest(data.join(".")) +end + FactoryBot.define do sequence(:voting_slug) do |n| "#{Decidim::Faker::Internet.slug(words: nil, glue: "-")}-#{n}" end @@ -18,10 +26,11 @@ end_time { 3.days.from_now } decidim_scope_id { create(:scope, organization: organization).id } banner_image { Decidim::Dev.test_file("city2.jpeg", "image/jpeg") } introductory_image { Decidim::Dev.test_file("city.jpeg", "image/jpeg") } voting_type { "hybrid" } + census_contact_information { nil } trait :unpublished do published_at { nil } end @@ -59,10 +68,19 @@ trait :hybrid do voting_type { "hybrid" } end end + factory :voting_election, parent: :election do + transient do + voting { create(:voting) } + base_id { 20_000 } + end + + component { create(:elections_component, organization: organization, participatory_space: voting) } + end + factory :polling_station, class: "Decidim::Votings::PollingStation" do title { generate_localized_title } location { Decidim::Faker::Localized.wrapped("<p>", "</p>") { generate_localized_title } } location_hints { Decidim::Faker::Localized.wrapped("<p>", "</p>") { generate_localized_title } } address { Faker::Lorem.sentence(word_count: 3) } @@ -72,12 +90,157 @@ end factory :polling_officer, class: "Decidim::Votings::PollingOfficer" do user { create :user, organization: voting.organization } voting { create :voting } + + trait :president do + presided_polling_station { create :polling_station, voting: voting } + end end factory :monitoring_committee_member, class: "Decidim::Votings::MonitoringCommitteeMember" do user voting { create :voting, organization: user.organization } + end + + factory :dataset, class: "Decidim::Votings::Census::Dataset" do + voting { create(:voting) } + file { "file.csv" } + status { "init_data" } + csv_row_raw_count { 1 } + csv_row_processed_count { 1 } + + trait :with_data do + after(:create) do |dataset| + create_list(:datum, 5, dataset: dataset) + end + end + + trait :with_access_code_data do + after(:create) do |dataset| + create_list(:datum, 5, :with_access_code, dataset: dataset) + end + end + + trait :data_created do + status { "data_created" } + end + + trait :codes_generated do + with_access_code_data + status { "codes_generated" } + end + + trait :frozen do + status { "freeze" } + end + end + + factory :datum, class: "Decidim::Votings::Census::Datum" do + dataset + + transient do + document_number { Faker::IDNumber.spanish_citizen_number } + document_type { %w(DNI NIE PASSPORT).sample } + birthdate { Faker::Date.birthday(min_age: 18, max_age: 65) } + end + + hashed_in_person_data { hash_for(document_number, document_type, format_birthdate(birthdate)) } + hashed_check_data { hash_for(document_number, document_type, format_birthdate(birthdate), postal_code) } + + full_name { Faker::Name.name } + full_address { Faker::Address.full_address } + postal_code { Faker::Address.postcode } + mobile_phone_number { Faker::PhoneNumber.cell_phone } + email { Faker::Internet.email } + + trait :with_access_code do + access_code { Faker::Alphanumeric.alphanumeric(number: 8) } + hashed_online_data { hash_for hashed_check_data, access_code } + end + end + + factory :ballot_style, class: "Decidim::Votings::BallotStyle" do + code { Faker::Lorem.word.upcase } + voting { create(:voting) } + + trait :with_questions do + transient do + election { create(:election, :complete, component: create(:elections_component, participatory_space: voting)) } + end + end + + trait :with_ballot_style_questions do + with_questions + + after(:create) do |ballot_style, evaluator| + evaluator.election.questions.first(2).map { |question| create(:ballot_style_question, question: question, ballot_style: ballot_style) } + end + end + end + + factory :ballot_style_question, class: "Decidim::Votings::BallotStyleQuestion" do + question + ballot_style + end + + factory :in_person_vote, class: "Decidim::Votings::InPersonVote" do + transient do + voting { create(:voting) } + component { create(:elections_component, participatory_space: voting) } + end + + election { create(:election, component: component) } + sequence(:voter_id) { |n| "voter_#{n}" } + status { "pending" } + message_id { "decidim-test-authority.2.vote.in_person+v.5826de088371d1b15b38f00c8203871caec07041ed0c8fb0c6fb875f0df763b6" } + polling_station { polling_officer.polling_station } + polling_officer { create(:polling_officer, :president, voting: voting) } + + trait :accepted do + status { "accepted" } + end + + trait :rejected do + status { "rejected" } + end + end + + factory :ps_closure, class: "Decidim::Votings::PollingStationClosure" do + transient do + number_of_votes { Faker::Number.number(digits: 2) } + end + + election { create(:voting_election, :complete) } + polling_station { polling_officer.polling_station } + polling_officer { create(:polling_officer, :president, voting: election.participatory_space) } + polling_officer_notes { Faker::Lorem.paragraph } + monitoring_committee_notes { nil } + signed_at { nil } + phase { :count } + validated_at { nil } + + trait :with_results do + phase { :signature } + + after :create do |closure, evaluator| + total_votes = evaluator.number_of_votes + create_list(:in_person_vote, evaluator.number_of_votes, :accepted, voting: closure.election.participatory_space, election: closure.election) + + closure.election.questions.each do |question| + max = total_votes + question.answers.each do |answer| + value = Faker::Number.between(from: 0, to: max) + closure.results << create(:election_result, closurable: closure, election: closure.election, question: question, answer: answer, value: value) + max -= value + end + value = Faker::Number.between(from: 0, to: max) + closure.results << create(:election_result, :null_ballots, election: closure.election, question: question, value: value) + max -= value + closure.results << create(:election_result, :blank_ballots, election: closure.election, question: question, value: max) + end + closure.results << create(:election_result, :total_ballots, closurable: closure, election: closure.election, value: total_votes) + end + end end end