Skip to content

Commit e951b4d

Browse files
committed
Reduce test overhead / Randomly use one of checkbox/radiobutton/dropdown
Previously, `spec/features/questions/conditions_questions_spec.rb` tested `remove_data` and `add_webhook` functionality separately for each question type: checkbox, radiobutton, and dropdown. While thorough, this approach added a lot of overhead to test execution time. This change reduces that overhead by randomly choosing only one of checkbox, radiobutton, or dropdown for each of the tests. Over time, repeated executions via the GitHub Actions should ensure that all types continue to be exercised, maintaining coverage while also improving overall test time.
1 parent 8893f32 commit e951b4d

File tree

1 file changed

+69
-183
lines changed

1 file changed

+69
-183
lines changed

spec/features/questions/conditions_questions_spec.rb

Lines changed: 69 additions & 183 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,16 @@
4141
# So all Conditions are created with option_list with a single option id.
4242

4343
describe 'conditions with action_type remove' do
44-
feature 'User answers a checkboxes question with a condition' do
45-
scenario 'User answers chooses checkbox option with a condition', :js do
46-
answer_id = @conditional_questions[:checkbox].id
47-
condition = create(:condition, question: @conditional_questions[:checkbox],
48-
option_list: [@conditional_questions[:checkbox].question_options[2].id],
44+
feature 'User answers a question with a condition' do
45+
scenario 'User answers chooses an option with a condition', :js do
46+
# Choose a conditional question at random (may be of type :checkbox, :radiobutton, or :dropdown)
47+
question_type = @conditional_questions.keys.sample
48+
conditional_question = @conditional_questions[question_type]
49+
conditional_question_remove_option = conditional_question.question_options[0]
50+
conditional_question_other_option = conditional_question.question_options[1]
51+
answer_id = conditional_question.id
52+
condition = create(:condition, question: conditional_question,
53+
option_list: [conditional_question_remove_option.id],
4954
action_type: 'remove',
5055
remove_data: [@non_conditional_questions[:textarea][0].id,
5156
@non_conditional_questions[:textfield][1].id,
@@ -58,227 +63,84 @@
5863

5964
go_to_write_plan_page_and_verify_answered
6065

61-
# Answer the checkbox_conditional_question.
66+
# Answer the conditional_question
6267
within("#answer-form-#{answer_id}") do
63-
check @conditional_questions[:checkbox].question_options[2].text
68+
answer_conditional_question(conditional_question_remove_option, question_type)
6469
end
6570

6671
check_answer_save_statuses(answer_id)
6772
check_question_and_answer_counts_for_plan(condition.remove_data)
6873
check_remove_data_effect_on_answer_form_selectors(condition.remove_data)
6974

70-
# Now uncheck checkbox_conditional_question answer.
75+
question_option = determine_question_option(conditional_question_remove_option,
76+
conditional_question_other_option, question_type)
77+
# If :checkbox, uncheck the previously checked option
78+
# Else, select a different :dropdown/:radiobutton option
7179
within("#answer-form-#{answer_id}") do
72-
uncheck @conditional_questions[:checkbox].question_options[2].text
80+
answer_conditional_question(question_option, question_type, 'uncheck')
7381
end
7482

7583
check_answer_save_statuses(answer_id)
7684
num_questions, num_answers = question_and_answer_counts_for_plan
77-
# Unchecking the conditional question should unhide all of the `remove_data` questions
78-
# `- 1` from num_answers to account for now unchecked conditional question
79-
expect(page).to have_text("#{num_answers - 1}/#{num_questions} answered")
80-
end
81-
82-
scenario 'User answers chooses checkbox option without a condition', :js do
83-
answer_id = @conditional_questions[:checkbox].id
84-
create(:condition, question: @conditional_questions[:checkbox],
85-
option_list: [@conditional_questions[:checkbox].question_options[1].id],
86-
action_type: 'remove',
87-
remove_data: non_conditional_questions_ids_by_index(2))
88-
89-
create(:condition, question: @conditional_questions[:checkbox],
90-
option_list: [@conditional_questions[:checkbox].question_options[2].id],
91-
action_type: 'remove',
92-
remove_data: non_conditional_questions_ids_by_index(0))
93-
94-
go_to_write_plan_page_and_verify_answered
95-
96-
# Answer the checkbox_conditional_question
97-
within("#answer-form-#{answer_id}") do
98-
check @conditional_questions[:checkbox].question_options[0].text
99-
end
100-
101-
check_answer_save_statuses(answer_id)
102-
check_question_and_answer_counts_for_plan
103-
end
104-
end
105-
106-
feature 'User answers a radiobutton question with a condition' do
107-
scenario 'User answers selects radiobutton option with a condition', :js do
108-
answer_id = @conditional_questions[:radiobutton].id
109-
condition = create(:condition, question: @conditional_questions[:radiobutton],
110-
option_list: [@conditional_questions[:radiobutton].question_options[2].id],
111-
action_type: 'remove',
112-
remove_data: [@non_conditional_questions[:textarea][0].id,
113-
@non_conditional_questions[:textfield][1].id,
114-
@non_conditional_questions[:date][2].id,
115-
@non_conditional_questions[:rda_metadata][0].id,
116-
@non_conditional_questions[:checkbox][1].id,
117-
@non_conditional_questions[:radiobutton][2].id,
118-
@non_conditional_questions[:dropdown][0].id,
119-
@non_conditional_questions[:multiselectbox][1].id])
120-
121-
go_to_write_plan_page_and_verify_answered
122-
123-
# Answer the radiobutton_conditional_question.
124-
within("#answer-form-#{answer_id}") do
125-
choose @conditional_questions[:radiobutton].question_options[2].text
126-
end
127-
128-
check_answer_save_statuses(answer_id)
129-
check_question_and_answer_counts_for_plan(condition.remove_data)
130-
check_remove_data_effect_on_answer_form_selectors(condition.remove_data)
131-
132-
# Now for radiobutton_conditional_question answer, there in no unchoose option,
133-
# so we switch options to a different option without any conditions.
134-
within("#answer-form-#{answer_id}") do
135-
choose @conditional_questions[:radiobutton].question_options[0].text
136-
end
137-
138-
check_answer_save_statuses(answer_id)
139-
check_question_and_answer_counts_for_plan
140-
end
141-
142-
scenario 'User answers selects radiobutton option without a condition', :js do
143-
answer_id = @conditional_questions[:radiobutton].id
144-
create(:condition, question: @conditional_questions[:radiobutton],
145-
option_list: [@conditional_questions[:radiobutton].question_options[1].id],
146-
action_type: 'remove',
147-
remove_data: non_conditional_questions_ids_by_index(2))
148-
149-
create(:condition, question: @conditional_questions[:radiobutton],
150-
option_list: [@conditional_questions[:radiobutton].question_options[2].id],
151-
action_type: 'remove',
152-
remove_data: non_conditional_questions_ids_by_index(0))
153-
154-
go_to_write_plan_page_and_verify_answered
155-
156-
# Answer the radiobutton_conditional_question.
157-
within("#answer-form-#{answer_id}") do
158-
choose @conditional_questions[:radiobutton].question_options[0].text
159-
end
160-
161-
check_answer_save_statuses(answer_id)
162-
check_question_and_answer_counts_for_plan
163-
end
164-
end
16585

166-
feature 'User answers a dropdown question with a condition' do
167-
scenario 'User answers chooses dropdown option with a condition', :js do
168-
answer_id = @conditional_questions[:dropdown].id
169-
condition = create(:condition, question: @conditional_questions[:dropdown],
170-
option_list: [@conditional_questions[:dropdown].question_options[2].id],
171-
action_type: 'remove',
172-
remove_data: [@non_conditional_questions[:textarea][0].id,
173-
@non_conditional_questions[:textfield][1].id,
174-
@non_conditional_questions[:date][2].id,
175-
@non_conditional_questions[:rda_metadata][0].id,
176-
@non_conditional_questions[:checkbox][1].id,
177-
@non_conditional_questions[:radiobutton][2].id,
178-
@non_conditional_questions[:dropdown][0].id,
179-
@non_conditional_questions[:multiselectbox][1].id])
180-
181-
go_to_write_plan_page_and_verify_answered
182-
183-
# Answer the dropdown_conditional_question
184-
within("#answer-form-#{answer_id}") do
185-
select(@conditional_questions[:dropdown].question_options[2].text, from: 'answer_question_option_ids')
186-
end
187-
188-
check_answer_save_statuses(answer_id)
189-
check_question_and_answer_counts_for_plan(condition.remove_data)
190-
check_remove_data_effect_on_answer_form_selectors(condition.remove_data)
191-
192-
# Now select another option for dropdown_conditional_question.
193-
within("#answer-form-#{answer_id}") do
194-
select(@conditional_questions[:dropdown].question_options[1].text, from: 'answer_question_option_ids')
195-
end
196-
197-
check_answer_save_statuses(answer_id)
198-
check_question_and_answer_counts_for_plan
86+
# Undoing the conditional question should unhide all of the `remove_data` questions
87+
# `-= 1` is needed for :checkbox because unchecking removes an answer
88+
# (:dropdown and :radiobutton simply select a different answer)
89+
num_answers -= 1 if question_type == :checkbox
90+
expect(page).to have_text("#{num_answers}/#{num_questions} answered")
19991
end
20092

201-
scenario 'User answers select dropdown option without a condition', :js do
202-
answer_id = @conditional_questions[:dropdown].id
203-
create(:condition, question: @conditional_questions[:dropdown],
204-
option_list: [@conditional_questions[:dropdown].question_options[1].id],
93+
scenario 'User answers chooses an option without a condition', :js do
94+
# Choose a conditional question at random (may be of type :checkbox, :radiobutton, or :dropdown)
95+
question_type = @conditional_questions.keys.sample
96+
conditional_question = @conditional_questions[question_type]
97+
conditional_question_other_option = conditional_question.question_options[0]
98+
answer_id = conditional_question.id
99+
create(:condition, question: conditional_question,
100+
option_list: [conditional_question.question_options[1].id],
205101
action_type: 'remove',
206102
remove_data: non_conditional_questions_ids_by_index(2))
207103

208-
create(:condition, question: @conditional_questions[:dropdown],
209-
option_list: [@conditional_questions[:dropdown].question_options[2].id],
104+
create(:condition, question: conditional_question,
105+
option_list: [conditional_question.question_options[2].id],
210106
action_type: 'remove',
211107
remove_data: non_conditional_questions_ids_by_index(0))
212108

213109
go_to_write_plan_page_and_verify_answered
214110

215-
# Answer the dropdown_conditional_question.
111+
# Answer the conditional_question
216112
within("#answer-form-#{answer_id}") do
217-
select(@conditional_questions[:dropdown].question_options[0].text, from: 'answer_question_option_ids')
113+
answer_conditional_question(conditional_question_other_option, question_type)
218114
end
219115

220116
check_answer_save_statuses(answer_id)
221117
check_question_and_answer_counts_for_plan
222118
end
223119
end
224120
end
121+
225122
describe 'conditions with action_type add_webhook' do
226-
scenario 'User answers chooses checkbox option with a condition (with action_type: add_webhook)', :js do
227-
answer_id = @conditional_questions[:checkbox].id
228-
condition = create(:condition, :webhook, question: @conditional_questions[:checkbox],
229-
option_list: [@conditional_questions[:checkbox].question_options[2].id])
123+
scenario 'User answers chooses an option with a condition (with action_type: add_webhook)', :js do
124+
# Choose a conditional question at random (may be of type :checkbox, :radiobutton, or :dropdown)
125+
question_type = @conditional_questions.keys.sample
126+
conditional_question = @conditional_questions[question_type]
127+
conditional_question_webhook_option = conditional_question.question_options[2]
128+
answer_id = conditional_question.id
129+
condition = create(:condition, :webhook, question: conditional_question,
130+
option_list: [conditional_question_webhook_option.id])
230131

231132
go_to_write_plan_page_and_verify_answered
232133

233-
# Answer the checkbox_conditional_question.
134+
# Answer the conditional_question
234135
within("#answer-form-#{answer_id}") do
235-
check @conditional_questions[:checkbox].question_options[2].text
136+
answer_conditional_question(conditional_question_webhook_option, question_type)
236137
end
237138

238139
check_answer_save_statuses(answer_id)
239140
check_question_and_answer_counts_for_plan
240141

241142
check_delivered_mail_for_webhook_data_and_question_data(JSON.parse(condition.webhook_data), :checkbox)
242143
end
243-
244-
scenario 'User answers chooses radiobutton option with a condition (with action_type: add_webhook)', :js do
245-
answer_id = @conditional_questions[:radiobutton].id
246-
condition = create(:condition,
247-
:webhook,
248-
question: @conditional_questions[:radiobutton],
249-
option_list: [@conditional_questions[:radiobutton].question_options[0].id])
250-
251-
go_to_write_plan_page_and_verify_answered
252-
253-
# Now for radiobutton_conditional_question answer, there in no unchoose option,
254-
# so we switch options to a different option without any conditions.
255-
within("#answer-form-#{answer_id}") do
256-
choose @conditional_questions[:radiobutton].question_options[0].text
257-
end
258-
259-
check_answer_save_statuses(answer_id)
260-
check_question_and_answer_counts_for_plan
261-
262-
check_delivered_mail_for_webhook_data_and_question_data(JSON.parse(condition.webhook_data), :radiobutton)
263-
end
264-
265-
scenario 'User answers chooses dropdown option with a condition (with action_type: add_webhook)', :js do
266-
answer_id = @conditional_questions[:dropdown].id
267-
condition = create(:condition, :webhook, question: @conditional_questions[:dropdown],
268-
option_list: [@conditional_questions[:dropdown].question_options[2].id])
269-
270-
go_to_write_plan_page_and_verify_answered
271-
272-
# Answer the dropdown_conditional_question
273-
within("#answer-form-#{answer_id}") do
274-
select(@conditional_questions[:dropdown].question_options[2].text, from: 'answer_question_option_ids')
275-
end
276-
277-
check_answer_save_statuses(answer_id)
278-
check_question_and_answer_counts_for_plan
279-
280-
check_delivered_mail_for_webhook_data_and_question_data(JSON.parse(condition.webhook_data), :dropdown)
281-
end
282144
end
283145

284146
private
@@ -345,4 +207,28 @@ def check_answer_save_statuses(answer_id)
345207
expect(saved_span.text).to include('Answered just now')
346208
end
347209
end
210+
211+
def answer_conditional_question(question_option, question_type, check_type = 'check')
212+
case question_type
213+
when :checkbox
214+
# if it is a checkbox question, we need to know check_type as well ('check' vs 'uncheck')
215+
if check_type == 'check'
216+
check question_option.text
217+
else
218+
uncheck question_option.text
219+
end
220+
when :radiobutton
221+
choose question_option.text
222+
when :dropdown
223+
select(question_option.text, from: 'answer_question_option_ids')
224+
end
225+
end
226+
227+
def determine_question_option(original_question, new_question, question_type)
228+
# If :checkbox question, we want to return the original question to be unchecked
229+
return original_question if question_type == :checkbox
230+
231+
# Else we want to return a different question to be selected via :radiobutton or :dropdown
232+
new_question
233+
end
348234
end

0 commit comments

Comments
 (0)