require 'spec_helper' require 'webrick' HTML_TEMPLATE = <
HTML HTML_FUGA = HTML_TEMPLATE.sub("%code%", < 3) { document.getElementById('fuga').textContent = xhr.responseText; Sunscraper.finish(); } }; xhr.open('GET', '/comicstrip', 1); xhr.send(); CODE HTML_USERAGENT = HTML_TEMPLATE.sub("%code%", < port, :Logger => WEBrick::Log.new('/dev/null'), :AccessLog => [] server.mount_proc '/' do |req, res| res.body = html end server.mount_proc '/comicstrip' do |req, res| res.body = 'Go Get a Roomie!' end thread = Thread.new { server.start } yield "http://127.0.0.1:#{port}/" ensure server.shutdown thread.join end define_tests = lambda do |klass, worker| describe klass do before(:all) do Sunscraper.worker = worker end after(:all) do sleep(5) # let threads rest in peace end it "can scrape an HTML provided as a string" do Sunscraper.scrape_html(HTML_FUGA).should include('It works!') end it "can scrape an URL" do with_webserver(HTML_FUGA) do |url| Sunscraper.scrape_url(url).should include('It works!') end end it "should time out if callback is not called" do lambda { Sunscraper.scrape_html("", "about:blank", 500) }. should raise_exception(Sunscraper::ScrapeTimeout) end it "respects baseUrl parameter" do with_webserver("") do |url| Sunscraper.scrape_html(HTML_BASEURL, url).should include('Go Get a Roomie') end end it "should identify itself as Sunscraper" do Sunscraper.scrape_html(HTML_USERAGENT).should include("Sunscraper") end it "should work with window.localStorage through webserver" do with_webserver(HTML_LOCALSTORAGE) do |url| Sunscraper.scrape_url(url).should include("OK") end end if worker == :embed it "should withstand a lot of concurrent threads" do 100.times.map { Thread.new { Sunscraper.scrape_html(HTML_FUGA) } }.each(&:join). map(&:value). each { |result| result.should include('It works!') } end end end end unless Sunscraper.os_x? # This part currently crashes on OS X (and will forever). define_tests.("Sunscraper-Embed", :embed) end if !(RUBY_ENGINE =~ /rbx/ || RUBY_ENGINE =~ /jruby/) || ENV['EXPERIMENTAL'] == 'true' # This part currently crashes Rubinius (as of Mar 09, 2012), # and crashes jruby < 1.7.0, and uses Unix sockets which don't # work even on jruby master (as of Mar 09, 2012). define_tests.("Sunscraper-Standalone", :standalone) end