51
51
52
52
# Strip path and content length because path may vary
53
53
RE_STRIP_UNCHECKABLE = b'MAP=[^"]+|Content-Length: \d+'
54
- RE_ATTRIBUTES = b'[^>\s]+=[^>\s]+'
54
+ RE_ELEMENT = b'</*([^>\s]+)[ >]'
55
+ RE_ELEMENT_CONTENT = b'\>([^><]+)'
56
+ RE_ATTRIBUTES = rb'((?:(?!\s|=).)*)\s*?=\s*?["\']?((?:(?<=")(?:(?<=\\)"|[^"])*|(?<=\')(?:(?<=\\)\'|[^\'])*)|(?:(?!"|\')(?:(?!\/>|>|\s).)+))'
55
57
56
58
57
59
class QgsServerTestBase (unittest .TestCase ):
@@ -71,17 +73,26 @@ def assertXMLEqual(self, response, expected, msg=''):
71
73
expected_line = expected_line .strip ()
72
74
response_line = response_lines [line_no - 1 ].strip ()
73
75
# Compare tag
74
- try :
75
- self .assertEqual (re .findall (b'<([^>\s]+)[ >]' , expected_line )[0 ],
76
- re .findall (b'<([^>\s]+)[ >]' , response_line )[0 ], msg = msg + "\n Tag mismatch on line %s: %s != %s" % (line_no , expected_line , response_line ))
77
- except IndexError :
76
+ if re .match (RE_ELEMENT , expected_line ):
77
+ expected_elements = re .findall (RE_ELEMENT , expected_line )
78
+ response_elements = re .findall (RE_ELEMENT , response_line )
79
+ self .assertEqual (expected_elements [0 ],
80
+ response_elements [0 ], msg = msg + "\n Tag mismatch on line %s: %s != %s" % (line_no , expected_line , response_line ))
81
+ # Compare content
82
+ if len (expected_elements ) == 2 and expected_elements [0 ] == expected_elements [1 ]:
83
+ expected_element_content = re .findall (RE_ELEMENT_CONTENT , expected_line )
84
+ response_element_content = re .findall (RE_ELEMENT_CONTENT , response_line )
85
+ self .assertEqual (expected_element_content [0 ],
86
+ response_element_content [0 ], msg = msg + "\n Content mismatch on line %s: %s != %s" % (line_no , expected_line , response_line ))
87
+ else :
78
88
self .assertEqual (expected_line , response_line , msg = msg + "\n Tag line mismatch %s: %s != %s\n %s" % (line_no , expected_line , response_line , msg ))
79
89
# print("---->%s\t%s == %s" % (line_no, expected_line, response_line))
80
90
# Compare attributes
81
- if re .match (RE_ATTRIBUTES , expected_line ): # has attrs
82
- expected_attrs = sorted (re .findall (RE_ATTRIBUTES , expected_line ))
83
- response_attrs = sorted (re .findall (RE_ATTRIBUTES , response_line ))
91
+ if re .findall (RE_ATTRIBUTES , expected_line ): # has attrs
92
+ expected_attrs , expected_values = zip ( * sorted (re .findall (RE_ATTRIBUTES , expected_line ) ))
93
+ response_attrs , response_values = zip ( * sorted (re .findall (RE_ATTRIBUTES , response_line ) ))
84
94
self .assertEqual (expected_attrs , response_attrs , msg = msg + "\n XML attributes differ at line {0}: {1} != {2}" .format (line_no , expected_attrs , response_attrs ))
95
+ self .assertEqual (expected_values , response_values , msg = msg + "\n XML attribute values differ at line {0}: {1} != {2}" .format (line_no , expected_attrs , response_attrs ))
85
96
line_no += 1
86
97
87
98
@classmethod
0 commit comments