class ActiveStorageValidations::Matchers::ContentTypeValidatorMatcher

Public Class Methods

new(attribute_name) click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 12
def initialize(attribute_name)
  @attribute_name = attribute_name
end

Public Instance Methods

allowing(*types) click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 20
def allowing(*types)
  @allowed_types = types.flatten
  self
end
description() click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 16
def description
  "validate the content types allowed on attachment #{@attribute_name}"
end
failure_message() click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 35
      def failure_message
        <<~MESSAGE
          Expected #{@attribute_name}
            
            Accept content types: #{allowed_types.join(", ")}
              #{accepted_types_and_failures}

            Reject content types: #{rejected_types.join(", ")}
              #{rejected_types_and_failures}
        MESSAGE
      end
matches?(subject) click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 30
def matches?(subject)
  @subject = subject.is_a?(Class) ? subject.new : subject
  responds_to_methods && allowed_types_allowed? && rejected_types_rejected?
end
rejecting(*types) click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 25
def rejecting(*types)
  @rejected_types = types.flatten
  self
end

Protected Instance Methods

accepted_types_and_failures() click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 73
def accepted_types_and_failures
  if @missing_allowed_types.present?
    "#{@missing_allowed_types.join(", ")} were rejected."
  else
    "All were accepted successfully."
  end
end
allowed_types() click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 55
def allowed_types
  @allowed_types || []
end
allowed_types_allowed?() click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 63
def allowed_types_allowed?
  @missing_allowed_types ||= allowed_types.reject { |type| type_allowed?(type) }
  @missing_allowed_types.none?
end
attachment_for(type) click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 95
def attachment_for(type)
  suffix = type.to_s.split('/').last
  { io: Tempfile.new('.'), filename: "test.#{suffix}", content_type: type }
end
rejected_types() click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 59
def rejected_types
  @rejected_types || (Marcel::TYPES.keys - allowed_types)
end
rejected_types_and_failures() click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 81
def rejected_types_and_failures
  if @missing_rejected_types.present?
    "#{@missing_rejected_types.join(", ")} were accepted."
  else
    "All were rejected successfully."
  end
end
rejected_types_rejected?() click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 68
def rejected_types_rejected?
  @missing_rejected_types ||= rejected_types.select { |type| type_allowed?(type) }
  @missing_rejected_types.none?
end
responds_to_methods() click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 49
def responds_to_methods
  @subject.respond_to?(@attribute_name) &&
    @subject.public_send(@attribute_name).respond_to?(:attach) &&
    @subject.public_send(@attribute_name).respond_to?(:detach)
end
type_allowed?(type) click to toggle source
# File lib/active_storage_validations/matchers/content_type_validator_matcher.rb, line 89
def type_allowed?(type)
  @subject.public_send(@attribute_name).attach(attachment_for(type))
  @subject.validate
  @subject.errors.details[@attribute_name].all? { |error| error[:error] != :content_type_invalid }
end