public Method

SelectorAssertions.assert_select_encoded(element = nil, &block)

assert_select_encoded(element?) { |elements| ... }

Extracts the content of an element, treats it as encoded HTML and runs nested assertion on it.

You typically call this method within another assertion to operate on all currently selected elements. You can also pass an element or array of elements.

The content of each element is un-encoded, and wrapped in the root element encoded. It then calls the block with all un-encoded elements.

Examples

# Selects all bold tags from within the title of an ATOM feed's entries (perhaps to nab a section name prefix)
assert_select_feed :atom, 1.0 do
  # Select each entry item and then the title item
  assert_select "entry>title" do
    # Run assertions on the encoded title elements
    assert_select_encoded do
      assert_select "b"
    end
  end
end

# Selects all paragraph tags from within the description of an RSS feed
assert_select_feed :rss, 2.0 do
  # Select description element of each feed item.
  assert_select "channel>item>description" do
    # Run assertions on the encoded elements.
    assert_select_encoded do
      assert_select "p"
    end
  end
end

Source Code

# File action_controller/assertions/selector_assertions.rb, line 507
def assert_select_encoded(element = nil, &block)
  case element
    when Array
      elements = element
    when HTML::Node
      elements = [element]
    when nil
      unless elements = @selected
        raise ArgumentError, "First argument is optional, but must be called from a nested assert_select"
      end
    else
      raise ArgumentError, "Argument is optional, and may be node or array of nodes"
  end

  fix_content = lambda do |node|
    # Gets around a bug in the Rails 1.1 HTML parser.
    node.content.gsub(/<!\[CDATA\[(.*)(\]\]>)?/m) { CGI.escapeHTML($1) }
  end

  selected = elements.map do |element|
    text = element.children.select{ |c| not c.tag? }.map{ |c| fix_content[c] }.join
    root = HTML::Document.new(CGI.unescapeHTML("<encoded>#{text}</encoded>")).root
    css_select(root, "encoded:root", &block)[0]
  end

  begin
    old_selected, @selected = @selected, selected
    assert_select ":root", &block
  ensure
    @selected = old_selected
  end
end
Comments

Have your say
Please use Textile formatting (click here for a cheat sheet). Use <code/> and <pre/> for code samples.
Click here to login with OpenID to to post comments.