diff --git a/decidim-surveys/lib/decidim/surveys/seeds.rb b/decidim-surveys/lib/decidim/surveys/seeds.rb index 352a8c98f6d26..eb2d43de69c5b 100644 --- a/decidim-surveys/lib/decidim/surveys/seeds.rb +++ b/decidim-surveys/lib/decidim/surveys/seeds.rb @@ -4,7 +4,7 @@ module Decidim module Surveys - class Seeds + class Seeds < Decidim::Seeds attr_reader :participatory_space def initialize(participatory_space:) @@ -12,19 +12,31 @@ def initialize(participatory_space:) end def call - admin_user = Decidim::User.find_by( - organization: participatory_space.organization, - email: "admin@example.org" - ) + component = create_component! + + questionnaire = create_questionnaire!(component:) + + create_questions!(questionnaire:) + + rand(20).times { create_answers!(questionnaire:) } + end + + def create_component! + step_settings = if participatory_space.allows_steps? + { participatory_space.active_step.id => { allow_answers: true } } + else + {} + end params = { name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :surveys).i18n_name, manifest_name: :surveys, published_at: Time.current, - participatory_space: + participatory_space:, + step_settings: } - component = Decidim.traceability.perform_action!( + Decidim.traceability.perform_action!( "publish", Decidim::Component, admin_user, @@ -32,7 +44,9 @@ def call ) do Decidim::Component.create!(params) end + end + def create_questionnaire!(component:) questionnaire = Decidim::Forms::Questionnaire.new( title: Decidim::Faker::Localized.paragraph, description: Decidim::Faker::Localized.wrapped("
", "
") do @@ -55,16 +69,22 @@ def call visibility: "all" ) - %w(short_answer long_answer).each_with_index do |text_question_type, index| + questionnaire + end + + def create_questions!(questionnaire:) + %w(short_answer long_answer files).each_with_index do |text_question_type, index| Decidim::Forms::Question.create!( + mandatory: text_question_type == "short_answer", questionnaire:, body: Decidim::Faker::Localized.paragraph, question_type: text_question_type, position: index ) + next if text_question_type == "files" end - %w(single_option multiple_option).each_with_index do |multiple_choice_question_type, index| + %w(single_option multiple_option sorting).each_with_index do |multiple_choice_question_type, index| question = Decidim::Forms::Question.create!( questionnaire:, body: Decidim::Faker::Localized.paragraph, @@ -97,6 +117,67 @@ def call question.matrix_rows.create!(body: Decidim::Faker::Localized.sentence, position:) end end + + Decidim::Forms::Question.create!( + questionnaire:, + body: nil, + question_type: "separator", + position: 3 + ) + end + + def create_answers!(questionnaire:, user: nil) + user = find_or_initialize_user_by(email: "survey-#{questionnaire.id}-#{rand(10_000)}@example.org") if user.nil? + + answer_options = { + user:, + questionnaire:, + session_token: Digest::MD5.hexdigest("#{user.id}-#{Rails.application.secret_key_base}"), + ip_hash: Faker::Internet.device_token.slice(0, 24) + } + + questionnaire.questions.each do |question| + case question.question_type + when "short_answer", "long_answer" + create_answer_for_text_question_type!(answer_options.merge({ question: })) + when "single_option", "multiple_option", "sorting" + create_answer_for_multiple_choice_question_type(answer_options.merge({ question: })) + when "matrix_single", "matrix_multiple" + create_answer_for_matrix_question_type(answer_options.merge({ question: })) + end + end + end + + def create_answer_for_text_question_type!(options) + Decidim::Forms::Answer.create!( + **options.merge({ body: ::Faker::Lorem.paragraph(sentence_count: 1) }) + ) + end + + def create_answer_for_multiple_choice_question_type(options) + answer = Decidim::Forms::Answer.create!(**options) + answer_option = options[:question].answer_options.sample + body = answer_option["en"] + + Decidim::Forms::AnswerChoice.create!( + answer:, + answer_option:, + body: + ) + end + + def create_answer_for_matrix_question_type(options) + answer = Decidim::Forms::Answer.create!(**options) + answer_option = options[:question].answer_options.sample + matrix_row = options[:question].matrix_rows.sample + body = answer_option["en"] + + Decidim::Forms::AnswerChoice.create!( + answer:, + answer_option:, + matrix_row:, + body: + ) end end end