require 'spec_helper' describe IMGKit do context "initialization" do it "should accept HTML as the source" do imgkit = IMGKit.new('

Oh Hai

') imgkit.source.should be_html imgkit.source.to_s.should == '

Oh Hai

' end it "should accept a URL as the source" do imgkit = IMGKit.new('http://google.com') imgkit.source.should be_url imgkit.source.to_s.should == 'http://google.com' end it "should accept a File as the source" do file_path = File.join(SPEC_ROOT,'fixtures','example.html') imgkit = IMGKit.new(File.new(file_path)) imgkit.source.should be_file imgkit.source.to_s.should == file_path end it "should provide no default options" do end it "should set a default height" do imgkit = IMGKit.new('

Oh Hai

') imgkit.options.length.should be 1 imgkit.options[:height].should be 0 end =begin it "should default to 'UTF-8' encoding" do imgkit = IMGKit.new('Captación') end =end it "should not have any stylesheet by default" do imgkit = IMGKit.new('

Oh Hai

') imgkit.stylesheets.should be_empty end end context "command" do it "should contstruct the correct command" do imgkit = IMGKit.new('html') imgkit.command[0].should include('wkhtmltoimage') imgkit.command.should include('-') end it "should parse the options into a cmd line friedly format" do imgkit = IMGKit.new('html', :quality => 75) imgkit.command.should include('--quality') end it "will not include default options it is told to omit" do imgkit = IMGKit.new('html') imgkit = IMGKit.new('html', :disable_smart_shrinking => false) imgkit.command.should_not include('--disable-smart-shrinking') end it "should encapsulate string arguments in quotes" do imgkit = IMGKit.new('html', :header_center => "foo [page]") imgkit.command[imgkit.command.index('--header-center') + 1].should == 'foo [page]' end it "should properly handle multi-part arguments" do imgkit = IMGKit.new('html', :custom_header => ['User-Agent', 'some user agent']) imgkit.command[imgkit.command.index('--custom-header') + 1].should == 'User-Agent' imgkit.command[imgkit.command.index('--custom-header') + 2].should == 'some user agent' end it "read the source from stdin if it is html" do imgkit = IMGKit.new('html') imgkit.command[-2..-1].should == ['-', '-'] end it "specify the URL to the source if it is a url" do imgkit = IMGKit.new('http://google.com') imgkit.command[-2..-1].should == ['http://google.com', '-'] end it "should specify the path to the source if it is a file" do file_path = File.join(SPEC_ROOT,'fixtures','example.html') imgkit = IMGKit.new(File.new(file_path)) imgkit.command[-2..-1].should == [file_path, '-'] end it "should detect special imgkit meta tags" do body = %{ } imgkit = IMGKit.new(body) imgkit.command[imgkit.command.index('--page-size') + 1].should == 'Legal' imgkit.command[imgkit.command.index('--orientation') + 1].should == 'Landscape' imgkit.command[imgkit.command.index('--crop-h') + 1].should == '900' end end context "#to_img(format = nil)" do def filetype_of(img) result = nil tmpfile = Tempfile.new('imgkit') File.open(tmpfile.path, 'w') { |f| f << img } result = `file #{tmpfile.path}` tmpfile.unlink() result end it "should generate a IMG of the HTML" do imgkit = IMGKit.new('html') img = imgkit.to_img filetype_of(img).should include('JPEG') end it "should generate an Image with a numerical parameter" do imgkit = IMGKit.new('html', :quality => 50) img = imgkit.to_img filetype_of(img).should include('JPEG') end it "should generate an Image with a symbol parameter" do imgkit = IMGKit.new('html', :username => 'chris') img = imgkit.to_img filetype_of(img).should include('JPEG') end it "should have the stylesheet added to the head if it has one" do imgkit = IMGKit.new("Hai!") css = File.join(SPEC_ROOT,'fixtures','example.css') imgkit.stylesheets << css imgkit.to_img imgkit.source.to_s.should include("") end it "should accept stylesheet as an object which responds to #read" do imgkit = IMGKit.new("Hai!") css = StringIO.new( File.read(File.join(SPEC_ROOT,'fixtures','example.css')) ) imgkit.stylesheets << css imgkit.to_img imgkit.source.to_s.should include("") end it "should prepend style tags if the HTML doesn't have a head tag" do imgkit = IMGKit.new("Hai!") css = File.join(SPEC_ROOT,'fixtures','example.css') imgkit.stylesheets << css imgkit.to_img imgkit.source.to_s.should include("") end it "should throw an error if the source is not html and stylesheets have been added" do imgkit = IMGKit.new('http://google.com') css = File.join(SPEC_ROOT,'fixtures','example.css') imgkit.stylesheets << css lambda { imgkit.to_img }.should raise_error(IMGKit::ImproperSourceError) end def set_wkhtmltoimage_binary(binary) spec_dir = File.dirname(__FILE__) IMGKit.configuration.should_receive(:wkhtmltoimage).at_least(1).times.and_return(File.join(spec_dir, binary)) end it "should throw an error if the wkhtmltoimage command fails" do set_wkhtmltoimage_binary 'error_binary' imgkit = IMGKit.new('http://www.example.com') lambda { imgkit.to_img }.should raise_error(IMGKit::CommandFailedError) end it "should be able to handle lots of error output" do set_wkhtmltoimage_binary 'warning_binary' imgkit = IMGKit.new("Hai!") imgkit.to_img.should == "result\n" end context "when there is no format" do it "should fallback to jpg" do IMGKit.new("Hello, world").to_img.should be_a(:jpg) end context "when a default_format has been configured" do before do IMGKit.configure do |config| config.default_format = :png end end after do IMGKit.configure do |config| config.default_format = :jpg end end it "should use the configured format" do IMGKit.new("Oh hai!").to_img.should be_a(:png) end end end context "when format = :jpg" do it "should create a jpg" do IMGKit.new("Hello, world").to_img(:jpg).should be_a(:jpg) end end context "when format is a known format" do it "should create an image with that format" do IMGKit::KNOWN_FORMATS.each do |format| IMGKit.new("Hello, world").to_img(format).should be_a(format) end end end context "when format is unknown" do it "should raise an UnknownFormatError" do lambda { IMGKit.new("Hello, world").to_img(:blah) }.should raise_error(IMGKit::UnknownFormatError) end end end context "#to_" do IMGKit::KNOWN_FORMATS.each do |format| describe "#to_#{format}" do it "should create a #{format}" do IMGKit.new("Hello").send("to_#{format}").should be_a(format) end end end end context "#to_" do it "should raise and UnknownFormatError" do lambda { IMGKit.new("Hello, world").to_blah }.should raise_error(IMGKit::UnknownFormatError) end end context "#to_file" do before do @file_path = File.join(SPEC_ROOT,'fixtures','test.jpg') File.delete(@file_path) if File.exist?(@file_path) end after do File.delete(@file_path) if File.exist?(@file_path) end it "should create a file with the result of :to_img as content" do imgkit = IMGKit.new('html', :quality => 50) imgkit.expects(:to_img).returns('CONTENT') file = imgkit.to_file(@file_path) file.should be_instance_of(File) File.read(file.path).should == 'CONTENT' end IMGKit::KNOWN_FORMATS.each do |format| it "should use the extension #{format} as the format" do @file_path = File.join(SPEC_ROOT,'fixtures',"test.#{format}") imgkit = IMGKit.new('html', :quality => 50) file = imgkit.to_file(@file_path) file.should be_instance_of(File) File.open(file.path, "r:ASCII-8BIT") { |f| f.read.should be_a(format) } end end it "should raise UnknownFormatError when format is unknown" do kit = IMGKit.new("html") lambda { kit.to_file("file.bad_format") }.should raise_error(IMGKit::UnknownFormatError) end it "should not create the file if format is unknown" do kit = IMGKit.new("html") kit.to_file("file.bad_format") rescue nil File.exist?("file.bad_format").should be_false end end context "security" do before do @test_path = File.join(SPEC_ROOT,'fixtures','security-oops') File.delete(@test_path) if File.exist?(@test_path) end after do File.delete(@test_path) if File.exist?(@test_path) end it "should not allow shell injection in options" do imgkit = IMGKit.new('html', :password => "blah\"; touch #{@test_path} #") imgkit.to_img File.exist?(@test_path).should be_false end end end