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