Source code for pook.matchers.xml

import json

import xmltodict

from ..assertion import equal
from .base import BaseMatcher


[docs] class XMLMatcher(BaseMatcher): """ Match XML documents of equivalent structural value. XML documents are matched on the structured data in the document, rather than on the strict organisation of the document. The following two XML snippets are treated as identical by this matcher: <a value="one"></a> <b>two</b> ... is considered idential to ... <b>two</b> <a value="one"></a> In other words, the order does not matter in comparison. Use ``BodyMatcher`` to strictly match the exact textual structure. """ def __init__(self, data): BaseMatcher.__init__(self, data) if isinstance(data, str): self.expectation = xmltodict.parse(data)
[docs] def compare(self, data): x = json.dumps(xmltodict.parse(data), sort_keys=True) y = json.dumps(self.expectation, sort_keys=True) return equal(x, y)
[docs] @BaseMatcher.matcher def match(self, req): xml = req.xml if not isinstance(xml, str): return False return self.compare(xml)