diff --git a/.rspec_status b/.rspec_status index 30a9e81..aaddb42 100644 --- a/.rspec_status +++ b/.rspec_status @@ -154,6 +154,11 @@ example_id | status | run_tim ./spec/castkit/ext/data_object/serialization_spec.rb[1:3:1] | passed | 0.00004 seconds | ./spec/castkit/ext/data_object/serialization_spec.rb[1:4:1] | passed | 0.00003 seconds | ./spec/castkit/ext/data_object/serialization_spec.rb[1:4:2] | passed | 0.00003 seconds | +./spec/castkit/validators/boolean_validator_spec.rb[1:1:1] | passed | 0.00054 seconds | +./spec/castkit/validators/boolean_validator_spec.rb[1:1:2] | passed | 0.00004 seconds | +./spec/castkit/validators/boolean_validator_spec.rb[1:1:3] | passed | 0.00003 seconds | +./spec/castkit/validators/boolean_validator_spec.rb[1:1:4] | passed | 0.00068 seconds | +./spec/castkit/validators/boolean_validator_spec.rb[1:2:1] | passed | 0.00004 seconds | ./spec/castkit/validators/numeric_validator_spec.rb[1:1:1:1] | passed | 0.00005 seconds | ./spec/castkit/validators/numeric_validator_spec.rb[1:1:2:1] | passed | 0.00009 seconds | ./spec/castkit/validators/numeric_validator_spec.rb[1:1:3:1] | passed | 0.00003 seconds | diff --git a/lib/castkit/validators/boolean_validator.rb b/lib/castkit/validators/boolean_validator.rb index 527d8f8..570bf76 100644 --- a/lib/castkit/validators/boolean_validator.rb +++ b/lib/castkit/validators/boolean_validator.rb @@ -16,15 +16,15 @@ module Validators # validator.call("true", _options: {}, context: :enabled) # => true # validator.call("0", _options: {}, context: :enabled) # => false # validator.call("nope", _options: {}, context: :enabled) # raises Castkit::AttributeError - class BooleanValidator + class BooleanValidator < Castkit::Validators::Base # Validates the Boolean value. # # @param value [Object] the input to validate - # @param _options [Hash] unused, provided for consistency with other validators + # @param options [Hash] unused, provided for consistency with other validators # @param context [Symbol, String] the attribute name or path for error messages # @return [Boolean] # @raise [Castkit::AttributeError] if the value is not a recognizable boolean - def call(value, _options:, context:) + def call(value, options:, context:) # rubocop:disable Lint/UnusedMethodArgument case value.to_s.downcase when "true", "1" true diff --git a/spec/castkit/validators/boolean_validator_spec.rb b/spec/castkit/validators/boolean_validator_spec.rb new file mode 100644 index 0000000..7e2027c --- /dev/null +++ b/spec/castkit/validators/boolean_validator_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require "spec_helper" +require "castkit/validators/boolean_validator" + +RSpec.describe Castkit::Validators::BooleanValidator do + subject(:validator) { described_class.new } + + describe "#call" do + it "returns true for truthy strings" do + expect(validator.call("true", options: {}, context: :enabled)).to be(true) + end + + it "returns true for actual booleans" do + expect(validator.call(true, options: {}, context: :enabled)).to be(true) + end + + it "returns false for falsy numeric strings" do + expect(validator.call("0", options: {}, context: :enabled)).to be(false) + end + + it "raises for unrecognized values" do + expect do + validator.call("maybe", options: {}, context: :enabled) + end.to raise_error(Castkit::AttributeError, /enabled must be a boolean/) + end + end + + describe ".call" do + it "instantiates and validates via class-level call" do + expect(described_class.call("1", options: {}, context: :enabled)).to be(true) + end + end +end