def test_start_with_derived_class(self): a = make_dataclass("a", fields=[]) b = make_dataclass("b", fields=[], bases=(a,)) parser = NodeParser() queue = [] objects = [] attrs = {QNames.XSI_TYPE: "b"} ns_map = {} parser.start(a, queue, objects, "a", attrs, ns_map) expected_node = ElementNode( position=0, context=parser.context, meta=parser.context.build(b), config=parser.config, attrs=attrs, ns_map={}, derived=True, ) self.assertEqual(1, len(queue)) self.assertEqual(expected_node, queue[-1])
class NodeParserTests(TestCase): def setUp(self): self.parser = NodeParser() def test_parse(self): @dataclass class TestHandler(XmlHandler): def parse(self, source: Any) -> Any: return Books() self.parser.handler = TestHandler self.assertEqual(Books(), self.parser.parse([], Books)) def test_parse_when_result_type_is_wrong(self): parser = self.parser with self.assertRaises(ParserError) as cm: parser.parse([], Books) self.assertEqual("Failed to create target class `Books`", str(cm.exception)) def test_start(self): queue = [] objects = [] attrs = {"k": "v"} ns_map = {"a": "b"} expected_node = ElementNode( position=0, context=self.parser.context, meta=self.parser.context.build(Books), config=self.parser.config, attrs=attrs, ns_map=ns_map, ) self.parser.start(Books, queue, objects, "{urn:books}books", attrs, ns_map) self.assertEqual(1, len(queue)) self.assertEqual(expected_node, queue[0]) expected_node = replace( expected_node, meta=self.parser.context.build(BookForm), attrs={}, ns_map={} ) self.parser.start(Books, queue, objects, "book", {}, {}) self.assertEqual(2, len(queue)) self.assertEqual(expected_node, queue[-1]) def test_start_with_undefined_class(self): parser = self.parser queue = [] objects = [] attrs = {"k": "v"} ns_map = {"a": "b"} expected_node = ElementNode( position=0, context=parser.context, meta=parser.context.build(Books), config=parser.config, attrs=attrs, ns_map=ns_map, ) parser.start(None, queue, objects, "{urn:books}books", attrs, ns_map) self.assertEqual(1, len(queue)) self.assertEqual(expected_node, queue[0]) with self.assertRaises(ParserError) as cm: parser.start(None, [], [], "{unknown}hopefully", {}, {}) self.assertEqual( "No class found matching root: {unknown}hopefully", str(cm.exception) ) def test_start_with_any_type_root(self): parser = self.parser queue = [] objects = [] attrs = {QNames.XSI_TYPE: "bk:books"} ns_map = {"bk": "urn:books", "xsi": Namespace.XSI.uri} expected_node = ElementNode( position=0, context=parser.context, meta=parser.context.build(Books), config=parser.config, attrs=attrs, ns_map=ns_map, derived=True, ) parser.start(None, queue, objects, "doc", attrs, ns_map) self.assertEqual(1, len(queue)) self.assertEqual(expected_node, queue[0]) def test_start_with_derived_class(self): a = make_dataclass("a", fields=[]) b = make_dataclass("b", fields=[], bases=(a,)) parser = NodeParser() queue = [] objects = [] attrs = {QNames.XSI_TYPE: "b"} ns_map = {} parser.start(a, queue, objects, "a", attrs, ns_map) expected_node = ElementNode( position=0, context=parser.context, meta=parser.context.build(b), config=parser.config, attrs=attrs, ns_map={}, derived=True, ) self.assertEqual(1, len(queue)) self.assertEqual(expected_node, queue[-1]) @mock.patch.object(PrimitiveNode, "bind", return_value=True) def test_end(self, mock_assemble): parser = NodeParser() objects = [("q", "result")] queue = [] var = XmlVar(text=True, name="foo", qname="foo") queue.append(PrimitiveNode(var, ns_map={})) result = parser.end(queue, objects, "author", "foobar", None) self.assertEqual("result", result) self.assertEqual(0, len(queue)) self.assertEqual(("q", result), objects[-1]) mock_assemble.assert_called_once_with("author", "foobar", None, objects) def test_end_with_no_result(self): parser = NodeParser() objects = [("q", "result")] queue = [SkipNode()] result = parser.end(queue, objects, "author", "foobar", None) self.assertIsNone(result) self.assertEqual(0, len(queue)) def test_start_prefix_mapping(self): parser = NodeParser() parser.start_prefix_mapping("bar", "foo") parser.start_prefix_mapping("bar", "exists") self.assertEqual({"bar": "foo"}, parser.ns_map) parser.start_prefix_mapping(None, "a") self.assertEqual({"bar": "foo", None: "a"}, parser.ns_map) parser.start_prefix_mapping(None, "b") self.assertEqual({"bar": "foo", None: "a"}, parser.ns_map)