Sha256: dc6e473d177ae6c830b3066bdee289c9ce786a9a9788b6aac9d2b62063074171

Contents?: true

Size: 1.54 KB

Versions: 1

Compression:

Stored size: 1.54 KB

Contents

module Remarkable::Mongoid
  module Matchers

    # Specify the document validates the uniqueness of the field's data
    #
    # examples:
    #  it { should validate_uniqueness_of :dog }
    #
    # @param [Symbol]
    #
    # @return [Remarkable::Mongoid::Matchers::ValidateUniquenessOfMatcher]
    def validate_uniqueness_of(attr)
      ValidateUniquenessOfMatcher.new(attr)
    end

    class ValidateUniquenessOfMatcher
      attr_accessor :attr, :validation_type, :message, :scope

      def initialize(attr)
        self.attr = attr.to_sym
      end

      def with_message(message)
        self.message = message
        self
      end

      def scoped_to(scope)
        self.scope = scope.is_a?(Array) ? scope.map(&:to_sym) : scope.to_sym
        self
      end

      def matches?(subject)
        @subject    = subject
        validations = @subject._validators[attr]
        if validations
          validation = validations.detect { |k| k.class == ::Mongoid::Validations::UniquenessValidator }
          validation && check_option(validation, :message) && check_option(validation, :scope)
        else
          false
        end
      end

      def description
        "validates that :#{attr} is unique"
      end

      def failure_message_for_should
        "\nUniqueness validation failure\nExpected: '#{attr}' to be unique"
      end

      private

      def check_option(validation, option)
        if self.send(option)
          validation.options[option] == self.send(option)
        else
          true
        end
      end
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
remarkable_mongoid-0.6.0 lib/remarkable/mongoid/validate_uniqueness_of.rb