def bind(self, qname: str, text: NoneStr, tail: NoneStr, objects: List) -> bool: children = ParserUtils.fetch_any_children(self.position, objects) attributes = ParserUtils.parse_any_attributes(self.attrs, self.ns_map) derived = self.var.derived or qname != self.var.qname text = ParserUtils.normalize_content(text) if children else text text = "" if text is None and not self.var.nillable else text tail = ParserUtils.normalize_content(tail) if tail or attributes or children or self.var.wildcard or derived: obj = AnyElement( qname=qname, text=text, tail=tail, attributes=attributes, children=children, ) objects.append((self.var.qname, obj)) else: objects.append((self.var.qname, text)) return True
def test_parser(self): parser = TreeParser() path = fixtures_dir.joinpath("books/bk001.xml") actual = parser.from_path(path) expected = AnyElement( qname="book", text="", children=[ AnyElement(qname="author", text="Hightower, Kim"), AnyElement(qname="title", text="The First Book"), AnyElement(qname="genre", text="Fiction"), AnyElement(qname="price", text="44.95"), AnyElement(qname="pub_date", text="2000-10-01"), AnyElement(qname="review", text="An amazing story of nothing."), ], attributes={"id": "bk001"}, ) self.assertEqual(expected, actual)
def test_write_mixed_content(self): var = XmlVar(wildcard=True, qname="a", name="a", mixed=True) book = BookForm(id="123") ebook = DerivedElement("ebook", BookForm(id="123")) value = ["text", AnyElement(qname="br"), book, ebook, "tail"] result = self.serializer.write_value(value, var, "xsdata") expected = [ (XmlWriterEvent.DATA, "text"), (XmlWriterEvent.START, "br"), (XmlWriterEvent.DATA, None), (XmlWriterEvent.END, "br"), (XmlWriterEvent.START, "{xsdata}BookForm"), (XmlWriterEvent.ATTR, "id", "123"), (XmlWriterEvent.ATTR, "lang", "en"), (XmlWriterEvent.END, "{xsdata}BookForm"), (XmlWriterEvent.START, "ebook"), (XmlWriterEvent.ATTR, "id", "123"), (XmlWriterEvent.ATTR, "lang", "en"), (XmlWriterEvent.END, "ebook"), (XmlWriterEvent.DATA, "tail"), ] self.assertIsInstance(result, Generator) self.assertEqual(expected, list(result))
def test_build_envelope_class_with_style_rpc( self, mock_get_or_create_inner_class, mock_map_binding_message_parts, mock_map_port_type_message, ): mock_get_or_create_inner_class.side_effect = mock_create_inner mock_map_binding_message_parts.side_effect = mock_create_attr mock_map_port_type_message.side_effect = mock_create_attr name = "some_operation_bindings" style = "rpc" namespace = "xsdata" definitions = Definitions(location="foo.wsdl", target_namespace="bar") port_type_message = PortTypeMessage(message="some_operation") binding_message = BindingMessage(extended=[ AnyElement(qname="body", attributes={"namespace": "bodyns"}), AnyElement(qname="header"), AnyElement(qname="header"), ]) binding_message.ns_map["foo"] = "bar" result = DefinitionsMapper.build_envelope_class( definitions, binding_message, port_type_message, name, style, namespace) expected = Class( qname=build_qname("bar", name), meta_name="Envelope", tag=Tag.BINDING_MESSAGE, module="foo", ns_map={"foo": "bar"}, namespace="xsdata", ) self.assertEqual(2, len(result.inner)) self.assertEqual(1, len(result.inner[0].attrs)) self.assertEqual(2, len(result.inner[1].attrs)) self.maxDiff = None mock_map_port_type_message.assert_called_once_with( port_type_message, "bodyns") mock_map_binding_message_parts.assert_has_calls([ mock.call( definitions, port_type_message.message, binding_message.extended[1], result.inner[1].ns_map, ), mock.call( definitions, port_type_message.message, binding_message.extended[2], result.inner[1].ns_map, ), ]) mock_get_or_create_inner_class.assert_has_calls([ mock.call(mock.ANY, "Body"), mock.call(mock.ANY, "Header"), mock.call(mock.ANY, "Header"), ]) result.inner.clear() self.assertEqual(expected, result)
def test_build_envelope_class( self, mock_get_or_create_inner_class, mock_map_binding_message_parts, mock_map_port_type_message, ): mock_get_or_create_inner_class.side_effect = mock_create_inner mock_map_binding_message_parts.side_effect = mock_create_attr name = "some_operation_bindings" style = "document" namespace = "xsdata" definitions = Definitions(location="foo.wsdl", target_namespace="bar") port_type_message = PortTypeMessage(message="some_operation") binding_message = BindingMessage( extended=[ AnyElement(qname="body"), AnyElement(qname="header"), AnyElement(qname="header"), ] ) binding_message.ns_map["foo"] = "bar" result = DefinitionsMapper.build_envelope_class( definitions, binding_message, port_type_message, name, style, namespace ) expected = Class( qname=build_qname("bar", name), meta_name="Envelope", type=BindingMessage, module="foo", ns_map={"foo": "bar"}, namespace="xsdata", ) self.assertEqual(2, len(result.inner)) self.assertEqual(1, len(result.inner[0].attrs)) self.assertEqual(2, len(result.inner[1].attrs)) self.assertEqual(0, mock_map_port_type_message.call_count) mock_map_binding_message_parts.assert_has_calls( [ mock.call( definitions, port_type_message.message, binding_message.extended[0], result.inner[0].ns_map, ), mock.call( definitions, port_type_message.message, binding_message.extended[1], result.inner[1].ns_map, ), mock.call( definitions, port_type_message.message, binding_message.extended[2], result.inner[1].ns_map, ), ] ) mock_get_or_create_inner_class.assert_has_calls( [ mock.call(mock.ANY, "Body"), mock.call(mock.ANY, "Header"), mock.call(mock.ANY, "Header"), ] ) result.inner.clear() self.assertEqual(expected, result)