spec/pdfkit_spec.rb in pdfkit-0.4.6 vs spec/pdfkit_spec.rb in pdfkit-0.5.0

- old
+ new

@@ -1,178 +1,188 @@ +#encoding: UTF-8 require 'spec_helper' describe PDFKit do - + context "initialization" do it "should accept HTML as the source" do pdfkit = PDFKit.new('<h1>Oh Hai</h1>') pdfkit.source.should be_html pdfkit.source.to_s.should == '<h1>Oh Hai</h1>' end - + it "should accept a URL as the source" do pdfkit = PDFKit.new('http://google.com') pdfkit.source.should be_url pdfkit.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') pdfkit = PDFKit.new(File.new(file_path)) pdfkit.source.should be_file pdfkit.source.to_s.should == file_path end - + it "should parse the options into a cmd line friedly format" do pdfkit = PDFKit.new('html', :page_size => 'Letter') pdfkit.options.should have_key('--page-size') end - + it "should provide default options" do pdfkit = PDFKit.new('<h1>Oh Hai</h1>') - ['--disable-smart-shrinking', '--margin-top', '--margin-right', '--margin-bottom', '--margin-left'].each do |option| + ['--margin-top', '--margin-right', '--margin-bottom', '--margin-left'].each do |option| pdfkit.options.should have_key(option) end end - + it "should default to 'UTF-8' encoding" do pdfkit = PDFKit.new('Captación') pdfkit.options['--encoding'].should == 'UTF-8' end - + it "should not have any stylesheedt by default" do pdfkit = PDFKit.new('<h1>Oh Hai</h1>') pdfkit.stylesheets.should be_empty end end - + context "command" do it "should contstruct the correct command" do pdfkit = PDFKit.new('html', :page_size => 'Letter', :toc_l1_font_size => 12) pdfkit.command[0].should include('wkhtmltopdf') - pdfkit.command[pdfkit.command.index('--page-size') + 1].should == 'Letter' - pdfkit.command[pdfkit.command.index('--toc-l1-font-size') + 1].should == '12' + pdfkit.command[pdfkit.command.index('"--page-size"') + 1].should == '"Letter"' + pdfkit.command[pdfkit.command.index('"--toc-l1-font-size"') + 1].should == '"12"' end - + it "will not include default options it is told to omit" do + PDFKit.configure do |config| + config.default_options[:disable_smart_shrinking] = true + end + pdfkit = PDFKit.new('html') - pdfkit.command.should include('--disable-smart-shrinking') + pdfkit.command.should include('"--disable-smart-shrinking"') pdfkit = PDFKit.new('html', :disable_smart_shrinking => false) - pdfkit.command.should_not include('--disable-smart-shrinking') + pdfkit.command.should_not include('"--disable-smart-shrinking"') end - + it "should encapsulate string arguments in quotes" do pdfkit = PDFKit.new('html', :header_center => "foo [page]") - pdfkit.command[pdfkit.command.index('--header-center') + 1].should == 'foo [page]' + pdfkit.command[pdfkit.command.index('"--header-center"') + 1].should == '"foo [page]"' end - + it "read the source from stdin if it is html" do pdfkit = PDFKit.new('html') - pdfkit.command[-2..-1].should == ['-', '-'] + pdfkit.command[-2..-1].should == ['"-"', '"-"'] end - + it "specify the URL to the source if it is a url" do pdfkit = PDFKit.new('http://google.com') - pdfkit.command[-2..-1].should == ['http://google.com', '-'] + pdfkit.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') pdfkit = PDFKit.new(File.new(file_path)) - pdfkit.command[-2..-1].should == [file_path, '-'] + pdfkit.command[-2..-1].should == [%Q{"#{file_path}"}, '"-"'] end + it "should specify the path for the ouput if a apth is given" do + file_path = "/path/to/output.pdf" + pdfkit = PDFKit.new("html") + pdfkit.command(file_path).last.should == %Q{"#{file_path}"} + end + it "should detect special pdfkit meta tags" do body = %{ <html> <head> <meta name="pdfkit-page_size" content="Legal"/> <meta name="pdfkit-orientation" content="Landscape"/> </head> </html> } pdfkit = PDFKit.new(body) - pdfkit.command[pdfkit.command.index('--page-size') + 1].should == 'Legal' - pdfkit.command[pdfkit.command.index('--orientation') + 1].should == 'Landscape' + pdfkit.command[pdfkit.command.index('"--page-size"') + 1].should == '"Legal"' + pdfkit.command[pdfkit.command.index('"--orientation"') + 1].should == '"Landscape"' end end - + context "#to_pdf" do it "should generate a PDF of the HTML" do pdfkit = PDFKit.new('html', :page_size => 'Letter') pdf = pdfkit.to_pdf pdf[0...4].should == "%PDF" # PDF Signature at beginning of file end - + it "should generate a PDF with a numerical parameter" do pdfkit = PDFKit.new('html', :header_spacing => 1) pdf = pdfkit.to_pdf pdf[0...4].should == "%PDF" # PDF Signature at beginning of file end - + it "should generate a PDF with a symbol parameter" do pdfkit = PDFKit.new('html', :page_size => :Letter) pdf = pdfkit.to_pdf pdf[0...4].should == "%PDF" # PDF Signature at beginning of file end - + it "should have the stylesheet added to the head if it has one" do pdfkit = PDFKit.new("<html><head></head><body>Hai!</body></html>") css = File.join(SPEC_ROOT,'fixtures','example.css') pdfkit.stylesheets << css pdfkit.to_pdf pdfkit.source.to_s.should include("<style>#{File.read(css)}</style>") end - + it "should prepend style tags if the HTML doesn't have a head tag" do pdfkit = PDFKit.new("<html><body>Hai!</body></html>") css = File.join(SPEC_ROOT,'fixtures','example.css') pdfkit.stylesheets << css pdfkit.to_pdf pdfkit.source.to_s.should include("<style>#{File.read(css)}</style><html>") end - + it "should throw an error if the source is not html and stylesheets have been added" do pdfkit = PDFKit.new('http://google.com') css = File.join(SPEC_ROOT,'fixtures','example.css') pdfkit.stylesheets << css lambda { pdfkit.to_pdf }.should raise_error(PDFKit::ImproperSourceError) end end - + context "#to_file" do before do @file_path = File.join(SPEC_ROOT,'fixtures','test.pdf') File.delete(@file_path) if File.exist?(@file_path) end - + after do File.delete(@file_path) end - + it "should create a file with the PDF as content" do pdfkit = PDFKit.new('html', :page_size => 'Letter') - pdfkit.expects(:to_pdf).returns('PDF') file = pdfkit.to_file(@file_path) file.should be_instance_of(File) - File.read(file.path).should == 'PDF' + File.read(file.path)[0...4].should == "%PDF" # PDF Signature at beginning of file 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 pdfkit = PDFKit.new('html', :header_center => "a title\"; touch #{@test_path} #") pdfkit.to_pdf File.exist?(@test_path).should be_false end end - + end