require 'spec_helper' require 'pathname' require 'middleman-core' require_relative '../../lib/middleman-webp/converter' describe Middleman::WebP::Converter do before do @app_mock = stub(config: { build_dir: 'spec/fixtures/dummy-build' }) @converter = Middleman::WebP::Converter.new @app_mock, nil end describe '#destination_path' do it 'returns file name with same basename and webp suffix' do d = @converter.destination_path(Pathname.new('build/images/sample.jpg')) d.to_s.must_equal 'build/images/sample.webp' end end describe '#destination_path with append_extension = true' do before do @converter = Middleman::WebP::Converter.new @app_mock, nil, append_extension: true end it 'returns file name with same basename and webp suffix' do d = @converter.destination_path(Pathname.new('build/images/sample.jpg')) d.to_s.must_equal 'build/images/sample.jpg.webp' end end describe '#change_percentage' do it 'returns how many percents smaller destination file is' do @converter.change_percentage(10_000, 8746).must_equal '12.54 %' end it 'omits zeroes in the end of decimal part' do @converter.change_percentage(100, 76).must_equal '24 %' end it 'returns 0% when original and new size are both 0' do @converter.change_percentage(0, 0).must_equal '0 %' end end describe '#number_to_human_size' do it 'uses human readable unit' do @converter.number_to_human_size(100).must_equal '100 B' @converter.number_to_human_size(1234).must_equal '1.21 KiB' @converter.number_to_human_size(2_634_234).must_equal '2.51 MiB' end it 'handles zero size properly' do @converter.number_to_human_size(0).must_equal '0 B' end end describe '#tool_for' do it 'uses gif2webp for gif files' do path = Pathname.new('/some/path/image.gif') @converter.tool_for(path).must_equal 'gif2webp' end it 'uses cwebp for jpeg, png and tiff files' do @converter.tool_for(Pathname('/some/path/image.jpg')).must_equal 'cwebp' @converter.tool_for(Pathname('/some/path/image.png')).must_equal 'cwebp' @converter.tool_for(Pathname('/some/path/image.tiff')).must_equal 'cwebp' end end describe '#image_files' do it 'includes all image files in Middleman build dir' do @converter.image_files.size.must_equal 3 end it 'won\'t include ignored files' do @converter = Middleman::WebP::Converter.new @app_mock, nil, ignore: [/jpg$/, '**/*.gif'] files_to_include = [Pathname('spec/fixtures/dummy-build/empty.png')] @converter.image_files.must_equal files_to_include end it 'won\'t include files rejected by given proc' do options = { ignore: ->(path) { path.end_with? 'jpg' } } @converter = Middleman::WebP::Converter.new @app_mock, nil, options @converter.image_files.size.must_equal 2 end end end