Skip to content
Browse files

Content type validation macro to matcher conversion

  • Loading branch information...
1 parent 4793daa commit 28242594d30995adc63454a1a141020ad0fd06da @jyurek jyurek committed Feb 7, 2009
View
1 shoulda_macros/matchers.rb
@@ -1,2 +1,3 @@
require 'shoulda_macros/matchers/have_attached_file_matcher'
require 'shoulda_macros/matchers/validate_attachment_presence_matcher'
+require 'shoulda_macros/matchers/validate_attachment_content_type_matcher'
View
66 shoulda_macros/matchers/validate_attachment_content_type_matcher.rb
@@ -0,0 +1,66 @@
+module Paperclip
+ module Shoulda
+ module Matchers
+ def validate_attachment_content_type name
+ ValidateAttachmentContentTypeMatcher.new(name)
+ end
+
+ class ValidateAttachmentContentTypeMatcher
+ def initialize attachment_name
+ @attachment_name = attachment_name
+ end
+
+ def allowing *types
+ @allowed_types = types.flatten
+ self
+ end
+
+ def rejecting *types
+ @rejected_types = types.flatten
+ self
+ end
+
+ def matches? subject
+ @subject = subject
+ @allowed_types && @rejected_types &&
+ allowed_types_allowed? && rejected_types_rejected?
+ end
+
+ def failure_message
+ "Content types #{@allowed_types.join(", ")} should be accepted" +
+ " and #{@rejected_types.join(", ")} rejected by #{@attachment_name}"
+ end
+
+ def negative_failure_message
+ "Content types #{@allowed_types.join(", ")} should be rejected" +
+ " and #{@rejected_types.join(", ")} accepted by #{@attachment_name}"
+ end
+
+ def description
+ "validate the content types allowed on attachment #{@attachment_name}"
+ end
+
+ protected
+
+ def allow_types?(types)
+ types.all? do |type|
+ file = StringIO.new(".")
+ file.content_type = type
+ attachment = @subject.new.attachment_for(@attachment_name)
+ attachment.assign(file)
+ attachment.errors[:content_type].nil?
+ end
+ end
+
+ def allowed_types_allowed?
+ allow_types?(@allowed_types)
+ end
+
+ def rejected_types_rejected?
+ not allow_types?(@rejected_types)
+ end
+ end
+ end
+ end
+end
+
View
30 test/matchers/validate_attachment_content_type_matcher_test.rb
@@ -0,0 +1,30 @@
+require 'test/helper'
+
+class ValidateAttachmentContentTypeMatcherTest < Test::Unit::TestCase
+ context "validate_attachment_content_type" do
+ setup do
+ reset_table("dummies") do |d|
+ d.string :avatar_file_name
+ end
+ @dummy_class = reset_class "Dummy"
+ @dummy_class.has_attached_file :avatar
+ @matcher = validate_attachment_content_type(:avatar).
+ allowing(%w(image/png image/jpeg)).
+ rejecting(%w(audio/mp3 application/octet-stream))
+ end
+
+ should "reject a class with no validation" do
+ assert_rejects @matcher, @dummy_class
+ end
+
+ should "reject a class with a validation that doesn't match" do
+ @dummy_class.validates_attachment_content_type :avatar, :content_type => %r{audio/.*}
+ assert_rejects @matcher, @dummy_class
+ end
+
+ should "accept a class with a validation" do
+ @dummy_class.validates_attachment_content_type :avatar, :content_type => %r{image/.*}
+ assert_accepts @matcher, @dummy_class
+ end
+ end
+end

0 comments on commit 2824259

Please sign in to comment.
Something went wrong with that request. Please try again.