Skip to content

Commit 5e83462

Browse files
authored
Merge pull request #5316 from alphagov/get-response-for-checkboxes
Get response for checkboxes
2 parents 7811fb5 + 1c6337e commit 5e83462

5 files changed

+45
-17
lines changed

app/helpers/current_question_helper.rb

-8
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,6 @@ def prefill_value_is?(value)
2626
end
2727
end
2828

29-
def prefill_value_includes?(question, value)
30-
if params[:previous_response]
31-
question.to_response(params[:previous_response]).include?(value)
32-
elsif params[:response]
33-
params[:response].include?(value)
34-
end
35-
end
36-
3729
def prefill_value_for(question, attribute = nil)
3830
if params[:previous_response]
3931
response = question.to_response(params[:previous_response])

app/presenters/checkbox_question_presenter.rb

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
class CheckboxQuestionPresenter < QuestionWithOptionsPresenter
2-
include CurrentQuestionHelper
3-
42
def response_labels(values)
53
values.split(",").map do |value|
64
if value == SmartAnswer::Question::Checkbox::NONE_OPTION
@@ -29,9 +27,15 @@ def checkboxes
2927
label: option[:label],
3028
value: option[:value],
3129
hint: option[:hint_text],
32-
checked: prefill_value_includes?(self, option[:value]),
30+
checked: checked?(option[:value]),
3331
exclusive: option[:value] == "none" || nil,
3432
}
3533
end
3634
end
35+
36+
def checked?(value)
37+
return false if response_for_current_question.blank?
38+
39+
response_for_current_question.include?(value)
40+
end
3741
end

app/presenters/flow_presenter.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def response_for_current_question
8383
responses = params[:responses]
8484
responses[current_state.current_node.to_s]
8585
elsif params[:previous_response].present?
86-
params[:previous_response]
86+
current_node.to_response(params[:previous_response])
8787
else
8888
question_number = current_state.path.size
8989
all_responses[question_number]

test/unit/checkbox_question_presenter_test.rb

+21-5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class CheckboxQuestionPresenterTest < ActiveSupport::TestCase
1515
@renderer.stubs(:option).with(:option3).returns({ label: "Option 3" })
1616

1717
@presenter = CheckboxQuestionPresenter.new(@question, nil, nil, renderer: @renderer)
18+
@presenter.stubs(:response_for_current_question).returns(nil)
1819
end
1920

2021
test "#response_labels returns option labels for responses" do
@@ -29,19 +30,19 @@ class CheckboxQuestionPresenterTest < ActiveSupport::TestCase
2930
assert_equal(%w[option1 option2 option3], @presenter.checkboxes.map { |c| c[:value] })
3031
assert_equal(["Option 1", "Option 2", "Option 3"], @presenter.checkboxes.map { |c| c[:label] })
3132
assert_equal([nil, "Hint 2", nil], @presenter.checkboxes.map { |c| c[:hint] })
32-
assert_equal([nil, nil, nil], @presenter.checkboxes.map { |c| c[:checked] })
33+
assert_equal([false, false, false], @presenter.checkboxes.map { |c| c[:checked] })
3334
end
3435

3536
test "#checkboxes return array including an or divider for none options" do
3637
@question.none_option
3738
@renderer.stubs(:option).with(:none).returns({ label: "None" })
3839

3940
expected_value = [
40-
{ label: "Option 1", value: "option1", hint: nil, checked: nil, exclusive: nil },
41-
{ label: "Option 2", value: "option2", hint: "Hint 2", checked: nil, exclusive: nil },
42-
{ label: "Option 3", value: "option3", hint: nil, checked: nil, exclusive: nil },
41+
{ label: "Option 1", value: "option1", hint: nil, checked: false, exclusive: nil },
42+
{ label: "Option 2", value: "option2", hint: "Hint 2", checked: false, exclusive: nil },
43+
{ label: "Option 3", value: "option3", hint: nil, checked: false, exclusive: nil },
4344
:or,
44-
{ label: "None", value: "none", hint: nil, checked: nil, exclusive: true },
45+
{ label: "None", value: "none", hint: nil, checked: false, exclusive: true },
4546
]
4647

4748
assert_equal expected_value, @presenter.checkboxes
@@ -53,5 +54,20 @@ class CheckboxQuestionPresenterTest < ActiveSupport::TestCase
5354

5455
assert_equal "caption-text", @presenter.caption
5556
end
57+
58+
context "#checked?" do
59+
should "return true if values were previously selected" do
60+
@presenter.stubs(:response_for_current_question).returns(%w[option1 option2])
61+
assert @presenter.checked?("option2")
62+
end
63+
64+
should "return false if no values have been selected" do
65+
@presenter.stubs(:response_for_current_question).returns(nil)
66+
67+
%w[option1 option2 option3 none].each do |option|
68+
assert_not @presenter.checked?(option)
69+
end
70+
end
71+
end
5672
end
5773
end

test/unit/flow_presenter_test.rb

+16
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,22 @@ def flow_registry
153153
flow_presenter = FlowPresenter.new(params, @flow)
154154
assert_nil(flow_presenter.response_for_current_question)
155155
end
156+
157+
should "format the response for checkbox questions" do
158+
flow = SmartAnswer::Flow.new do
159+
name "flow-name"
160+
checkbox_question :first_question_key do
161+
next_node { outcome :second_question_key }
162+
end
163+
value_question :second_question_key do
164+
next_node { outcome :outcome_key }
165+
end
166+
end
167+
params = { id: flow.name, responses: "question-1-answer", previous_response: "question-2-answer-a,question-2-answer-b" }
168+
flow_presenter = FlowPresenter.new(params, flow)
169+
170+
assert_equal(["question-2-answer-a", "question-2-answer-b"], flow_presenter.response_for_current_question)
171+
end
156172
end
157173

158174
context "#normalize_responses_param" do

0 commit comments

Comments
 (0)