begin
require "libxml"
rescue LoadError
# Skip libxml tests
else
require "abstract_unit"
require "active_support/xml_mini"
require "active_support/core_ext/hash/conversions"
class LibxmlEngineTest < ActiveSupport::TestCase
include ActiveSupport
def setup
@default_backend = XmlMini.backend
XmlMini.backend = "LibXML"
LibXML::XML::Error.set_handler(&lambda { |error| }) #silence libxml, exceptions will do
end
def teardown
XmlMini.backend = @default_backend
end
def test_exception_thrown_on_expansion_attack
assert_raise LibXML::XML::Error do
attack_xml = %{
]>
&a;
}
Hash.from_xml(attack_xml)
end
end
def test_setting_libxml_as_backend
XmlMini.backend = "LibXML"
assert_equal XmlMini_LibXML, XmlMini.backend
end
def test_blank_returns_empty_hash
assert_equal({}, XmlMini.parse(nil))
assert_equal({}, XmlMini.parse(""))
end
def test_array_type_makes_an_array
assert_equal_rexml(<<-eoxml)
a post
another post
eoxml
end
def test_one_node_document_as_hash
assert_equal_rexml(<<-eoxml)
eoxml
end
def test_one_node_with_attributes_document_as_hash
assert_equal_rexml(<<-eoxml)
eoxml
end
def test_products_node_with_book_node_as_hash
assert_equal_rexml(<<-eoxml)
eoxml
end
def test_products_node_with_two_book_nodes_as_hash
assert_equal_rexml(<<-eoxml)
eoxml
end
def test_single_node_with_content_as_hash
assert_equal_rexml(<<-eoxml)
hello world
eoxml
end
def test_children_with_children
assert_equal_rexml(<<-eoxml)
eoxml
end
def test_children_with_text
assert_equal_rexml(<<-eoxml)
hello everyone
eoxml
end
def test_children_with_non_adjacent_text
assert_equal_rexml(<<-eoxml)
good
hello everyone
morning
eoxml
end
def test_parse_from_io
io = StringIO.new(<<-eoxml)
good
hello everyone
morning
eoxml
assert_equal_rexml(io)
end
def test_children_with_simple_cdata
assert_equal_rexml(<<-eoxml)
eoxml
end
def test_children_with_multiple_cdata
assert_equal_rexml(<<-eoxml)
eoxml
end
def test_children_with_text_and_cdata
assert_equal_rexml(<<-eoxml)
hello
morning
eoxml
end
def test_children_with_blank_text
assert_equal_rexml(<<-eoxml)
eoxml
end
def test_children_with_blank_text_and_attribute
assert_equal_rexml(<<-eoxml)
eoxml
end
private
def assert_equal_rexml(xml)
parsed_xml = XmlMini.parse(xml)
xml.rewind if xml.respond_to?(:rewind)
hash = XmlMini.with_backend("REXML") { XmlMini.parse(xml) }
assert_equal(hash, parsed_xml)
end
end
end