carrierwaveuploader--carrie.../spec/processing/rmagick_spec.rb

237 lines
8.7 KiB
Ruby

require 'spec_helper'
describe CarrierWave::RMagick, :rmagick => true do
before do
@klass = Class.new(CarrierWave::Uploader::Base) do
include CarrierWave::RMagick
end
@instance = @klass.new
FileUtils.cp(file_path('landscape.jpg'), file_path('landscape_copy.jpg'))
allow(@instance).to receive(:cached?).and_return true
allow(@instance).to receive(:file).and_return(CarrierWave::SanitizedFile.new(file_path('landscape_copy.jpg')))
end
after do
FileUtils.rm(file_path('landscape_copy.jpg')) if File.exist?(file_path('landscape_copy.jpg'))
FileUtils.rm(file_path('landscape_copy.png')) if File.exist?(file_path('landscape_copy.png'))
end
describe '#convert' do
it "should convert the image to the given format" do
@instance.convert(:png)
expect(@instance.file.extension).to eq('png')
expect(@instance).to be_format('png')
end
end
describe '#resize_to_fill' do
it "should resize the image to exactly the given dimensions and maintain file type" do
@instance.resize_to_fill(200, 200)
expect(@instance).to have_dimensions(200, 200)
expect(::Magick::Image.read(@instance.current_path).first.format).to eq('JPEG')
end
it "should resize the image to exactly the given dimensions and maintain updated file type" do
@instance.convert('png')
@instance.resize_to_fill(200, 200)
expect(@instance).to have_dimensions(200, 200)
expect(::Magick::Image.read(@instance.current_path).first.format).to eq('PNG')
expect(@instance.file.extension).to eq('png')
end
it "should scale up the image if it smaller than the given dimensions" do
@instance.resize_to_fill(1000, 1000)
expect(@instance).to have_dimensions(1000, 1000)
end
end
describe '#resize_and_pad' do
it "should resize the image to exactly the given dimensions and maintain file type" do
@instance.resize_and_pad(200, 200)
expect(@instance).to have_dimensions(200, 200)
expect(::Magick::Image.read(@instance.current_path).first.format).to eq('JPEG')
end
it "should resize the image to exactly the given dimensions and maintain updated file type" do
@instance.convert('png')
@instance.resize_and_pad(200, 200)
expect(@instance).to have_dimensions(200, 200)
expect(::Magick::Image.read(@instance.current_path).first.format).to eq('PNG')
expect(@instance.file.extension).to eq('png')
end
it "should pad with white" do
@instance.resize_and_pad(200, 200)
color = color_of_pixel(@instance.current_path, 0, 0)
expect(color).to include('#FFFFFF')
expect(color).not_to include('#FFFFFF00')
end
it "should pad with transparent" do
@instance.convert('png')
@instance.resize_and_pad(200, 200, :transparent)
color = color_of_pixel(@instance.current_path, 0, 0)
expect(color).to include('#FFFFFF00')
end
it "should not pad with transparent" do
@instance.resize_and_pad(200, 200, :transparent)
@instance.convert('png')
color = color_of_pixel(@instance.current_path, 0, 0)
expect(color).to include('#FFFFFF')
expect(color).not_to include('#FFFFFF00')
end
it "should pad with given color" do
@instance.resize_and_pad(200, 200, '#888')
color = color_of_pixel(@instance.current_path, 0, 0)
expect(color).to include('#888888')
end
it "should scale up the image if it smaller than the given dimensions" do
@instance.resize_and_pad(1000, 1000)
expect(@instance).to have_dimensions(1000, 1000)
end
end
describe '#resize_to_fit' do
it "should resize the image to fit within the given dimensions and maintain file type" do
@instance.resize_to_fit(200, 200)
expect(@instance).to have_dimensions(200, 150)
expect(::Magick::Image.read(@instance.current_path).first.format).to eq('JPEG')
end
it "should resize the image to fit within the given dimensions and maintain updated file type" do
@instance.convert('png')
@instance.resize_to_fit(200, 200)
expect(@instance).to have_dimensions(200, 150)
expect(::Magick::Image.read(@instance.current_path).first.format).to eq('PNG')
end
it "should scale up the image if it smaller than the given dimensions" do
@instance.resize_to_fit(1000, 1000)
expect(@instance).to have_dimensions(1000, 750)
end
end
describe '#resize_to_limit' do
it "should resize the image to fit within the given dimensions and maintain file type" do
@instance.resize_to_limit(200, 200)
expect(@instance).to have_dimensions(200, 150)
expect(::Magick::Image.read(@instance.current_path).first.format).to eq('JPEG')
end
it "should resize the image to fit within the given dimensions and maintain updated file type" do
@instance.convert('png')
@instance.resize_to_limit(200, 200)
expect(@instance).to have_dimensions(200, 150)
expect(::Magick::Image.read(@instance.current_path).first.format).to eq('PNG')
expect(@instance.file.extension).to eq('png')
end
it "should not scale up the image if it smaller than the given dimensions" do
@instance.resize_to_limit(1000, 1000)
expect(@instance).to have_dimensions(640, 480)
end
end
describe '#resize_to_geometry_string' do
it "should resize the image to comply with `200x200^` Geometry String spec and maintain file type" do
@instance.resize_to_geometry_string('200x200^')
expect(@instance).to have_dimensions(267, 200)
expect(::Magick::Image.read(@instance.current_path).first.format).to eq('JPEG')
end
it "should resize the image to comply with `200x200^` Geometry String spec and maintain updated file type" do
@instance.convert('png')
@instance.resize_to_geometry_string('200x200^')
expect(@instance).to have_dimensions(267, 200)
expect(::Magick::Image.read(@instance.current_path).first.format).to eq('PNG')
expect(@instance.file.extension).to eq('png')
end
it "should resize the image to have 125% larger dimensions" do
@instance.resize_to_geometry_string('125%')
expect(@instance).to have_dimensions(800, 600)
end
it "should resize the image to have a given height" do
@instance.resize_to_geometry_string('x256')
expect(@instance).to have_height(256)
end
it "should resize the image to have a given width" do
@instance.resize_to_geometry_string('256x')
expect(@instance).to have_width(256)
end
end
describe "#manipulate!" do
it 'should support passing write options to RMagick' do
image = ::Magick::Image.read(file_path('landscape_copy.jpg'))
allow(::Magick::Image).to receive_messages(:read => image)
expect_any_instance_of(::Magick::Image::Info).to receive(:quality=).with(50)
expect_any_instance_of(::Magick::Image::Info).to receive(:depth=).with(8)
@instance.manipulate! do |image, index, options|
options[:write] = {
:quality => 50,
:depth => 8
}
image
end
end
it 'should support passing read options to RMagick' do
expect_any_instance_of(::Magick::Image::Info).to receive(:density=).with(10)
expect_any_instance_of(::Magick::Image::Info).to receive(:size=).with("200x200")
@instance.manipulate! :read => {
:density => 10,
:size => %{"200x200"}
}
end
end
describe "#width and #height" do
it "should return the width and height of the image" do
@instance.resize_to_fill(200, 300)
expect(@instance.width).to eq(200)
expect(@instance.height).to eq(300)
end
end
describe "test errors" do
context "invalid image file" do
before do
File.open(@instance.current_path, 'w') do |f|
f.puts "bogus"
end
end
it "should fail to process a non image file" do
expect {@instance.resize_to_limit(200, 200)}.to raise_exception(CarrierWave::ProcessingError, /^Failed to manipulate with rmagick, maybe it is not an image\?/)
end
it "should use I18n" do
change_locale_and_store_translations(:nl, :errors => {
:messages => {
:rmagick_processing_error => "Kon bestand niet met rmagick bewerken, misschien is het geen beeld bestand?"
}
}) do
expect {@instance.resize_to_limit(200, 200)}.to raise_exception(CarrierWave::ProcessingError, /^Kon bestand niet met rmagick bewerken, misschien is het geen beeld bestand\?/)
end
end
it "should not suppress errors when translation is unavailable" do
change_locale_and_store_translations(:foo, {}) do
expect do
@instance.resize_to_limit(200, 200)
end.to raise_exception( CarrierWave::ProcessingError )
end
end
end
end
end