MLSDev/easy-matchers

View on GitHub
lib/matchers/validations/length_of.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Easy
  module Matchers
    module Validations
      def validate_length_of(*attributes)
        ValidateLengthOfMatcher.new(attributes)
      end

      class ValidateLengthOfMatcher < BaseValidationMatcher
        def initialize(attributes)
          super(attributes, :length)
        end

        def matches?(subject)
          super(subject)

          matched_validator = class_name.validators.detect do |validator|
            validator.kind == type &&
              validator.attributes.sort == attributes.sort &&
              validator.options.sort == options.sort
          end

          true if matched_validator
        end

        def with_message(message)
          options[:message] = message
          self
        end

        def with_if(symbol_name)
          options[:if] = symbol_name
          self
        end

        def with_unless(symbol_name)
          options[:unless] = symbol_name
          self
        end

        def on(context)
          options[:on] = context
          self
        end

        def allow_nil(value = true)
          options[:allow_nil] = value
          self
        end

        def allow_blank(value = true)
          options[:allow_blank] = value
          self
        end

        def strict(value)
          options[:strict] = value
          self
        end

        def is_at_most(value)
          options[:maximum] = value
          self
        end

        def is_at_least(value)
          options[:minimum] = value
          self
        end

        # def is_equal_to
        #   @is = value
        #   self
        # end

        def description
          description = "ensure #{ attributes.join(', ') } has a length "
        #   options_desc = []
        #   options_desc << "with minimum of #{ @minimum }" if @minimum
        #   options_desc << "with maximum of #{ @maximum }" if @maximum
        #   # options_desc << "within the range of #{ @within }" if @within
        #   # options_desc << "as exactly #{ @is }" if @is
        #   options_desc << "with message '#{ @expected_message }'" if @expected_message
        #   super << " #{ options_desc.to_sentence }"
          description
        end

        private

        # # def check_exact
        # #   if actual_is == @is
        # #     @positive_result_message << " as exactly #{@is}"
        # #   else
        # #     @negative_result_message << " as exactly #{actual_is}"
        # #     @result = false
        # #   end
        # # end
        #
        # def check_expected_message
        #   actual_message = @validator.options[:message]
        #   if actual_message.nil?
        #     @negative_result_message << ' with no custom message'
        #     @result = false
        #   elsif actual_message == @expected_message
        #     @positive_result_message << " with custom message '#{ @expected_message }'"
        #   else
        #     @negative_result_message << " got message '#{ actual_message }'"
        #     @result = false
        #   end
        # end
      end
    end
  end
end