quby 5.0.0 → 5.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/README.markdown +11 -2
  3. data/app/assets/javascripts/quby/answers/validation.js +3 -1
  4. data/lib/quby/answers/services/answer_validator.rb +44 -0
  5. data/lib/quby/questionnaires/deserializer.rb +10 -5
  6. data/lib/quby/questionnaires/entities/charting/bar_chart.rb +1 -5
  7. data/lib/quby/questionnaires/entities/charting/chart.rb +5 -1
  8. data/lib/quby/questionnaires/entities/charting/radar_chart.rb +1 -5
  9. data/lib/quby/questionnaires/specs/api_specs.rb +7 -5
  10. data/lib/quby/version.rb +1 -1
  11. data/spec/features/charts_spec.rb +9 -2
  12. data/spec/features/editing_completed_answer_spec.rb +2 -2
  13. data/spec/features/question_dependencies/group_maximum_answered_spec.rb +65 -2
  14. data/spec/features/question_dependencies/group_minimum_answered_spec.rb +42 -2
  15. data/spec/features/question_dependencies/group_minmax_answered_spec.rb +44 -7
  16. data/spec/fixtures/questionnaire_with_chart.rb +1 -0
  17. data/spec/fixtures/scores_from_schema.rb +25 -0
  18. data/spec/quby/answers/entities/score_spec.rb +51 -44
  19. data/spec/quby/answers/services/answer_validator_spec.rb +50 -9
  20. data/spec/quby/questionnaires/entities/charting/bar_chart_spec.rb +2 -8
  21. data/spec/quby/questionnaires/entities/charting/radar_chart_spec.rb +0 -5
  22. data/spec/quby/questionnaires/entities/fields_spec.rb +2 -2
  23. data/spec/quby/questionnaires/entities/questionnaire_spec.rb +4 -2
  24. data/spec/quby/questionnaires/repos/disk_repo_spec.rb +3 -1
  25. data/spec/quby/questionnaires/repos/memory_repo_spec.rb +2 -1
  26. data/spec/spec_helper.rb +13 -2
  27. data/spec/support/examples_for_chart.rb +10 -0
  28. data/spec/support/validation_helpers.rb +9 -0
  29. data/spec/teaspoon_env.rb +32 -2
  30. metadata +9 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4a0b61b70b821b00c262a58f7f7fb7ec04a33d4b26df7719be157d8f4015f823
4
- data.tar.gz: 6b897f4f1e7867999c9dda5b0bbd39f6b5493945715edce8194d45beab809926
3
+ metadata.gz: a67424bdab14ce8f570e5e595dc58802061c049897617c36d17a84700fa48ce1
4
+ data.tar.gz: 298f5bd393f0aa58c9bdb8302fa35c9f615168c64adbc38427f64d74625c7fb9
5
5
  SHA512:
6
- metadata.gz: 2595b285e0c4fd37dd708577bafbffc3c830194097d79ebb1c7784c6918f0a40cf4e4695e68cf0755cc7a09fb95a43beee4caebad495c141c61ac377fd90b637
7
- data.tar.gz: b575e091c90af8581c044e6866cf5cb328bc513d0f24ba3453efffa212741012f31650bcd07f6fe1d1649fe80e85bd0ff6ebb3e5c03a8e753e7c656bead146be
6
+ metadata.gz: b267bd9f1df8cae932a0fd1359eb7551d3f6e5359eb63f7e8e8642317fae23f98870f15ad5a706f5a9ba39a3169043b9b9d8500e36030413194d926600f2cf1d
7
+ data.tar.gz: 20c2afb9a148fa86c197cdb3da6fd95ea84ce44a30e0b927357fb7752e9c9af263d2d81f39c5386fda955d17c734613214c89f2eed424436b24046a18b2529b0
data/README.markdown CHANGED
@@ -45,13 +45,22 @@ To generate PDF files, the html_to_pdf docker container must be running and an e
45
45
  ENV['HTML_TO_PDF_URL'] = 'http://127.0.0.1:7768'
46
46
  ```
47
47
 
48
+ ## Docker
49
+
50
+ ```bash
51
+ docker-compose build
52
+ docker-compose run test appraisal install # generate lockfiles in mounted local gemfiles. alernatively remove volume.
53
+ docker-compose run --rm test bundle exec appraisal rails60 rspec
54
+ docker-compose run --rm test bundle exec appraisal rails60 teaspoon -r spec/teaspoon_env.rb
55
+ ```
56
+
48
57
  ## Testing
49
58
 
50
59
  When testing with guard or teaspoon, choose the Rails version you want to use and set the teaspoon environment:
51
60
 
52
61
  ```ruby
53
- bundle exec appraisal rails52 bundle # install dependencies for Rails 5.2
54
- TEASPOON_RAILS_ENV=test bundle exec appraisal rails52 guard
62
+ bundle exec appraisal rails60 bundle # install dependencies for Rails 6.0
63
+ TEASPOON_RAILS_ENV=test bundle exec appraisal rails60 guard
55
64
  ```
56
65
 
57
66
  ## Contributing to Quby
@@ -309,7 +309,9 @@
309
309
  var hidden = 0;
310
310
 
311
311
  for(var i = 0; i < groupItems.length; i++){
312
- var inputs = $(groupItems[i]).find("input, textarea, select").not(":disabled, :hidden");
312
+ var inputs = $(groupItems[i]).find("input, textarea, select").not(":disabled, :hidden")
313
+ .add($(groupItems[i]).find("input.made-slider:hidden")); // slider inputs
314
+
313
315
  if (inputs.length == 0) {
314
316
  hidden++;
315
317
  } else {
@@ -126,6 +126,11 @@ module Quby
126
126
  end
127
127
 
128
128
  def validate_regexp(question, validation, value)
129
+ # We have decided not to allow bypassing this validation when
130
+ # aborted, since whatever is using this data further on is likely not
131
+ # built to take into account values that do not conform to the given
132
+ # format.
133
+
129
134
  return if value.blank?
130
135
  match = validation[:matcher].match(value)
131
136
  unless match && match[0] == value
@@ -134,6 +139,11 @@ module Quby
134
139
  end
135
140
 
136
141
  def validate_minimum(question, validation, value)
142
+ # We have decided not to allow bypassing this validation when
143
+ # aborted, since whatever is using this data further on is likely not
144
+ # built to take into account values outside the intended range. (e.g.
145
+ # BMI calculation)
146
+
137
147
  return if value.blank? || (question.type == :date && value.values.all?(&:empty?))
138
148
  converted_answer_value = convert_answer_value(question, value)
139
149
  if converted_answer_value < validation[:value]
@@ -142,7 +152,13 @@ module Quby
142
152
  end
143
153
 
144
154
  def validate_maximum(question, validation, value)
155
+ # We have decided not to allow bypassing this validation when
156
+ # aborted, since whatever is using this data further on is likely not
157
+ # built to take into account values outside the intended range. (e.g.
158
+ # BMI calculation)
159
+
145
160
  return if value.blank? || (question.type == :date && value.values.all?(&:blank?))
161
+
146
162
  converted_answer_value = convert_answer_value(question, value)
147
163
  if converted_answer_value > validation[:value]
148
164
  answer.send(:add_error, question, validation[:type], validation[:message] || "Exceeds maximum")
@@ -150,12 +166,24 @@ module Quby
150
166
  end
151
167
 
152
168
  def validate_too_many_checked(question, validation, value)
169
+ # We have decided not to allow bypassing this validation when
170
+ # aborted, since it's possible to make a decision about which fields
171
+ # to keep and which ones to blank. If you want to do anything at all
172
+ # with this completion, you'll need to decide that at some point
173
+ # anyway, so we think it's best to do that as early as possible.
174
+
153
175
  if answer.send(question.uncheck_all_option) == 1 and value.values.reduce(:+) > 1
154
176
  answer.send(:add_error, question, :too_many_checked, validation[:message] || "Invalid combination of options.")
155
177
  end
156
178
  end
157
179
 
158
180
  def validate_not_all_checked(question, validation, value)
181
+ # We have decided not to allow bypassing this validation when
182
+ # aborted, since it's possible to make a decision about which fields
183
+ # to keep and which ones to blank. If you want to do anything at all
184
+ # with this completion, you'll need to decide that at some point
185
+ # anyway, so we think it's best to do that as early as possible.
186
+
159
187
  if answer.send(question.check_all_option) == 1 and
160
188
  value.values.reduce(:+) < value.length - (question.uncheck_all_option ? 1 : 0)
161
189
  answer.send(:add_error, question, :not_all_checked, validation[:message] || "Invalid combination of options.")
@@ -163,18 +191,28 @@ module Quby
163
191
  end
164
192
 
165
193
  def validate_maximum_checked_allowed(question, validation, value)
194
+ # We have decided not to allow bypassing this validation when
195
+ # aborted, since it's possible to make a decision about which fields
196
+ # to keep and which ones to blank. If you want to do anything at all
197
+ # with this completion, you'll need to decide that at some point
198
+ # anyway, so we think it's best to do that as early as possible.
199
+
166
200
  if value.values.reduce(:+) > question.maximum_checked_allowed.to_i
167
201
  answer.send(:add_error, question, :maximum_checked_allowed, validation[:message] || "Too many options checked.")
168
202
  end
169
203
  end
170
204
 
171
205
  def validate_minimum_checked_required(question, validation, value)
206
+ return if @answer.aborted
207
+
172
208
  if value.values.reduce(:+) < question.minimum_checked_required.to_i
173
209
  answer.send(:add_error, question, :minimum_checked_required, validation[:message] || "Not enough options checked.")
174
210
  end
175
211
  end
176
212
 
177
213
  def validate_answer_group_minimum(question, validation, value)
214
+ return if @answer.aborted
215
+
178
216
  answered = answer.send(:calc_answered, answer.question_groups[validation[:group]])
179
217
  if answered < validation[:value]
180
218
  answer.send(:add_error, question, :answer_group_minimum,
@@ -183,6 +221,12 @@ module Quby
183
221
  end
184
222
 
185
223
  def validate_answer_group_maximum(question, validation, value)
224
+ # We have decided not to allow bypassing this validation when
225
+ # aborted, since it's possible to make a decision about which fields
226
+ # to keep and which ones to blank. If you want to do anything at all
227
+ # with this completion, you'll need to decide that at some point
228
+ # anyway, so we think it's best to do that as early as possible.
229
+
186
230
  answered = answer.send(:calc_answered, answer.question_groups[validation[:group]])
187
231
  if answered > validation[:value]
188
232
  answer.send(:add_error, question, :answer_group_maximum,
@@ -153,6 +153,7 @@ module Quby
153
153
  table: table,
154
154
  col_span: item_json.fetch("col_span"),
155
155
  row_span: item_json.fetch("row_span"),
156
+ raw_content: item_json.fetch("raw_content", nil),
156
157
 
157
158
  # only selectable via options passed in DSL, not via DSL methods
158
159
  # many apply only to certain types of questions
@@ -377,17 +378,22 @@ module Quby
377
378
  tick_interval: chart_json.fetch("tick_interval"),
378
379
  plotbands: chart_json.fetch("plotbands").map do |plotband_json|
379
380
  {
380
- color: plotband_json.fetch("color").to_sym,
381
+ color: plotband_json.fetch("color"),
381
382
  from: plotband_json.fetch("from"),
382
383
  to: plotband_json.fetch("to")
383
384
  }
384
385
  end,
386
+ plotlines: chart_json.fetch("plotlines") { [] }.map do |plotline_json|
387
+ {
388
+ color: plotline_json.fetch("color"),
389
+ value: plotline_json.fetch("value")
390
+ }
391
+ end
385
392
  }
386
393
 
387
394
  case chart_json.fetch("type")
388
395
  when "bar_chart"
389
396
  Quby::Questionnaires::Entities::Charting::BarChart.new(chart_json.fetch("key").to_sym,
390
- plotlines: chart_json.fetch("plotlines"),
391
397
  **base_args
392
398
  )
393
399
  when "line_chart"
@@ -399,8 +405,7 @@ module Quby
399
405
  **base_args
400
406
  )
401
407
  when "radar_chart"
402
- Quby::Questionnaires::Entities::Charting::BarChart.new(chart_json.fetch("key").to_sym,
403
- plotlines: chart_json.fetch("plotlines"),
408
+ Quby::Questionnaires::Entities::Charting::RadarChart.new(chart_json.fetch("key").to_sym,
404
409
  **base_args
405
410
  )
406
411
  end
@@ -438,4 +443,4 @@ module Quby
438
443
  end
439
444
  end
440
445
  end
441
- end
446
+ end
@@ -7,12 +7,8 @@ module Quby
7
7
  module Entities
8
8
  module Charting
9
9
  class BarChart < Chart
10
- # @return [Array]
11
- attr_accessor :plotlines
12
-
13
- def initialize(key, plotlines: nil, **kwargs)
10
+ def initialize(key, **kwargs)
14
11
  super(key, **kwargs)
15
- self.plotlines = plotlines || []
16
12
  end
17
13
  end
18
14
  end
@@ -60,7 +60,10 @@ module Quby
60
60
  # @return [Array]
61
61
  attr_accessor :plotbands
62
62
 
63
- def initialize(key, title: nil, plottables: nil, y_categories: nil, y_range_categories: nil, chart_type: nil, y_range: nil, tick_interval: nil, plotbands: nil)
63
+ # @return [Array]
64
+ attr_accessor :plotlines
65
+
66
+ def initialize(key, title: nil, plottables: nil, y_categories: nil, y_range_categories: nil, chart_type: nil, y_range: nil, tick_interval: nil, plotbands: nil, plotlines: nil)
64
67
  self.key = key.to_sym
65
68
  self.title = title
66
69
  self.plottables = plottables || []
@@ -70,6 +73,7 @@ module Quby
70
73
  self.y_range = y_range
71
74
  self.tick_interval = tick_interval
72
75
  self.plotbands = plotbands || []
76
+ self.plotlines = plotlines || []
73
77
  end
74
78
 
75
79
  def type
@@ -7,12 +7,8 @@ module Quby
7
7
  module Entities
8
8
  module Charting
9
9
  class RadarChart < Chart
10
- # @return [Array]
11
- attr_accessor :plotlines
12
-
13
- def initialize(key, plotlines: nil, **kwargs)
10
+ def initialize(key, **kwargs)
14
11
  super(key, **kwargs)
15
- self.plotlines = plotlines || []
16
12
  end
17
13
  end
18
14
  end
@@ -2,18 +2,20 @@
2
2
 
3
3
  if defined?(RSpec)
4
4
  RSpec.shared_examples 'a valid backend for the questionnaires api' do
5
+ let(:api) { Quby::Questionnaires::API.new(questionnaire_repo: repo) }
6
+
5
7
  it 'supports finding a questionnaire' do
6
- expect(Quby.questionnaires.find('simple').key).to eq('simple')
8
+ expect(api.find('simple').key).to eq('simple')
7
9
  end
8
10
 
9
11
  it 'supports checking whether a questionnaire exists' do
10
- expect(Quby.questionnaires.exists? 'simple').to be_truthy
11
- expect(Quby.questionnaires.exists? 'inexistant_questionnaire').to be_falsey
12
+ expect(api.exists? 'simple').to be_truthy
13
+ expect(api.exists? 'inexistant_questionnaire').to be_falsey
12
14
  end
13
15
 
14
16
  it 'supports finding all questionnaires' do
15
- expect(Quby.questionnaires.all.map(&:key)).to include('simple')
16
- expect(Quby.questionnaires.all.map(&:key)).to include('simple_with_outcome')
17
+ expect(api.all.map(&:key)).to include('simple')
18
+ expect(api.all.map(&:key)).to include('simple_with_outcome')
17
19
  end
18
20
  end
19
21
  end
data/lib/quby/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Quby
4
- VERSION = "5.0.0"
4
+ VERSION = "5.0.5"
5
5
  end
@@ -25,8 +25,15 @@ feature 'Defining charts in a questionnaire' do
25
25
  it 'supports plotbands' do
26
26
  plotbands = questionnaire_with_chart.charts.first.plotbands
27
27
  expect(plotbands).to eq([
28
- {from: 30, to: 50, color: :yellow},
29
- {from: 50, to: 80, color: :red}
28
+ {from: 30, to: 50, color: "yellow"},
29
+ {from: 50, to: 80, color: "red"}
30
+ ])
31
+ end
32
+
33
+ it 'supports plotlines' do
34
+ plotlines = questionnaire_with_chart.charts.first.plotlines
35
+ expect(plotlines).to eq([
36
+ {value: 20, color: "green"}
30
37
  ])
31
38
  end
32
39
  end
@@ -25,7 +25,7 @@ feature 'Editing a completed answer' do
25
25
  expect(find('#answer_v_1_a2')).to be_checked
26
26
 
27
27
  # make sure subquestions of selected answers are enabled
28
- expect(find('#answer_v_1_a2_val')[:disabled]).to be_falsey
29
- expect(find('#answer_v_1_a1_val')[:disabled]).to be_truthy
28
+ expect(find('#answer_v_1_a2_val')[:disabled]).to eq 'false'
29
+ expect(find('#answer_v_1_a1_val')[:disabled]).to eq 'true'
30
30
  end
31
31
  end
@@ -64,6 +64,13 @@ shared_examples 'group_maximum_answered_tests' do
64
64
  expect_saved_value 'v_date_day', "10"
65
65
  end
66
66
 
67
+ it 'is valid when only slider question filled in' do
68
+ set_slider_value('v_slider', '50')
69
+ run_validations
70
+ expect_no_errors
71
+ # expect_saved_value 'v_slider', "50" # occasional client side rounding issue :S
72
+ end
73
+
67
74
  it 'is valid when only radio question is not filled' do
68
75
  # select_radio_option 'v_radio', 'a1'
69
76
  select_radio_option 'v_scale', 'a1'
@@ -76,6 +83,7 @@ shared_examples 'group_maximum_answered_tests' do
76
83
  fill_in_question('v_date_year', '2013')
77
84
  fill_in_question('v_date_month', '12')
78
85
  fill_in_question('v_date_day', '10')
86
+ set_slider_value('v_slider', '50')
79
87
  run_validations
80
88
  expect_no_errors
81
89
  # expect_saved_value 'v_radio', 'a1'
@@ -102,6 +110,7 @@ shared_examples 'group_maximum_answered_tests' do
102
110
  fill_in_question('v_date_year', '2013')
103
111
  fill_in_question('v_date_month', '12')
104
112
  fill_in_question('v_date_day', '10')
113
+ set_slider_value('v_slider', '50')
105
114
  run_validations
106
115
  expect_no_errors
107
116
  expect_saved_value 'v_radio', 'a1'
@@ -128,6 +137,7 @@ shared_examples 'group_maximum_answered_tests' do
128
137
  fill_in_question('v_date_year', '2013')
129
138
  fill_in_question('v_date_month', '12')
130
139
  fill_in_question('v_date_day', '10')
140
+ set_slider_value('v_slider', '50')
131
141
  run_validations
132
142
  expect_no_errors
133
143
  expect_saved_value 'v_radio', 'a1'
@@ -154,6 +164,7 @@ shared_examples 'group_maximum_answered_tests' do
154
164
  fill_in_question('v_date_year', '2013')
155
165
  fill_in_question('v_date_month', '12')
156
166
  fill_in_question('v_date_day', '10')
167
+ set_slider_value('v_slider', '50')
157
168
  run_validations
158
169
  expect_no_errors
159
170
  expect_saved_value 'v_radio', 'a1'
@@ -180,6 +191,7 @@ shared_examples 'group_maximum_answered_tests' do
180
191
  fill_in_question('v_date_year', '2013')
181
192
  fill_in_question('v_date_month', '12')
182
193
  fill_in_question('v_date_day', '10')
194
+ set_slider_value('v_slider', '50')
183
195
  run_validations
184
196
  expect_no_errors
185
197
  expect_saved_value 'v_radio', 'a1'
@@ -206,6 +218,7 @@ shared_examples 'group_maximum_answered_tests' do
206
218
  fill_in_question('v_date_year', '2013')
207
219
  fill_in_question('v_date_month', '12')
208
220
  fill_in_question('v_date_day', '10')
221
+ set_slider_value('v_slider', '50')
209
222
  run_validations
210
223
  expect_no_errors
211
224
  expect_saved_value 'v_radio', 'a1'
@@ -232,6 +245,7 @@ shared_examples 'group_maximum_answered_tests' do
232
245
  fill_in_question('v_date_year', '2013')
233
246
  fill_in_question('v_date_month', '12')
234
247
  fill_in_question('v_date_day', '10')
248
+ set_slider_value('v_slider', '50')
235
249
  run_validations
236
250
  expect_no_errors
237
251
  expect_saved_value 'v_radio', 'a1'
@@ -258,6 +272,7 @@ shared_examples 'group_maximum_answered_tests' do
258
272
  # fill_in_question('v_date_year', '2013')
259
273
  # fill_in_question('v_date_month', '12')
260
274
  # fill_in_question('v_date_day', '10')
275
+ set_slider_value('v_slider', '50')
261
276
  run_validations
262
277
  expect_no_errors
263
278
  expect_saved_value 'v_radio', 'a1'
@@ -272,6 +287,33 @@ shared_examples 'group_maximum_answered_tests' do
272
287
  # expect_saved_value 'v_date_day', "10"
273
288
  end
274
289
 
290
+ it 'is valid when only slider question is not filled' do
291
+ select_radio_option 'v_radio', 'a1'
292
+ select_radio_option 'v_scale', 'a1'
293
+ select_select_option 'v_select', 'a1'
294
+ check_option 'v_ck_a1'
295
+ uncheck_option 'v_ck_a2'
296
+ fill_in_question 'v_string', 'kittens!'
297
+ fill_in_question 'v_integer', '37'
298
+ fill_in_question 'v_float', '4.2'
299
+ fill_in_question('v_date_year', '2013')
300
+ fill_in_question('v_date_month', '12')
301
+ fill_in_question('v_date_day', '10')
302
+ # set_slider_value('v_slider', '50')
303
+ run_validations
304
+ expect_no_errors
305
+ expect_saved_value 'v_radio', 'a1'
306
+ expect_saved_value 'v_scale', 'a1'
307
+ expect_saved_value 'v_select', 'a1'
308
+ expect_saved_value 'v_check_box', {'v_ck_a1' => 1, 'v_ck_a2' => 0}
309
+ expect_saved_value 'v_string', 'kittens!'
310
+ expect_saved_value 'v_integer', "37"
311
+ expect_saved_value 'v_float', "4.2"
312
+ expect_saved_value 'v_date_year', "2013"
313
+ expect_saved_value 'v_date_month', "12"
314
+ expect_saved_value 'v_date_day', "10"
315
+ end
316
+
275
317
  it 'is not valid when all questions are filled in' do
276
318
  select_radio_option 'v_radio', 'a1'
277
319
  select_radio_option 'v_scale', 'a1'
@@ -284,6 +326,7 @@ shared_examples 'group_maximum_answered_tests' do
284
326
  fill_in_question('v_date_year', '2013')
285
327
  fill_in_question('v_date_month', '12')
286
328
  fill_in_question('v_date_day', '10')
329
+ set_slider_value('v_slider', '50')
287
330
  run_validations
288
331
  expect_errors_on_group
289
332
  end
@@ -296,7 +339,7 @@ shared_examples 'group_maximum_answered' do
296
339
  context 'maximum number of given answers in a group' do
297
340
  let(:questionnaire) do
298
341
  inject_questionnaire 'test', <<-END
299
- n = 7
342
+ n = 8
300
343
 
301
344
  panel do
302
345
  question :v_radio, type: :radio, question_group: :group1, group_maximum_answered: n do
@@ -340,6 +383,12 @@ shared_examples 'group_maximum_answered' do
340
383
  year_key: :v_date_year, month_key: :v_date_month, day_key: :v_date_day do
341
384
  title "Enter a date"
342
385
  end
386
+
387
+ question :v_slider, type: :float, as: :slider, size: 20, default_position: :hidden,
388
+ question_group: :group1, group_maximum_answered: n do
389
+ title "Slider"
390
+ validates_in_range 0..100
391
+ end
343
392
  end; end_panel
344
393
  END
345
394
  end
@@ -350,7 +399,7 @@ shared_examples 'group_maximum_answered' do
350
399
  context 'maximum number of given answers in a group, with a table in the mix' do
351
400
  let(:questionnaire) do
352
401
  inject_questionnaire 'test', <<-END
353
- n = 7
402
+ n = 8
354
403
 
355
404
  panel do
356
405
  table columns: 20 do
@@ -396,6 +445,12 @@ shared_examples 'group_maximum_answered' do
396
445
  title "Enter a date"
397
446
  end
398
447
  end
448
+
449
+ question :v_slider, type: :float, as: :slider, size: 20, default_position: :hidden,
450
+ question_group: :group1, group_maximum_answered: n do
451
+ title "Slider"
452
+ validates_in_range 0..100
453
+ end
399
454
  end; end_panel
400
455
  END
401
456
  end
@@ -427,6 +482,13 @@ shared_examples 'group_maximum_answered' do
427
482
  option :a1, value: 1, description: "Select Option 1"
428
483
  option :a2, value: 2, description: "Select Option 2"
429
484
  end
485
+
486
+ question :v_slider, type: :float, as: :slider, size: 20, default_position: :hidden,
487
+ default_invisible: true,
488
+ question_group: :grp1, group_maximum_answered: n do
489
+ title "Slider"
490
+ validates_in_range 0..100
491
+ end
430
492
  end; end_panel
431
493
  END
432
494
  end
@@ -448,6 +510,7 @@ shared_examples 'group_maximum_answered' do
448
510
  expect_error_on 'v_integer', 'answer_group_maximum'
449
511
  expect_error_on 'v_float', 'answer_group_maximum'
450
512
  expect_error_on 'v_date', 'answer_group_maximum'
513
+ expect_error_on 'v_slider', 'answer_group_maximum'
451
514
  end
452
515
  end
453
516