Browse Source

CLDC-3029 Clear not routed answers twice (#2028)

* feat: reset not routed questions twice to catch newly not routed questions after the first set are cleared

* feat: only clear newly not routed answers on second pass

* refactor: lint

* refactor: renaming

* feat: add tests
cldc-2865-remove-paas-from-prod-pipeline v0.3.78
natdeanlewissoftwire 1 year ago committed by GitHub
parent
commit
b6b6de7f05
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 68
      app/models/form.rb
  2. 22
      spec/models/form_spec.rb

68
app/models/form.rb

@ -192,52 +192,60 @@ class Form
def reset_checkbox_questions_if_not_routed(log) def reset_checkbox_questions_if_not_routed(log)
checkbox_questions = routed_and_not_routed_questions_by_type(log, type: "checkbox") checkbox_questions = routed_and_not_routed_questions_by_type(log, type: "checkbox")
checkbox_questions[:not_routed].each do |not_routed_question| clear_checkbox_attributes(log, checkbox_questions[:routed], checkbox_questions[:not_routed])
valid_options = checkbox_questions[:routed]
checkbox_questions_recalculated = routed_and_not_routed_questions_by_type(log, type: "checkbox")
newly_not_routed_checkbox_questions = checkbox_questions_recalculated[:not_routed].reject { |question| checkbox_questions[:not_routed].include?(question) }
clear_checkbox_attributes(log, checkbox_questions_recalculated[:routed], newly_not_routed_checkbox_questions)
end
def reset_radio_questions_if_not_routed_or_invalid_answers(log)
radio_questions = routed_and_not_routed_questions_by_type(log, type: "radio")
clear_radio_attributes(log, radio_questions[:routed], radio_questions[:not_routed])
radio_questions_recalculated = routed_and_not_routed_questions_by_type(log, type: "radio")
newly_not_routed_radio_questions = radio_questions_recalculated[:not_routed].reject { |question| radio_questions[:not_routed].include?(question) }
clear_radio_attributes(log, radio_questions_recalculated[:routed], newly_not_routed_radio_questions)
end
def reset_free_user_input_questions_if_not_routed(log)
non_radio_or_checkbox_questions = routed_and_not_routed_questions_by_type(log)
clear_free_user_input_attributes(log, non_radio_or_checkbox_questions[:routed], non_radio_or_checkbox_questions[:not_routed])
non_radio_or_checkbox_questions_recalculated = routed_and_not_routed_questions_by_type(log)
newly_not_routed_non_radio_or_checkbox_questions = non_radio_or_checkbox_questions_recalculated[:not_routed].reject { |question| non_radio_or_checkbox_questions[:not_routed].include?(question) }
clear_free_user_input_attributes(log, non_radio_or_checkbox_questions_recalculated[:routed], newly_not_routed_non_radio_or_checkbox_questions)
end
def clear_checkbox_attributes(log, routed_questions, not_routed_questions)
not_routed_questions.each do |not_routed_question|
valid_options = routed_questions
.select { |q| q.id == not_routed_question.id } .select { |q| q.id == not_routed_question.id }
.flat_map { |q| q.answer_options.keys } .flat_map { |q| q.answer_options.keys }
not_routed_question.answer_options.each_key do |invalid_option| not_routed_question.answer_options.each_key do |invalid_option|
if !log.respond_to?(invalid_option) || valid_options.include?(invalid_option) || log.public_send(invalid_option).nil? clear_attribute(log, invalid_option) if log.respond_to?(invalid_option) && valid_options.exclude?(invalid_option) && log.public_send(invalid_option).present?
next
else
clear_attribute(log, invalid_option)
end
end end
end end
end end
def reset_radio_questions_if_not_routed_or_invalid_answers(log) def clear_radio_attributes(log, routed_questions, not_routed_questions)
radio_questions = routed_and_not_routed_questions_by_type(log, type: "radio") valid_radio_options = routed_questions
valid_radio_options = radio_questions[:routed]
.group_by(&:id) .group_by(&:id)
.transform_values! { |q_array| q_array.flat_map { |q| q.answer_options.keys } } .transform_values! { |q_array| q_array.flat_map { |q| q.answer_options.keys } }
radio_questions[:not_routed].each do |not_routed_question| not_routed_questions.each do |not_routed_question|
question_id = not_routed_question.id question_id = not_routed_question.id
if !log.respond_to?(question_id) || log.public_send(question_id).nil? || valid_radio_options.key?(question_id) clear_attribute(log, question_id) if log.respond_to?(question_id) && log.public_send(question_id).present? && !valid_radio_options.key?(question_id)
next
else
clear_attribute(log, question_id)
end
end end
valid_radio_options.each do |question_id, valid_options| valid_radio_options.each do |question_id, valid_options|
if !log.respond_to?(question_id) || valid_options.include?(log.public_send(question_id).to_s) clear_attribute(log, question_id) if log.respond_to?(question_id) && valid_options.exclude?(log.public_send(question_id).to_s)
next
else
clear_attribute(log, question_id)
end
end end
end end
def reset_free_user_input_questions_if_not_routed(log) def clear_free_user_input_attributes(log, routed_questions, not_routed_questions)
non_radio_checkbox_questions = routed_and_not_routed_questions_by_type(log) enabled_question_ids = routed_questions.map(&:id)
enabled_question_ids = non_radio_checkbox_questions[:routed].map(&:id) not_routed_questions.each do |not_routed_question|
non_radio_checkbox_questions[:not_routed].each do |not_routed_question|
question_id = not_routed_question.id question_id = not_routed_question.id
if log.public_send(question_id).nil? || enabled_question_ids.include?(question_id) clear_attribute(log, question_id) if log.public_send(question_id).present? && enabled_question_ids.exclude?(question_id)
next
else
clear_attribute(log, question_id)
end
end end
end end

22
spec/models/form_spec.rb

@ -328,6 +328,28 @@ RSpec.describe Form, type: :model do
end end
end end
context "when a value is changed such that a radio and free input questions are no longer routed to" do
let(:log) { FactoryBot.create(:lettings_log, :completed, startdate: now) }
it "all attributes relating to that checkbox question are cleared" do
expect(log.hhmemb).to be 2
expect(log.details_known_2).to be 0
expect(log.sex2).to eq("M")
expect(log.relat2).to eq("P")
expect(log.age2_known).to be 0
expect(log.age2).to be 32
expect(log.ecstat2).to be 6
log.update!(hhmemb: 1)
expect(log.details_known_2).to be nil
expect(log.sex2).to be nil
expect(log.relat2).to be nil
expect(log.age2_known).to be nil
expect(log.age2).to be nil
expect(log.ecstat2).to be nil
end
end
context "when an attribute is derived, but no questions for that attribute are routed to" do context "when an attribute is derived, but no questions for that attribute are routed to" do
let(:log) { FactoryBot.create(:sales_log, :outright_sale_setup_complete, value: 200_000) } let(:log) { FactoryBot.create(:sales_log, :outright_sale_setup_complete, value: 200_000) }

Loading…
Cancel
Save