casebook-webrat 0.4.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +332 -0
- data/MIT-LICENSE.txt +19 -0
- data/README.rdoc +85 -0
- data/Rakefile +156 -0
- data/install.rb +1 -0
- data/lib/webrat.rb +34 -0
- data/lib/webrat/core.rb +14 -0
- data/lib/webrat/core/configuration.rb +104 -0
- data/lib/webrat/core/elements/area.rb +31 -0
- data/lib/webrat/core/elements/element.rb +33 -0
- data/lib/webrat/core/elements/field.rb +403 -0
- data/lib/webrat/core/elements/form.rb +103 -0
- data/lib/webrat/core/elements/label.rb +31 -0
- data/lib/webrat/core/elements/link.rb +92 -0
- data/lib/webrat/core/elements/select_option.rb +35 -0
- data/lib/webrat/core/locators.rb +20 -0
- data/lib/webrat/core/locators/area_locator.rb +38 -0
- data/lib/webrat/core/locators/button_locator.rb +54 -0
- data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
- data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
- data/lib/webrat/core/locators/field_locator.rb +25 -0
- data/lib/webrat/core/locators/field_named_locator.rb +41 -0
- data/lib/webrat/core/locators/form_locator.rb +19 -0
- data/lib/webrat/core/locators/label_locator.rb +34 -0
- data/lib/webrat/core/locators/link_locator.rb +66 -0
- data/lib/webrat/core/locators/locator.rb +20 -0
- data/lib/webrat/core/locators/select_option_locator.rb +59 -0
- data/lib/webrat/core/logging.rb +21 -0
- data/lib/webrat/core/matchers.rb +4 -0
- data/lib/webrat/core/matchers/have_content.rb +73 -0
- data/lib/webrat/core/matchers/have_selector.rb +74 -0
- data/lib/webrat/core/matchers/have_tag.rb +21 -0
- data/lib/webrat/core/matchers/have_xpath.rb +147 -0
- data/lib/webrat/core/methods.rb +61 -0
- data/lib/webrat/core/mime.rb +29 -0
- data/lib/webrat/core/save_and_open_page.rb +50 -0
- data/lib/webrat/core/scope.rb +350 -0
- data/lib/webrat/core/session.rb +281 -0
- data/lib/webrat/core/xml.rb +115 -0
- data/lib/webrat/core/xml/hpricot.rb +19 -0
- data/lib/webrat/core/xml/nokogiri.rb +76 -0
- data/lib/webrat/core/xml/rexml.rb +24 -0
- data/lib/webrat/core_extensions/blank.rb +58 -0
- data/lib/webrat/core_extensions/deprecate.rb +8 -0
- data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
- data/lib/webrat/core_extensions/meta_class.rb +6 -0
- data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
- data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
- data/lib/webrat/mechanize.rb +74 -0
- data/lib/webrat/merb.rb +9 -0
- data/lib/webrat/merb_session.rb +65 -0
- data/lib/webrat/rack.rb +24 -0
- data/lib/webrat/rails.rb +105 -0
- data/lib/webrat/rspec-rails.rb +13 -0
- data/lib/webrat/selenium.rb +80 -0
- data/lib/webrat/selenium/application_server.rb +71 -0
- data/lib/webrat/selenium/location_strategy_javascript/button.js +12 -0
- data/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
- data/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +9 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
- data/lib/webrat/selenium/matchers.rb +4 -0
- data/lib/webrat/selenium/matchers/have_content.rb +66 -0
- data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
- data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
- data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
- data/lib/webrat/selenium/merb_application_server.rb +48 -0
- data/lib/webrat/selenium/rails_application_server.rb +42 -0
- data/lib/webrat/selenium/selenium_extensions.js +6 -0
- data/lib/webrat/selenium/selenium_rc_server.rb +81 -0
- data/lib/webrat/selenium/selenium_session.rb +241 -0
- data/lib/webrat/selenium/sinatra_application_server.rb +35 -0
- data/lib/webrat/sinatra.rb +44 -0
- data/vendor/selenium-server.jar +0 -0
- metadata +147 -0
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            module Webrat
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              def self.rexml_document(stringlike)
         | 
| 4 | 
            +
                stringlike = stringlike.body.to_s if stringlike.respond_to?(:body)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                case stringlike
         | 
| 7 | 
            +
                when REXML::Document
         | 
| 8 | 
            +
                  stringlike.root
         | 
| 9 | 
            +
                when REXML::Node, Array
         | 
| 10 | 
            +
                  stringlike
         | 
| 11 | 
            +
                else
         | 
| 12 | 
            +
                  begin
         | 
| 13 | 
            +
                    REXML::Document.new(stringlike.to_s).root
         | 
| 14 | 
            +
                  rescue REXML::ParseException => e
         | 
| 15 | 
            +
                    if e.message.include?("second root element")
         | 
| 16 | 
            +
                      REXML::Document.new("<fake-root-element>#{stringlike}</fake-root-element>").root
         | 
| 17 | 
            +
                    else
         | 
| 18 | 
            +
                      raise e
         | 
| 19 | 
            +
                    end
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            class Object #:nodoc:
         | 
| 2 | 
            +
              # An object is blank if it's false, empty, or a whitespace string.
         | 
| 3 | 
            +
              # For example, "", "   ", +nil+, [], and {} are blank.
         | 
| 4 | 
            +
              #
         | 
| 5 | 
            +
              # This simplifies
         | 
| 6 | 
            +
              #
         | 
| 7 | 
            +
              #   if !address.nil? && !address.empty?
         | 
| 8 | 
            +
              #
         | 
| 9 | 
            +
              # to
         | 
| 10 | 
            +
              #
         | 
| 11 | 
            +
              #   if !address.blank?
         | 
| 12 | 
            +
              def blank?
         | 
| 13 | 
            +
                respond_to?(:empty?) ? empty? : !self
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              # An object is present if it's not blank.
         | 
| 17 | 
            +
              def present?
         | 
| 18 | 
            +
                !blank?
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            class NilClass #:nodoc:
         | 
| 23 | 
            +
              def blank?
         | 
| 24 | 
            +
                true
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            class FalseClass #:nodoc:
         | 
| 29 | 
            +
              def blank?
         | 
| 30 | 
            +
                true
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            class TrueClass #:nodoc:
         | 
| 35 | 
            +
              def blank?
         | 
| 36 | 
            +
                false
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            class Array #:nodoc:
         | 
| 41 | 
            +
              alias_method :blank?, :empty?
         | 
| 42 | 
            +
            end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            class Hash #:nodoc:
         | 
| 45 | 
            +
              alias_method :blank?, :empty?
         | 
| 46 | 
            +
            end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            class String #:nodoc:
         | 
| 49 | 
            +
              def blank?
         | 
| 50 | 
            +
                self !~ /\S/
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
            end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            class Numeric #:nodoc:
         | 
| 55 | 
            +
              def blank?
         | 
| 56 | 
            +
                false
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            class TCPSocket
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              def self.wait_for_service_with_timeout(options)
         | 
| 4 | 
            +
                start_time = Time.now
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                until listening_service?(options)
         | 
| 7 | 
            +
                  verbose_wait
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  if options[:timeout] && (Time.now > start_time + options[:timeout])
         | 
| 10 | 
            +
                    raise SocketError.new("Socket did not open within #{options[:timeout]} seconds")
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              def self.wait_for_service_termination_with_timeout(options)
         | 
| 16 | 
            +
                start_time = Time.now
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                while listening_service?(options)
         | 
| 19 | 
            +
                  verbose_wait
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  if options[:timeout] && (Time.now > start_time + options[:timeout])
         | 
| 22 | 
            +
                    raise SocketError.new("Socket did not terminate within #{options[:timeout]} seconds")
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,74 @@ | |
| 1 | 
            +
            require "mechanize"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Webrat #:nodoc:
         | 
| 4 | 
            +
              class MechanizeSession < Session #:nodoc:
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                attr_accessor :response
         | 
| 7 | 
            +
                alias :page :response
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def request_page(url, http_method, data) #:nodoc:
         | 
| 10 | 
            +
                  super(absolute_url(url), http_method, data)
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def get(url, data, headers_argument_not_used = nil)
         | 
| 14 | 
            +
                  @response = mechanize.get(url, data)
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def post(url, data, headers_argument_not_used = nil)
         | 
| 18 | 
            +
                  post_data = data.inject({}) do |memo, param|
         | 
| 19 | 
            +
                    case param.last
         | 
| 20 | 
            +
                    when Hash
         | 
| 21 | 
            +
                      param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
         | 
| 22 | 
            +
                    else
         | 
| 23 | 
            +
                      memo[param.first] = param.last
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
                    memo
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                  @response = mechanize.post(url, post_data)
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def response_body
         | 
| 31 | 
            +
                  @response.content
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def response_code
         | 
| 35 | 
            +
                  @response.code.to_i
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                def mechanize
         | 
| 39 | 
            +
                  @mechanize ||= WWW::Mechanize.new
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def_delegators :mechanize, :basic_auth
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                def absolute_url(url) #:nodoc:
         | 
| 45 | 
            +
                  current_host, current_path = split_current_url
         | 
| 46 | 
            +
                  if url =~ Regexp.new('^https?://')
         | 
| 47 | 
            +
                    url
         | 
| 48 | 
            +
                  elsif url =~ Regexp.new('^/')
         | 
| 49 | 
            +
                    current_host + url
         | 
| 50 | 
            +
                  elsif url =~ Regexp.new('^\.')
         | 
| 51 | 
            +
                    current_host + absolute_path(current_path, url)
         | 
| 52 | 
            +
                  else
         | 
| 53 | 
            +
                    url
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                private
         | 
| 58 | 
            +
                  def split_current_url
         | 
| 59 | 
            +
                    current_url =~ Regexp.new('^(https?://[^/]+)(/.*)?')
         | 
| 60 | 
            +
                    [Regexp.last_match(1), Regexp.last_match(2)]
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  def absolute_path(current_path, url)
         | 
| 64 | 
            +
                    levels_up = url.split('/').find_all { |x| x == '..' }.size
         | 
| 65 | 
            +
                    ancestor = if current_path.nil?
         | 
| 66 | 
            +
                      ""
         | 
| 67 | 
            +
                    else
         | 
| 68 | 
            +
                      current_path.split("/")[0..(-1 - levels_up)].join("/")
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
                    descendent = url.split("/")[levels_up..-1]
         | 
| 71 | 
            +
                    "#{ancestor}/#{descendent}"
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
              end
         | 
| 74 | 
            +
            end
         | 
    
        data/lib/webrat/merb.rb
    ADDED
    
    
| @@ -0,0 +1,65 @@ | |
| 1 | 
            +
            require "webrat"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "cgi"
         | 
| 4 | 
            +
            gem "extlib"
         | 
| 5 | 
            +
            require "extlib"
         | 
| 6 | 
            +
            require "merb-core"
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            # HashWithIndifferentAccess = Mash
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            module Webrat
         | 
| 11 | 
            +
              class MerbSession < Session #:nodoc:
         | 
| 12 | 
            +
                include Merb::Test::MakeRequest
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                attr_accessor :response
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def get(url, data, headers = nil)
         | 
| 17 | 
            +
                  do_request(url, data, headers, "GET")
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def post(url, data, headers = nil)
         | 
| 21 | 
            +
                  do_request(url, data, headers, "POST")
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def put(url, data, headers = nil)
         | 
| 25 | 
            +
                  do_request(url, data, headers, "PUT")
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                def delete(url, data, headers = nil)
         | 
| 29 | 
            +
                  do_request(url, data, headers, "DELETE")
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def response_body
         | 
| 33 | 
            +
                  @response.body.to_s
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def response_code
         | 
| 37 | 
            +
                  @response.status
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                def do_request(url, data, headers, method)
         | 
| 41 | 
            +
                  @response = request(url,
         | 
| 42 | 
            +
                    :params => (data && data.any?) ? data : nil,
         | 
| 43 | 
            +
                    :headers => headers,
         | 
| 44 | 
            +
                    :method => method)
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
            end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            module Merb #:nodoc:
         | 
| 51 | 
            +
              module Test #:nodoc:
         | 
| 52 | 
            +
                module RequestHelper #:nodoc:
         | 
| 53 | 
            +
                  def request(uri, env = {})
         | 
| 54 | 
            +
                    @_webrat_session ||= Webrat::MerbSession.new
         | 
| 55 | 
            +
                    @_webrat_session.response = @_webrat_session.request(uri, env)
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
            end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            class Merb::Test::RspecStory #:nodoc:
         | 
| 62 | 
            +
              def browser
         | 
| 63 | 
            +
                @browser ||= Webrat::MerbSession.new
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
            end
         | 
    
        data/lib/webrat/rack.rb
    ADDED
    
    | @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            require 'webrat'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class CGIMethods #:nodoc:
         | 
| 4 | 
            +
              def self.parse_query_parameters(params)
         | 
| 5 | 
            +
                hash = {}
         | 
| 6 | 
            +
                params.split('&').each do |p|
         | 
| 7 | 
            +
                  pair = p.split('=')
         | 
| 8 | 
            +
                  hash[pair[0]] = pair[1]
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
                hash
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
            end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            module Webrat
         | 
| 15 | 
            +
              class RackSession < Session #:nodoc:
         | 
| 16 | 
            +
                def response_body
         | 
| 17 | 
            +
                  @response.body
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def response_code
         | 
| 21 | 
            +
                  @response.status
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
    
        data/lib/webrat/rails.rb
    ADDED
    
    | @@ -0,0 +1,105 @@ | |
| 1 | 
            +
            require "webrat"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "action_controller"
         | 
| 4 | 
            +
            require "action_controller/integration"
         | 
| 5 | 
            +
            require "action_controller/record_identifier"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module Webrat
         | 
| 8 | 
            +
              class RailsSession < Session #:nodoc:
         | 
| 9 | 
            +
                include ActionController::RecordIdentifier
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                # The Rails version of within supports passing in a model and Webrat
         | 
| 12 | 
            +
                # will apply a scope based on Rails' dom_id for that model.
         | 
| 13 | 
            +
                #
         | 
| 14 | 
            +
                # Example:
         | 
| 15 | 
            +
                #   within User.last do
         | 
| 16 | 
            +
                #     click_link "Delete"
         | 
| 17 | 
            +
                #   end
         | 
| 18 | 
            +
                def within(selector_or_object, &block)
         | 
| 19 | 
            +
                  if selector_or_object.is_a?(String)
         | 
| 20 | 
            +
                    super
         | 
| 21 | 
            +
                  else
         | 
| 22 | 
            +
                    super('#' + dom_id(selector_or_object), &block)
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def doc_root
         | 
| 27 | 
            +
                  File.expand_path(File.join(RAILS_ROOT, 'public'))
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def saved_page_dir
         | 
| 31 | 
            +
                  File.expand_path(File.join(RAILS_ROOT, "tmp"))
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def get(url, data, headers = nil)
         | 
| 35 | 
            +
                  do_request(:get, url, data, headers)
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                def post(url, data, headers = nil)
         | 
| 39 | 
            +
                  do_request(:post, url, data, headers)
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def put(url, data, headers = nil)
         | 
| 43 | 
            +
                  do_request(:put, url, data, headers)
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                def delete(url, data, headers = nil)
         | 
| 47 | 
            +
                  do_request(:delete, url, data, headers)
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                def response_body
         | 
| 51 | 
            +
                  response.body
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                def response_code
         | 
| 55 | 
            +
                  response.code.to_i
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                def xml_content_type?
         | 
| 59 | 
            +
                  response.headers["Content-Type"].to_s =~ /xml/
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              protected
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                def integration_session
         | 
| 65 | 
            +
                  @context
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                def do_request(http_method, url, data, headers) #:nodoc:
         | 
| 69 | 
            +
                  update_protocol(url)
         | 
| 70 | 
            +
                  integration_session.send(http_method, normalize_url(url), data, headers)
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                # remove protocol, host and anchor
         | 
| 74 | 
            +
                def normalize_url(href) #:nodoc:
         | 
| 75 | 
            +
                  uri = URI.parse(href)
         | 
| 76 | 
            +
                  normalized_url = []
         | 
| 77 | 
            +
                  normalized_url << "#{uri.scheme}://" if uri.scheme
         | 
| 78 | 
            +
                  normalized_url << uri.host if uri.host
         | 
| 79 | 
            +
                  normalized_url << ":#{uri.port}" if uri.port && ![80,443].include?(uri.port)
         | 
| 80 | 
            +
                  normalized_url << uri.path if uri.path
         | 
| 81 | 
            +
                  normalized_url << "?#{uri.query}" if uri.query
         | 
| 82 | 
            +
                  normalized_url.join
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                def update_protocol(href) #:nodoc:
         | 
| 86 | 
            +
                  if href =~ /^https:/
         | 
| 87 | 
            +
                    integration_session.https!(true)
         | 
| 88 | 
            +
                  elsif href =~ /^http:/
         | 
| 89 | 
            +
                    integration_session.https!(false)
         | 
| 90 | 
            +
                  end
         | 
| 91 | 
            +
                end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                def response #:nodoc:
         | 
| 94 | 
            +
                  integration_session.response
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
              end
         | 
| 98 | 
            +
            end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
            module ActionController #:nodoc:
         | 
| 101 | 
            +
              IntegrationTest.class_eval do
         | 
| 102 | 
            +
                include Webrat::Methods
         | 
| 103 | 
            +
                include Webrat::Matchers
         | 
| 104 | 
            +
              end
         | 
| 105 | 
            +
            end
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            # Supports using the matchers in controller, helper, and view specs if you're
         | 
| 2 | 
            +
            # using rspec-rails. Just add a require statement to spec/spec_helper.rb or env.rb:
         | 
| 3 | 
            +
            #
         | 
| 4 | 
            +
            #   require 'webrat/rspec-rails'
         | 
| 5 | 
            +
            #
         | 
| 6 | 
            +
            require "webrat/core/matchers"
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            Spec::Runner.configure do |config|
         | 
| 9 | 
            +
              # rspec should support :type => [:controller, :helper, :view] - but until it does ...
         | 
| 10 | 
            +
              config.include(Webrat::Matchers, :type => :controller)
         | 
| 11 | 
            +
              config.include(Webrat::Matchers, :type => :helper)
         | 
| 12 | 
            +
              config.include(Webrat::Matchers, :type => :view)
         | 
| 13 | 
            +
            end
         |