File Manager
Viewing File: test_node.rb
require "helper"
require 'nkf'
module Nokogiri
module HTML
class TestNode < Nokogiri::TestCase
def setup
super
@html = Nokogiri::HTML(<<-eohtml)
<html>
<head></head>
<body>
<div class='baz'><a href="foo" class="bar">first</a></div>
</body>
</html>
eohtml
end
def test_to_a
assert_equal [['class', 'bar'], ['href', 'foo']],@html.at('a').to_a.sort
end
def test_attr
node = @html.at('div.baz')
assert_equal node['class'], node.attr('class')
end
def test_get_attribute
element = @html.at('div')
assert_equal 'baz', element.get_attribute('class')
assert_equal 'baz', element['class']
element['href'] = "javascript:alert(\"AGGA-KA-BOO!\")"
assert_match(/%22AGGA-KA-BOO!%22/, element.to_html)
end
# The HTML parser ignores namespaces, so even properly declared namespaces
# are treated as as undeclared and have to be accessed via prefix:tagname
def test_ns_attribute
html = '<i foo:bar="baz"></i>'
doc = Nokogiri::HTML(html)
assert_equal 'baz', (doc%'i')['foo:bar']
end
def test_css_path_round_trip
doc = Nokogiri::HTML(File.read(HTML_FILE))
%w{ #header small div[2] div.post body }.each do |css_sel|
ele = doc.at css_sel
assert_equal ele, doc.at(ele.css_path), ele.css_path
end
end
def test_path_round_trip
doc = Nokogiri::HTML(File.read(HTML_FILE))
%w{ #header small div[2] div.post body }.each do |css_sel|
ele = doc.at css_sel
assert_equal ele, doc.at(ele.path), ele.path
end
end
def test_append_with_document
assert_raises(ArgumentError) do
@html.root << Nokogiri::HTML::Document.new
end
end
###
# Make sure a document that doesn't declare a meta encoding returns
# nil.
def test_meta_encoding
assert_nil @html.meta_encoding
end
def test_description
assert desc = @html.at('a.bar').description
assert_equal 'a', desc.name
end
def test_ancestors_with_selector
assert node = @html.at('a.bar').child
assert list = node.ancestors('.baz')
assert_equal 1, list.length
assert_equal 'div', list.first.name
end
def test_matches_inside_fragment
fragment = DocumentFragment.new @html
fragment << XML::Node.new('a', @html)
a = fragment.children.last
assert a.matches?('a'), 'a should match'
end
def test_css_matches?
assert node = @html.at('a.bar')
assert node.matches?('a.bar')
end
def test_xpath_matches?
assert node = @html.at('//a')
assert node.matches?('//a')
end
def test_unlink_then_swap
node = @html.at('a')
node.unlink
another_node = @html.at('div')
assert another_node, 'should have a node'
# This used to segv
assert node.add_previous_sibling another_node
end
def test_swap
@html.at('div').swap('<a href="foo">bar</a>')
a_tag = @html.css('a').first
assert_equal 'body', a_tag.parent.name
assert_equal 0, @html.css('div').length
end
def test_swap_with_regex_characters
@html.at('div').swap('<a href="foo">ba)r</a>')
a_tag = @html.css('a').first
assert_equal 'ba)r', a_tag.text
end
def test_attribute_decodes_entities
node = @html.at('div')
node['href'] = 'foo&bar'
assert_equal 'foo&bar', node['href']
node['href'] += '&baz'
assert_equal 'foo&bar&baz', node['href']
end
def test_parse_config_option
node = @html.at('div')
options = nil
node.parse("<div></div>") do |config|
options = config
end
assert_equal Nokogiri::XML::ParseOptions::DEFAULT_HTML, options.to_i
end
def test_fragment_handler_does_not_regurge_on_invalid_attributes
iframe = %Q{<iframe style="width: 0%; height: 0px" src="http://someurl" allowtransparency></iframe>}
assert @html.at('div').fragment(iframe)
end
def test_fragment
fragment = @html.fragment(<<-eohtml)
hello
<div class="foo">
<p>bar</p>
</div>
world
eohtml
assert_match(/^hello/, fragment.inner_html.strip)
assert_equal 3, fragment.children.length
assert p_tag = fragment.css('p').first
assert_equal 'div', p_tag.parent.name
assert_equal 'foo', p_tag.parent['class']
end
def test_fragment_serialization
fragment = Nokogiri::HTML.fragment("<div>foo</div>")
assert_equal "<div>foo</div>", fragment.serialize.chomp
assert_equal "<div>foo</div>", fragment.to_xml.chomp
assert_equal "<div>foo</div>", fragment.inner_html
assert_equal "<div>foo</div>", fragment.to_html
assert_equal "<div>foo</div>", fragment.to_s
end
def test_to_html_does_not_contain_entities
return unless defined?(NKF) # NKF is not implemented on Rubinius as of 2009-11-23
html = NKF.nkf("-e --msdos", <<-EOH)
<html><body>
<p> test paragraph
foo bar </p>
</body></html>
EOH
nokogiri = Nokogiri::HTML.parse(html)
if RUBY_PLATFORM =~ /java/
# NKF linebreak modes are not supported as of jruby 1.2
# see http://jira.codehaus.org/browse/JRUBY-3602 for status
assert_equal "<p>testparagraph\nfoobar</p>",
nokogiri.at("p").to_html.gsub(/ /, '')
else
assert_equal "<p>testparagraph\r\nfoobar</p>",
nokogiri.at("p").to_html.gsub(/ /, '')
end
end
end
def test_GH_1042
file = File.join(ASSETS_DIR, 'GH_1042.html');
html = Nokogiri::HTML(File.read(file))
table = html.xpath("//table")[1]
trs = table.xpath("tr").drop(1)
# the jruby inplementation of drop uses dup() on the IRubyObject (which
# is NOT the same dup() method on the ruby Object) which produces a
# shallow clone. a shallow of valid XMLNode triggers several
# NullPointerException on inspect() since loads of invariants
# are not set. the fix for GH1042 ensures a proper working clone.
assert_nothing_raised do
trs.inspect
end
end
end
end