validates input_options based on input type
This commit is contained in:
parent
404555f674
commit
bdec83b3b6
@ -4,8 +4,17 @@ class Question < ApplicationRecord
|
|||||||
has_many :answers
|
has_many :answers
|
||||||
belongs_to :quiz
|
belongs_to :quiz
|
||||||
|
|
||||||
validates_presence_of :quiz_id
|
before_validation :compact_input_options
|
||||||
validates_presence_of :question
|
|
||||||
validates_presence_of :category
|
validates :quiz_id, presence: true
|
||||||
validates_presence_of :input_type
|
validates :question, presence: true
|
||||||
|
validates :category, presence: true
|
||||||
|
validates :input_type, presence: true
|
||||||
|
validates :input_options, input_options_presence: true
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def compact_input_options
|
||||||
|
self.input_options = input_options.reject(&:blank?)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
11
app/validators/input_options_presence_validator.rb
Normal file
11
app/validators/input_options_presence_validator.rb
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
class InputOptionsPresenceValidator < ActiveModel::EachValidator
|
||||||
|
def validate_each(record, attribute, value)
|
||||||
|
return true unless record.input_type =~ /radio|check/i
|
||||||
|
return true if value.present? && value.count > 0
|
||||||
|
|
||||||
|
record.errors[attribute] << (options[:message] ||
|
||||||
|
"You must provide answer options for the selected input type.")
|
||||||
|
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
@ -1,7 +1,14 @@
|
|||||||
require 'test_helper'
|
require 'test_helper'
|
||||||
|
|
||||||
class QuestionTest < ActiveSupport::TestCase
|
class QuestionTest < ActiveSupport::TestCase
|
||||||
# test "the truth" do
|
test 'should compact arrays for input_options' do
|
||||||
# assert true
|
question = Question.new(quiz_id: quizzes(:fed).to_i,
|
||||||
# end
|
question: 'foo',
|
||||||
|
category: 'bar',
|
||||||
|
input_type: 'radio',
|
||||||
|
input_options: ['one', 'two', '', ' ', nil])
|
||||||
|
question.validate
|
||||||
|
|
||||||
|
assert_equal 2, question.input_options.count
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
6
test/test_helpers/input_options_validatable.rb
Normal file
6
test/test_helpers/input_options_validatable.rb
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
class InputOptionsValidatable
|
||||||
|
include ActiveModel::Validations
|
||||||
|
attr_accessor :input_type
|
||||||
|
attr_accessor :input_options
|
||||||
|
validates :input_options, input_options_presence: true
|
||||||
|
end
|
49
test/validators/input_options_presence_validator_test.rb
Normal file
49
test/validators/input_options_presence_validator_test.rb
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class InputOptionsPresenceValidatorTest < ActiveSupport::TestCase
|
||||||
|
test "should pass when inpute type not radio or checkbox" do
|
||||||
|
obj = InputOptionsValidatable.new
|
||||||
|
obj.input_type = "text"
|
||||||
|
|
||||||
|
assert obj.valid?
|
||||||
|
assert_equal 0, obj.errors.messages[:input_options].count
|
||||||
|
end
|
||||||
|
|
||||||
|
test "should fail when missing options for radio" do
|
||||||
|
obj = InputOptionsValidatable.new
|
||||||
|
obj.input_type = "radio"
|
||||||
|
obj.input_options = nil
|
||||||
|
obj.valid?
|
||||||
|
|
||||||
|
refute obj.errors.messages.empty?, 'needs an error message'
|
||||||
|
assert_match(/provide.*option/i, obj.errors.messages[:input_options].join)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "should pass when provided options for radio" do
|
||||||
|
obj = InputOptionsValidatable.new
|
||||||
|
obj.input_type = "radio"
|
||||||
|
obj.input_options = ['one', 'two', nil]
|
||||||
|
|
||||||
|
assert obj.valid?
|
||||||
|
assert_equal 0, obj.errors.messages[:input_options].count
|
||||||
|
end
|
||||||
|
|
||||||
|
test "should fail when missing options for checkbox" do
|
||||||
|
obj = InputOptionsValidatable.new
|
||||||
|
obj.input_type = "checkbox"
|
||||||
|
obj.input_options = nil
|
||||||
|
obj.valid?
|
||||||
|
|
||||||
|
refute obj.errors.messages.empty?, 'needs an error message'
|
||||||
|
assert_match(/provide.*option/i, obj.errors.messages[:input_options].join)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "should pass when provided options for checkbox" do
|
||||||
|
obj = InputOptionsValidatable.new
|
||||||
|
obj.input_type = "checkbox"
|
||||||
|
obj.input_options = ['one', 'two', nil]
|
||||||
|
|
||||||
|
assert obj.valid?
|
||||||
|
assert_equal 0, obj.errors.messages[:input_options].count
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user