From af1df52c1db186ad8aaff19d72beca4095e228b8 Mon Sep 17 00:00:00 2001 From: Jonas Grimfelt Date: Sun, 27 Jun 2010 02:36:25 +0200 Subject: [PATCH] Making "save and open page" file output path configurable to optionally avoid loads of capybara-*.html files in project root. --- .gitignore | 3 +- lib/capybara.rb | 9 ++-- lib/capybara/save_and_open_page.rb | 5 ++- spec/save_and_open_page_spec.rb | 68 ++++++++++++++++++++++++------ 4 files changed, 65 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index b0e680b8..e1ae2f3b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .idea/ .DS_Store pkg +tmp *~ spec.opts - +capybara-*.html diff --git a/lib/capybara.rb b/lib/capybara.rb index 7de48fa9..f17be063 100644 --- a/lib/capybara.rb +++ b/lib/capybara.rb @@ -11,15 +11,16 @@ module Capybara class TimeoutError < CapybaraError; end class LocateHiddenElementError < CapybaraError; end class InfiniteRedirectError < TimeoutError; end - + class << self attr_accessor :debug, :asset_root, :app_host, :run_server, :default_host attr_accessor :default_selector, :default_wait_time, :ignore_hidden_elements + attr_accessor :save_and_open_page_path def default_selector @default_selector ||= :xpath end - + def default_wait_time @default_wait_time ||= 2 end @@ -29,14 +30,14 @@ module Capybara true end end - + autoload :Server, 'capybara/server' autoload :Session, 'capybara/session' autoload :Node, 'capybara/node' autoload :XPath, 'capybara/xpath' autoload :Searchable, 'capybara/searchable' autoload :VERSION, 'capybara/version' - + module Driver autoload :Base, 'capybara/driver/base' autoload :RackTest, 'capybara/driver/rack_test_driver' diff --git a/lib/capybara/save_and_open_page.rb b/lib/capybara/save_and_open_page.rb index b6e9e15b..0f8b1461 100644 --- a/lib/capybara/save_and_open_page.rb +++ b/lib/capybara/save_and_open_page.rb @@ -3,8 +3,11 @@ module Capybara extend(self) def save_and_open_page(html) - name="capybara-#{Time.new.strftime("%Y%m%d%H%M%S")}.html" + name = File.join(*[Capybara.save_and_open_page_path, "capybara-#{Time.new.strftime("%Y%m%d%H%M%S")}.html"].compact) + unless Capybara.save_and_open_page_path.blank? || File.directory?(Capybara.save_and_open_page_path ) + FileUtils.mkdir_p(Capybara.save_and_open_page_path) + end FileUtils.touch(name) unless File.exist?(name) tempfile = File.new(name,'w') diff --git a/spec/save_and_open_page_spec.rb b/spec/save_and_open_page_spec.rb index af26a07b..966498f5 100644 --- a/spec/save_and_open_page_spec.rb +++ b/spec/save_and_open_page_spec.rb @@ -5,18 +5,12 @@ require 'launchy' describe Capybara::SaveAndOpenPage do describe "#save_save_and_open_page" do before do - @time = Time.new.strftime("%Y%m%d%H%M%S") - @name = "capybara-#{@time}.html" @temp_file = mock("FILE") @temp_file.stub!(:write) @temp_file.stub!(:close) - @temp_file.stub!(:path).and_return(@name) - - File.should_receive(:exist?).and_return true - File.should_receive(:new).and_return @temp_file - + @html = <<-HTML @@ -30,14 +24,60 @@ describe Capybara::SaveAndOpenPage do Launchy::Browser.stub(:run) end - it "should create a new temporary file" do - @temp_file.should_receive(:write).with @html - Capybara::SaveAndOpenPage.save_and_open_page @html - end + describe "defaults" do + before do + @name = "capybara-#{@time}.html" + + @temp_file.stub!(:path).and_return(@name) - it "should open the file in the browser" do - Capybara::SaveAndOpenPage.should_receive(:open_in_browser).with(@name) - Capybara::SaveAndOpenPage.save_and_open_page @html + File.should_receive(:exist?).and_return true + File.should_receive(:new).and_return @temp_file + end + + it "should create a new temporary file" do + @temp_file.should_receive(:write).with @html + Capybara::SaveAndOpenPage.save_and_open_page @html + end + + it "should open the file in the browser" do + Capybara::SaveAndOpenPage.should_receive(:open_in_browser).with(@name) + Capybara::SaveAndOpenPage.save_and_open_page @html + end + end + + describe "custom output path" do + before do + @custom_path = File.join('tmp', 'capybara') + @custom_name = File.join(@custom_path, "capybara-#{@time}.html") + + @temp_file.stub!(:path).and_return(@custom_name) + + Capybara.should_receive(:save_and_open_page_path).at_least(:once).and_return(@custom_path) + end + + it "should create a new temporary file in the custom path" do + File.should_receive(:directory?).and_return true + File.should_receive(:exist?).and_return true + File.should_receive(:new).and_return @temp_file + + @temp_file.should_receive(:write).with @html + Capybara::SaveAndOpenPage.save_and_open_page @html + end + + it "should open the file - in the custom path - in the browser" do + Capybara::SaveAndOpenPage.should_receive(:open_in_browser).with(@custom_name) + Capybara::SaveAndOpenPage.save_and_open_page @html + end + + it "should be possible to configure output path" do + Capybara.should respond_to(:save_and_open_page_path) + default_setting = Capybara.save_and_open_page_path + lambda { + Capybara.save_and_open_page_path = File.join('tmp', 'capybara') + Capybara.save_and_open_page_path.should == File.join('tmp', 'capybara') + }.should_not raise_error + Capybara.save_and_open_page_path = default_setting + end end end end