def test_iter_nested_items_function(self): if sys.version_info >= (3, 6): self.assertListEqual(list(iter_nested_items({ 'a': 10, 'b': 20 })), [10, 20]) self.assertListEqual( list(iter_nested_items([{ 'a': 10, 'b': 20 }, 30])), [10, 20, 30]) with self.assertRaises(TypeError): list(iter_nested_items({'a': 10, 'b': 20}, dict_class=OrderedDict)) with self.assertRaises(TypeError): list(iter_nested_items([10, 20], list_class=tuple))
def check_decode_encode(self, root, converter=None, **kwargs): namespaces = kwargs.get('namespaces', {}) lossy = converter in (ParkerConverter, AbderaConverter) losslessly = converter is JsonMLConverter unordered = converter not in (AbderaConverter, JsonMLConverter) or \ kwargs.get('unordered', False) data1 = self.schema.decode(root, converter=converter, **kwargs) if isinstance(data1, tuple): data1 = data1[0] # When validation='lax' for _ in iter_nested_items(data1, dict_class=ordered_dict_class): pass try: elem1 = self.schema.encode(data1, path=root.tag, converter=converter, **kwargs) except XMLSchemaValidationError as err: raise AssertionError( str(err) + msg_tmpl % "error during re-encoding") if isinstance(elem1, tuple): # When validation='lax' if converter is not ParkerConverter: for e in elem1[1]: self.check_namespace_prefixes(str(e)) elem1 = elem1[0] # Checks the encoded element to not contains reserved namespace prefixes if namespaces and all('ns%d' % k not in namespaces for k in range(10)): self.check_namespace_prefixes( etree_tostring(elem1, namespaces=namespaces)) # Main check: compare original a re-encoded tree try: etree_elements_assert_equal(root, elem1, strict=False, unordered=unordered) except AssertionError as err: # If the check fails retry only if the converter is lossy (eg. ParkerConverter) # or if the XML case has defaults taken from the schema or some part of data # decoding is skipped by schema wildcards (set the specific argument in testfiles). if lax_encode: pass # can't ensure encode equivalence if the test case use defaults elif lossy: pass # can't check encode equivalence if the converter is lossy elif losslessly: if debug_mode: pdb.set_trace() raise AssertionError( str(err) + msg_tmpl % "encoded tree differs from original") else: # Lossy or augmenting cases are checked with another decoding/encoding pass data2 = self.schema.decode(elem1, converter=converter, **kwargs) if isinstance(data2, tuple): data2 = data2[0] if sys.version_info >= (3, 6): # For Python < 3.6 cannot ensure attribute decoding order try: self.assertEqual( data1, data2, msg_tmpl % "re-decoded data changed") except AssertionError: if debug_mode: pdb.set_trace() raise elem2 = self.schema.encode(data2, path=root.tag, converter=converter, **kwargs) if isinstance(elem2, tuple): elem2 = elem2[0] try: etree_elements_assert_equal(elem1, elem2, strict=False, unordered=unordered) except AssertionError as err: if debug_mode: pdb.set_trace() raise AssertionError( str(err) + msg_tmpl % "encoded tree differs after second pass")