diff --git a/History.txt b/History.txt index 73451cf..d9ac11e 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/lib/webrat.rb b/lib/webrat.rb index dffddac..8f11582 100644 --- a/lib/webrat.rb +++ b/lib/webrat.rb @@ -3,7 +3,6 @@ module Webrat 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 3d739ab..847b159 100644 --- a/lib/webrat/core/form.rb +++ b/lib/webrat/core/form.rb @@ -86,11 +86,13 @@ module Webrat 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/session.rb b/lib/webrat/core/session.rb index 6142877..1577b1a 100644 --- a/lib/webrat/core/session.rb +++ b/lib/webrat/core/session.rb @@ -10,8 +10,9 @@ module Webrat 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 @@ module Webrat 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/rack/rack_session.rb b/lib/webrat/rack/rack_session.rb index b283294..e3c2e24 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 597c3b8..3152c6c 100644 --- a/lib/webrat/sinatra/sinatra_session.rb +++ b/lib/webrat/sinatra/sinatra_session.rb @@ -6,8 +6,13 @@ 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 0000000..07b9cb1 --- /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