require 'spec_helper' require 'paperclip/matchers' describe Paperclip::Shoulda::Matchers::ValidateAttachmentContentTypeMatcher do extend Paperclip::Shoulda::Matchers before do reset_table("dummies") do |d| d.string :title d.string :avatar_file_name d.string :avatar_content_type end reset_class "Dummy" Dummy.do_not_validate_attachment_file_type :avatar Dummy.has_attached_file :avatar end it "rejects a class with no validation" do expect(matcher).to_not accept(Dummy) end it 'rejects a class when the validation fails' do Dummy.validates_attachment_content_type :avatar, content_type: %r{audio/.*} expect(matcher).to_not accept(Dummy) end it "accepts a class with a matching validation" do Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*} expect(matcher).to accept(Dummy) end it "accepts a class with other validations but matching types" do Dummy.validates_presence_of :title Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*} expect(matcher).to accept(Dummy) end it "accepts a class that matches and a matcher that only specifies 'allowing'" do Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*} matcher = plain_matcher.allowing(%w(image/png image/jpeg)) expect(matcher).to accept(Dummy) end it "rejects a class that does not match and a matcher that only specifies 'allowing'" do Dummy.validates_attachment_content_type :avatar, content_type: %r{audio/.*} matcher = plain_matcher.allowing(%w(image/png image/jpeg)) expect(matcher).to_not accept(Dummy) end it "accepts a class that matches and a matcher that only specifies 'rejecting'" do Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*} matcher = plain_matcher.rejecting(%w(audio/mp3 application/octet-stream)) expect(matcher).to accept(Dummy) end it "rejects a class that does not match and a matcher that only specifies 'rejecting'" do Dummy.validates_attachment_content_type :avatar, content_type: %r{audio/.*} matcher = plain_matcher.rejecting(%w(audio/mp3 application/octet-stream)) expect(matcher).to_not accept(Dummy) end context "using an :if to control the validation" do before do Dummy.class_eval do validates_attachment_content_type :avatar, content_type: %r{image/*} , if: :go attr_accessor :go end end it "runs the validation if the control is true" do dummy = Dummy.new dummy.go = true expect(matcher).to accept(dummy) end it "does not run the validation if the control is false" do dummy = Dummy.new dummy.go = false expect(matcher).to_not accept(dummy) end end private def plain_matcher self.class.validate_attachment_content_type(:avatar) end def matcher plain_matcher. allowing(%w(image/png image/jpeg)). rejecting(%w(audio/mp3 application/octet-stream)) end end