# frozen_string_literal: true require "abstract_unit" require "active_support/xml_mini" require "active_support/core_ext/hash/conversions" class XMLMiniEngineTest < ActiveSupport::TestCase def self.run_with_gem(gem_name) require gem_name yield rescue LoadError # Skip tests unless gem is available end def self.run_with_platform(platform_name) yield if RUBY_PLATFORM.include?(platform_name) end def self.inherited(base) base.include EngineTests super end def setup @default_backend = ActiveSupport::XmlMini.backend ActiveSupport::XmlMini.backend = engine super end def teardown ActiveSupport::XmlMini.backend = @default_backend super end module EngineTests def test_file_from_xml hash = Hash.from_xml(<<-eoxml) eoxml assert hash.key?("blog") assert hash["blog"].key?("logo") file = hash["blog"]["logo"] assert_equal "logo.png", file.original_filename assert_equal "image/png", file.content_type end def test_exception_thrown_on_expansion_attack assert_raise expansion_attack_error do Hash.from_xml(<<-eoxml) ]> &a; eoxml end end def test_setting_backend assert_engine_class ActiveSupport::XmlMini.backend end def test_blank_returns_empty_hash assert_equal({}, ActiveSupport::XmlMini.parse(nil)) assert_equal({}, ActiveSupport::XmlMini.parse("")) end def test_parse_from_frozen_string xml_string = "" assert_equal({ "root" => {} }, ActiveSupport::XmlMini.parse(xml_string)) 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 skip_unless_extended_engine assert_equal_rexml(StringIO.new(<<-eoxml)) good hello everyone morning eoxml end def test_children_with_simple_cdata skip_unless_extended_engine assert_equal_rexml(<<-eoxml) eoxml end def test_children_with_multiple_cdata skip_unless_extended_engine assert_equal_rexml(<<-eoxml) eoxml end def test_children_with_text_and_cdata skip_unless_extended_engine assert_equal_rexml(<<-eoxml) hello morning eoxml end def test_children_with_blank_text skip_unless_extended_engine assert_equal_rexml(<<-eoxml) eoxml end def test_children_with_blank_text_and_attribute skip_unless_extended_engine assert_equal_rexml(<<-eoxml) eoxml end private def engine raise NotImplementedError end def assert_engine_class(actual) assert_equal ActiveSupport.const_get("XmlMini_#{engine}"), actual end def assert_equal_rexml(xml) parsed_xml = ActiveSupport::XmlMini.parse(xml) xml.rewind if xml.respond_to?(:rewind) hash = ActiveSupport::XmlMini.with_backend("REXML") { ActiveSupport::XmlMini.parse(xml) } assert_equal(hash, parsed_xml) end def expansion_attack_error raise NotImplementedError end def extended_engine? true end def skip_unless_extended_engine skip "#{engine} is not an extended engine" unless extended_engine? end end end