From 06997fabb8e8e4bb8c9d43bf4d3f627d2ec9c3a6 Mon Sep 17 00:00:00 2001 From: Krzysztof Zylawy Date: Tue, 21 Oct 2008 13:05:35 +0100 Subject: [PATCH] merged changes from notch8 repo --- History.txt | 2 ++ README.txt | 7 ++++++ Rakefile | 17 +++++++++++--- lib/webrat.rb | 1 - lib/webrat/core/form.rb | 4 +++- lib/webrat/core/logging.rb | 2 +- lib/webrat/core/session.rb | 26 ++++++++++++++++------ lib/webrat/merb.rb | 32 +++++++++++++++++++++++++++ lib/webrat/rack/rack_session.rb | 11 +++++++++ lib/webrat/sinatra/sinatra_session.rb | 10 +++++++-- spec/api/basic_auth_spec.rb | 23 +++++++++++++++++++ spec/spec_helper.rb | 13 +++++------ spec/webrat/merb/helper.rb | 10 +-------- spec/webrat/rails/helper.rb | 1 + 14 files changed, 128 insertions(+), 31 deletions(-) create mode 100644 spec/api/basic_auth_spec.rb diff --git a/History.txt b/History.txt index 73451cf1..d9ac11ea 100644 --- a/History.txt +++ b/History.txt @@ -2,6 +2,8 @@ * Major enhancements + * Added #basic_auth(user, pass) to support HTTP Basic Auth (Aslak Hellesøy) + * Added support for Sinatra and Rack (Aslak Hellesøy) * Added #within for manipulating the current page within a selector scope * Add should_see and should_not_see for verifying HTML response bodys * Add support for simulating SSL requests (Luke Melia) diff --git a/README.txt b/README.txt index dc9d9974..e83f4743 100644 --- a/README.txt +++ b/README.txt @@ -59,6 +59,13 @@ tests to break unnecessarily as your application evolves: A test written with Webrat can handle these changes to these without any modifications. +=== Merb +To avoid losing sessions, you need this in environments/test.rb: + +Merb::Config.use do |c| + c[:session_store] = 'memory' +end + === Install To install the latest release: diff --git a/Rakefile b/Rakefile index 9bd083a9..5992b949 100644 --- a/Rakefile +++ b/Rakefile @@ -35,28 +35,39 @@ def remove_task(task_name) Rake.application.remove_task(task_name) end +def set_file_list + if ENV['TEST_MODE'] == "merb" + list = FileList['spec/**/*_spec.rb'] + list = list.find_all do |file| !file.match("rails") end + return list + else + return FileList['spec/**/*_spec.rb'] + end +end + remove_task "test" remove_task "test_deps" desc "Run all specs in spec directory" Spec::Rake::SpecTask.new do |t| t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""] - t.spec_files = FileList['spec/**/*_spec.rb'] + t.spec_files = set_file_list end desc "Run all specs in spec directory with RCov" Spec::Rake::SpecTask.new(:rcov) do |t| t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""] - t.spec_files = FileList['spec/**/*_spec.rb'] + t.spec_files = set_file_list t.rcov = true t.rcov_opts = lambda do IO.readlines(File.dirname(__FILE__) + "/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten end end + require 'spec/rake/verify_rcov' RCov::VerifyTask.new(:verify_rcov => :rcov) do |t| - t.threshold = 97.2 # Make sure you have rcov 0.7 or higher! + t.threshold = 97.3 # Make sure you have rcov 0.7 or higher! end remove_task "default" diff --git a/lib/webrat.rb b/lib/webrat.rb index 57df5913..af0c4dc3 100644 --- a/lib/webrat.rb +++ b/lib/webrat.rb @@ -6,7 +6,6 @@ def self.root end require "rubygems" -require "active_support" require File.dirname(__FILE__) + "/webrat/core" require File.dirname(__FILE__) + "/webrat/rails" if defined?(RAILS_ENV) diff --git a/lib/webrat/core/form.rb b/lib/webrat/core/form.rb index 3d739abb..847b159a 100644 --- a/lib/webrat/core/form.rb +++ b/lib/webrat/core/form.rb @@ -86,11 +86,13 @@ def form_method def form_action @element["action"].blank? ? @session.current_url : @element["action"] end + + HASH = [Hash, HashWithIndifferentAccess] rescue [Hash] def merge(all_params, new_param) new_param.each do |key, value| case all_params[key] - when Hash, HashWithIndifferentAccess + when *HASH merge_hash_values(all_params[key], value) when Array all_params[key] += value diff --git a/lib/webrat/core/logging.rb b/lib/webrat/core/logging.rb index a77b6fac..6634e96b 100644 --- a/lib/webrat/core/logging.rb +++ b/lib/webrat/core/logging.rb @@ -10,7 +10,7 @@ def logger # :nodoc: if defined? RAILS_DEFAULT_LOGGER RAILS_DEFAULT_LOGGER elsif defined? Merb - Merb.logger + Merb.logger else nil end diff --git a/lib/webrat/core/session.rb b/lib/webrat/core/session.rb index 6142877f..1577b1a6 100644 --- a/lib/webrat/core/session.rb +++ b/lib/webrat/core/session.rb @@ -10,8 +10,9 @@ class Session attr_reader :current_url def initialize - @http_method = :get - @data = {} + @http_method = :get + @data = {} + @default_headers = {} end # Saves the page out to RAILS_ROOT/tmp/ and opens it in the default @@ -52,14 +53,25 @@ def saved_page_dir File.expand_path(".") end + def basic_auth(user, pass) + @default_headers['HTTP_AUTHORIZATION'] = "Basic " + ["#{user}:#{pass}"].pack("m*") + end + + def headers + @default_headers.dup + end + def request_page(url, http_method, data) - debug_log "REQUESTING PAGE: #{http_method.to_s.upcase} #{url} with #{data.inspect}" - if @current_url - send "#{http_method}", url, data || {}, {"HTTP_REFERER" => @current_url} - else + h = headers + h['HTTP_REFERER'] = @current_url if @current_url + + debug_log "REQUESTING PAGE: #{http_method.to_s.upcase} #{url} with #{data.inspect} and HTTP headers #{h.inspect}" + if h.empty? send "#{http_method}", url, data || {} + else + send "#{http_method}", url, data || {}, h end - + save_and_open_page if exception_caught? flunk("Page load was not successful (Code: #{response_code.inspect})") unless success_code? diff --git a/lib/webrat/merb.rb b/lib/webrat/merb.rb index bc7f6622..eab0e1c5 100644 --- a/lib/webrat/merb.rb +++ b/lib/webrat/merb.rb @@ -5,6 +5,7 @@ class Session attr_reader :response def get(url, data, headers = nil) +<<<<<<< HEAD:lib/webrat/merb.rb @response = request(url, :params => data, :headers => headers, :method => "GET") end @@ -22,12 +23,40 @@ def delete(url, data, headers = nil) def response_body @response.body +======= + do_request(url, data, headers, "GET") + end + + def post(url, data, headers = nil) + do_request(url, data, headers, "POST") + end + + def put(url, data, headers = nil) + do_request(url, data, headers, "PUT") + end + + def delete(url, data, headers = nil) + do_request(url, data, headers, "DELETE") + end + + def response_body + @response.body.to_s +>>>>>>> 86879c13c05ad0448456575f148495bf700e1d4c:lib/webrat/merb.rb end def response_code @response.status end +<<<<<<< HEAD:lib/webrat/merb.rb +======= + protected + def do_request(url, data, headers, method) + @response = request(url, :params => data, :headers => headers, :method => method) + self.get(@response.headers['Location'], nil, @response.headers) if @response.status == 302 + end + +>>>>>>> 86879c13c05ad0448456575f148495bf700e1d4c:lib/webrat/merb.rb end end @@ -37,6 +66,7 @@ def browser end end +<<<<<<< HEAD:lib/webrat/merb.rb # # class Application < Merb::Controller @@ -57,3 +87,5 @@ def browser # # # +======= +>>>>>>> 86879c13c05ad0448456575f148495bf700e1d4c:lib/webrat/merb.rb diff --git a/lib/webrat/rack/rack_session.rb b/lib/webrat/rack/rack_session.rb index b2832940..e3c2e24e 100644 --- a/lib/webrat/rack/rack_session.rb +++ b/lib/webrat/rack/rack_session.rb @@ -1,5 +1,16 @@ require 'webrat' +class CGIMethods + def self.parse_query_parameters(params) + hash = {} + params.split('&').each do |p| + pair = p.split('=') + hash[pair[0]] = pair[1] + end + hash + end +end + module Webrat class RackSession < Session def response_body diff --git a/lib/webrat/sinatra/sinatra_session.rb b/lib/webrat/sinatra/sinatra_session.rb index 597c3b87..1083eb68 100644 --- a/lib/webrat/sinatra/sinatra_session.rb +++ b/lib/webrat/sinatra/sinatra_session.rb @@ -6,8 +6,14 @@ module Webrat class SinatraSession < RackSession include Sinatra::Test::Methods - def get(*args) - get_it(*args) + %w(get head post put delete).each do |verb| + define_method(verb) do |*args| # (path, data, headers = nil) + path, data, headers = *args + params = data.merge({:env => headers || {}}) + self.__send__("#{verb}_it", path, params) + follow! while @response.redirect? + end end + end end \ No newline at end of file diff --git a/spec/api/basic_auth_spec.rb b/spec/api/basic_auth_spec.rb new file mode 100644 index 00000000..07b9cb1d --- /dev/null +++ b/spec/api/basic_auth_spec.rb @@ -0,0 +1,23 @@ +require File.expand_path(File.dirname(__FILE__) + "/../spec_helper") + +describe "Basic Auth HTTP headers" do + before do + @session = Webrat::TestSession.new + @session.basic_auth('user', 'secret') + end + + it "should be present in visits" do + @session.should_receive(:get).with("/", {}, {'HTTP_AUTHORIZATION' => "Basic dXNlcjpzZWNyZXQ=\n"}) + @session.visits("/") + end + + it "should be present in form submits" do + @session.response_body = <<-EOS +
+ +
+ EOS + @session.should_receive(:post).with("/form1", {}, {'HTTP_AUTHORIZATION' => "Basic dXNlcjpzZWNyZXQ=\n"}) + @session.clicks_button + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 3fbe7cd4..015d1e87 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -5,17 +5,16 @@ # gem install redgreen for colored test output begin require "redgreen" unless ENV['TM_CURRENT_LINE']; rescue LoadError; end +require File.expand_path(File.dirname(__FILE__) + "/../lib/webrat") +require File.dirname(__FILE__) + "/fakes/test_session" + if ["rails","merb"].include?(ENV["TEST_MODE"]) require File.join(File.dirname(__FILE__), "webrat", "#{ENV["TEST_MODE"]}", "helper.rb") else - puts "Please set the environment variable TEST_MODE to either 'rails' or 'merb'." - $stdout.flush - exit 1 + puts "Assuming test mode is Rails... for Merb set TEST_MODE=merb and rerun." + ENV["TEST_MODE"] = 'rails' + require File.join(File.dirname(__FILE__), "webrat", "#{ENV["TEST_MODE"]}", "helper.rb") end - -require File.expand_path(File.dirname(__FILE__) + "/../lib/webrat") -require File.expand_path(File.dirname(__FILE__) + "/../lib/webrat/rails") -require File.dirname(__FILE__) + "/fakes/test_session" Spec::Runner.configure do |config| # Nothing to configure yet diff --git a/spec/webrat/merb/helper.rb b/spec/webrat/merb/helper.rb index 2994b62d..ca55fd2e 100644 --- a/spec/webrat/merb/helper.rb +++ b/spec/webrat/merb/helper.rb @@ -1,10 +1,2 @@ require 'merb-core' -# module Merb -# module Test -# class RspecStory -# def flunk(message) -# raise message -# end -# end -# end -# end +require File.expand_path(File.dirname(__FILE__) + "/../../../lib/webrat/merb") \ No newline at end of file diff --git a/spec/webrat/rails/helper.rb b/spec/webrat/rails/helper.rb index bde582b6..05d8068a 100644 --- a/spec/webrat/rails/helper.rb +++ b/spec/webrat/rails/helper.rb @@ -4,3 +4,4 @@ require "action_controller" require "action_controller/integration" end +require File.expand_path(File.dirname(__FILE__) + "/../../../lib/webrat/rails")