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,25 @@ | |
| 1 | 
            +
            require "webrat/core/locators/locator"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Webrat
         | 
| 4 | 
            +
              module Locators
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                class FieldLocator < Locator # :nodoc:
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  def locate
         | 
| 9 | 
            +
                    FieldByIdLocator.new(@session, @dom, @value).locate   ||
         | 
| 10 | 
            +
                    FieldNamedLocator.new(@session, @dom, @value, *@field_types).locate   ||
         | 
| 11 | 
            +
                    FieldLabeledLocator.new(@session, @dom, @value, *@field_types).locate
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def error_message
         | 
| 15 | 
            +
                    "Could not find field: #{@value.inspect}"
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def field(*args) # :nodoc:
         | 
| 21 | 
            +
                  FieldLocator.new(@session, dom, *args).locate!
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
| @@ -0,0 +1,41 @@ | |
| 1 | 
            +
            require "webrat/core/locators/locator"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Webrat
         | 
| 4 | 
            +
              module Locators
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                class FieldNamedLocator < Locator # :nodoc:
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  def locate
         | 
| 9 | 
            +
                    Field.load(@session, field_element)
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def field_element
         | 
| 13 | 
            +
                    field_elements.detect do |field_element|
         | 
| 14 | 
            +
                      Webrat::XML.attribute(field_element, "name") == @value.to_s
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def field_elements
         | 
| 19 | 
            +
                    Webrat::XML.xpath_search(@dom, *xpath_searches)
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def xpath_searches
         | 
| 23 | 
            +
                    if @field_types.any?
         | 
| 24 | 
            +
                      @field_types.map { |field_type| field_type.xpath_search }.flatten
         | 
| 25 | 
            +
                    else
         | 
| 26 | 
            +
                      Array(Field.xpath_search)
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def error_message
         | 
| 31 | 
            +
                    "Could not find field named #{@value.inspect}"
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def field_named(name, *field_types)
         | 
| 37 | 
            +
                  FieldNamedLocator.new(@session, dom, name, *field_types).locate!
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
            end
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            require "webrat/core/locators/locator"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Webrat
         | 
| 4 | 
            +
              module Locators
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                class FormLocator < Locator # :nodoc:
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  def locate
         | 
| 9 | 
            +
                    Form.load(@session, form_element)
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def form_element
         | 
| 13 | 
            +
                    Webrat::XML.css_at(@dom, "#" + @value)
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            require "webrat/core_extensions/detect_mapped"
         | 
| 2 | 
            +
            require "webrat/core/locators/locator"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Webrat
         | 
| 5 | 
            +
              module Locators
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                class LabelLocator < Locator # :nodoc:
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def locate
         | 
| 10 | 
            +
                    Label.load(@session, label_element)
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def label_element
         | 
| 14 | 
            +
                    label_elements.detect do |label_element|
         | 
| 15 | 
            +
                      text(label_element) =~ /^\W*#{Regexp.escape(@value.to_s)}(\b|\Z)/i
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def label_elements
         | 
| 20 | 
            +
                    Webrat::XML.xpath_search(@dom, Label.xpath_search)
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def text(label_element)
         | 
| 24 | 
            +
                    str = Webrat::XML.all_inner_text(label_element)
         | 
| 25 | 
            +
                    str.gsub!("\n","")
         | 
| 26 | 
            +
                    str.strip!
         | 
| 27 | 
            +
                    str.squeeze!(" ")
         | 
| 28 | 
            +
                    str
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -0,0 +1,66 @@ | |
| 1 | 
            +
            require "webrat/core/locators/locator"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Webrat
         | 
| 4 | 
            +
              module Locators
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                class LinkLocator < Locator # :nodoc:
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  def locate
         | 
| 9 | 
            +
                    Link.load(@session, link_element)
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def link_element
         | 
| 13 | 
            +
                    matching_links.min { |a, b| Webrat::XML.all_inner_text(a).length <=> Webrat::XML.all_inner_text(b).length }
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def matching_links
         | 
| 17 | 
            +
                    @matching_links ||= link_elements.select do |link_element|
         | 
| 18 | 
            +
                      matches_text?(link_element) ||
         | 
| 19 | 
            +
                      matches_id?(link_element)
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def matches_text?(link)
         | 
| 24 | 
            +
                    if @value.is_a?(Regexp)
         | 
| 25 | 
            +
                      matcher = @value
         | 
| 26 | 
            +
                    else
         | 
| 27 | 
            +
                      matcher = /#{Regexp.escape(@value.to_s)}/i
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    replace_nbsp(Webrat::XML.all_inner_text(link)) =~ matcher ||
         | 
| 31 | 
            +
                    replace_nbsp_ref(Webrat::XML.inner_html(link)) =~ matcher ||
         | 
| 32 | 
            +
                    Webrat::XML.attribute(link, "title")=~ matcher
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  def matches_id?(link)
         | 
| 36 | 
            +
                    if @value.is_a?(Regexp)
         | 
| 37 | 
            +
                      (Webrat::XML.attribute(link, "id") =~ @value) ? true : false
         | 
| 38 | 
            +
                    else
         | 
| 39 | 
            +
                      (Webrat::XML.attribute(link, "id") == @value) ? true : false
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  def link_elements
         | 
| 44 | 
            +
                    Webrat::XML.xpath_search(@dom, *Link.xpath_search)
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  def replace_nbsp(str)
         | 
| 48 | 
            +
                    str.gsub([0xA0].pack('U'), ' ')
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  def replace_nbsp_ref(str)
         | 
| 52 | 
            +
                    str.gsub(' ',' ').gsub(' ', ' ')
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  def error_message
         | 
| 56 | 
            +
                    "Could not find link with text or title or id #{@value.inspect}"
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                def find_link(text_or_title_or_id) #:nodoc:
         | 
| 62 | 
            +
                  LinkLocator.new(@session, dom, text_or_title_or_id).locate!
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
            end
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            module Webrat
         | 
| 2 | 
            +
              module Locators
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                class Locator # :nodoc:
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def initialize(session, dom, value, *field_types)
         | 
| 7 | 
            +
                    @session = session
         | 
| 8 | 
            +
                    @dom = dom
         | 
| 9 | 
            +
                    @value = value
         | 
| 10 | 
            +
                    @field_types = field_types
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def locate!
         | 
| 14 | 
            +
                    locate || raise(NotFoundError.new(error_message))
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
| @@ -0,0 +1,59 @@ | |
| 1 | 
            +
            require "webrat/core_extensions/detect_mapped"
         | 
| 2 | 
            +
            require "webrat/core/locators/locator"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Webrat
         | 
| 5 | 
            +
              module Locators
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                class SelectOptionLocator < Locator # :nodoc:
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def initialize(session, dom, option_text, id_or_name_or_label)
         | 
| 10 | 
            +
                    @session = session
         | 
| 11 | 
            +
                    @dom = dom
         | 
| 12 | 
            +
                    @option_text = option_text
         | 
| 13 | 
            +
                    @id_or_name_or_label = id_or_name_or_label
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def locate
         | 
| 17 | 
            +
                    if @id_or_name_or_label
         | 
| 18 | 
            +
                      field = FieldLocator.new(@session, @dom, @id_or_name_or_label, SelectField).locate!
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                      field.options.detect do |o|
         | 
| 21 | 
            +
                        if @option_text.is_a?(Regexp)
         | 
| 22 | 
            +
                          Webrat::XML.inner_html(o.element) =~ @option_text
         | 
| 23 | 
            +
                        else
         | 
| 24 | 
            +
                          Webrat::XML.inner_html(o.element) == @option_text.to_s
         | 
| 25 | 
            +
                        end
         | 
| 26 | 
            +
                      end
         | 
| 27 | 
            +
                    else
         | 
| 28 | 
            +
                      option_element = option_elements.detect do |o|
         | 
| 29 | 
            +
                        if @option_text.is_a?(Regexp)
         | 
| 30 | 
            +
                          Webrat::XML.inner_html(o) =~ @option_text
         | 
| 31 | 
            +
                        else
         | 
| 32 | 
            +
                          Webrat::XML.inner_html(o) == @option_text.to_s
         | 
| 33 | 
            +
                        end
         | 
| 34 | 
            +
                      end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                      SelectOption.load(@session, option_element)
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  def option_elements
         | 
| 41 | 
            +
                    Webrat::XML.xpath_search(@dom, *SelectOption.xpath_search)
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  def error_message
         | 
| 45 | 
            +
                    if @id_or_name_or_label
         | 
| 46 | 
            +
                      "The '#{@option_text}' option was not found in the #{@id_or_name_or_label.inspect} select box"
         | 
| 47 | 
            +
                    else
         | 
| 48 | 
            +
                      "Could not find option #{@option_text.inspect}"
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                def select_option(option_text, id_or_name_or_label = nil) #:nodoc:
         | 
| 55 | 
            +
                  SelectOptionLocator.new(@session, dom, option_text, id_or_name_or_label).locate!
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
            end
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            module Webrat
         | 
| 2 | 
            +
              module Logging #:nodoc:
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                def debug_log(message) # :nodoc:
         | 
| 5 | 
            +
                  return unless logger
         | 
| 6 | 
            +
                  logger.debug message
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def logger # :nodoc:
         | 
| 10 | 
            +
                  case Webrat.configuration.mode
         | 
| 11 | 
            +
                  when :rails
         | 
| 12 | 
            +
                    defined?(RAILS_DEFAULT_LOGGER) ? RAILS_DEFAULT_LOGGER : nil
         | 
| 13 | 
            +
                  when :merb
         | 
| 14 | 
            +
                    Merb.logger
         | 
| 15 | 
            +
                  else
         | 
| 16 | 
            +
                    nil
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            module Webrat
         | 
| 2 | 
            +
              module Matchers
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                class HasContent #:nodoc:
         | 
| 5 | 
            +
                  def initialize(content)
         | 
| 6 | 
            +
                    @content = content
         | 
| 7 | 
            +
                  end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def matches?(stringlike)
         | 
| 10 | 
            +
                    if Webrat.configuration.parse_with_nokogiri?
         | 
| 11 | 
            +
                      @document = Webrat.nokogiri_document(stringlike)
         | 
| 12 | 
            +
                    else
         | 
| 13 | 
            +
                      @document = Webrat.hpricot_document(stringlike)
         | 
| 14 | 
            +
                    end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    @element = Webrat::XML.inner_text(@document)
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    case @content
         | 
| 19 | 
            +
                    when String
         | 
| 20 | 
            +
                      @element.include?(@content)
         | 
| 21 | 
            +
                    when Regexp
         | 
| 22 | 
            +
                      @element.match(@content)
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  # ==== Returns
         | 
| 27 | 
            +
                  # String:: The failure message.
         | 
| 28 | 
            +
                  def failure_message
         | 
| 29 | 
            +
                    "expected the following element's content to #{content_message}:\n#{squeeze_space(@element)}"
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  # ==== Returns
         | 
| 33 | 
            +
                  # String:: The failure message to be displayed in negative matches.
         | 
| 34 | 
            +
                  def negative_failure_message
         | 
| 35 | 
            +
                    "expected the following element's content to not #{content_message}:\n#{squeeze_space(@element)}"
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  def squeeze_space(inner_text)
         | 
| 39 | 
            +
                    inner_text.gsub(/^\s*$/, "").squeeze("\n")
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  def content_message
         | 
| 43 | 
            +
                    case @content
         | 
| 44 | 
            +
                    when String
         | 
| 45 | 
            +
                      "include \"#{@content}\""
         | 
| 46 | 
            +
                    when Regexp
         | 
| 47 | 
            +
                      "match #{@content.inspect}"
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                # Matches the contents of an HTML document with
         | 
| 53 | 
            +
                # whatever string is supplied
         | 
| 54 | 
            +
                def contain(content)
         | 
| 55 | 
            +
                  HasContent.new(content)
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                # Asserts that the body of the response contain
         | 
| 59 | 
            +
                # the supplied string or regexp
         | 
| 60 | 
            +
                def assert_contain(content)
         | 
| 61 | 
            +
                  hc = HasContent.new(content)
         | 
| 62 | 
            +
                  assert hc.matches?(response_body), hc.failure_message
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                # Asserts that the body of the response
         | 
| 66 | 
            +
                # does not contain the supplied string or regepx
         | 
| 67 | 
            +
                def assert_not_contain(content)
         | 
| 68 | 
            +
                  hc = HasContent.new(content)
         | 
| 69 | 
            +
                  assert !hc.matches?(response_body), hc.negative_failure_message
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         | 
| @@ -0,0 +1,74 @@ | |
| 1 | 
            +
            require "webrat/core/matchers/have_xpath"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Webrat
         | 
| 4 | 
            +
              module Matchers
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                class HaveSelector < HaveXpath #:nodoc:
         | 
| 7 | 
            +
                  # ==== Returns
         | 
| 8 | 
            +
                  # String:: The failure message.
         | 
| 9 | 
            +
                  def failure_message
         | 
| 10 | 
            +
                    "expected following output to contain a #{tag_inspect} tag:\n#{@document}"
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  # ==== Returns
         | 
| 14 | 
            +
                  # String:: The failure message to be displayed in negative matches.
         | 
| 15 | 
            +
                  def negative_failure_message
         | 
| 16 | 
            +
                    "expected following output to omit a #{tag_inspect}:\n#{@document}"
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def tag_inspect
         | 
| 20 | 
            +
                    options = @options.dup
         | 
| 21 | 
            +
                    count = options.delete(:count)
         | 
| 22 | 
            +
                    content = options.delete(:content)
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    html = "<#{@expected}"
         | 
| 25 | 
            +
                    options.each do |k,v|
         | 
| 26 | 
            +
                      html << " #{k}='#{v}'"
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    if content
         | 
| 30 | 
            +
                      html << ">#{content}</#{@expected}>"
         | 
| 31 | 
            +
                    else
         | 
| 32 | 
            +
                      html << "/>"
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    html
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  def query
         | 
| 39 | 
            +
                    Nokogiri::CSS.parse(@expected.to_s).map do |ast|
         | 
| 40 | 
            +
                      ast.to_xpath
         | 
| 41 | 
            +
                    end.first
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                # Matches HTML content against a CSS 3 selector.
         | 
| 47 | 
            +
                #
         | 
| 48 | 
            +
                # ==== Parameters
         | 
| 49 | 
            +
                # expected<String>:: The CSS selector to look for.
         | 
| 50 | 
            +
                #
         | 
| 51 | 
            +
                # ==== Returns
         | 
| 52 | 
            +
                # HaveSelector:: A new have selector matcher.
         | 
| 53 | 
            +
                def have_selector(name, attributes = {}, &block)
         | 
| 54 | 
            +
                  HaveSelector.new(name, attributes, &block)
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
                alias_method :match_selector, :have_selector
         | 
| 57 | 
            +
             | 
| 58 | 
            +
             | 
| 59 | 
            +
                # Asserts that the body of the response contains
         | 
| 60 | 
            +
                # the supplied selector
         | 
| 61 | 
            +
                def assert_have_selector(name, attributes = {}, &block)
         | 
| 62 | 
            +
                  matcher = HaveSelector.new(name, attributes, &block)
         | 
| 63 | 
            +
                  assert matcher.matches?(response_body), matcher.failure_message
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                # Asserts that the body of the response
         | 
| 67 | 
            +
                # does not contain the supplied string or regepx
         | 
| 68 | 
            +
                def assert_have_no_selector(name, attributes = {}, &block)
         | 
| 69 | 
            +
                  matcher = HaveSelector.new(name, attributes, &block)
         | 
| 70 | 
            +
                  assert !matcher.matches?(response_body), matcher.negative_failure_message
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
              end
         | 
| 74 | 
            +
            end
         |