Skip to content

Commit 674ec71

Browse files
test junitxml: split the DomNode type to express the Document/Element difference
1 parent 865cb4f commit 674ec71

File tree

1 file changed

+37
-34
lines changed

1 file changed

+37
-34
lines changed

testing/test_junitxml.py

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# mypy: allow-untyped-defs
21
from __future__ import annotations
32

43
from datetime import datetime
@@ -41,7 +40,7 @@ def __init__(self, pytester: Pytester, schema: xmlschema.XMLSchema) -> None:
4140

4241
def __call__(
4342
self, *args: str | os.PathLike[str], family: str | None = "xunit1"
44-
) -> tuple[RunResult, DomNode]:
43+
) -> tuple[RunResult, DomDocument]:
4544
if family:
4645
args = ("-o", "junit_family=" + family, *args)
4746
xml_path = self.pytester.path.joinpath("junit.xml")
@@ -50,7 +49,7 @@ def __call__(
5049
with xml_path.open(encoding="utf-8") as f:
5150
self.schema.validate(f)
5251
xmldoc = minidom.parse(str(xml_path))
53-
return result, DomNode(xmldoc)
52+
return result, DomDocument(xmldoc)
5453

5554

5655
@pytest.fixture
@@ -76,25 +75,21 @@ def nodeval(node: minidom.Element, name: str) -> str | None:
7675
assert on_node == expected
7776

7877

79-
class DomNode:
80-
def __init__(self, dom: minidom.Element | minidom.Document):
78+
class DomDocument:
79+
def __init__(self, dom: minidom.Document):
8180
self.__node = dom
8281

83-
def __repr__(self) -> str:
84-
return self.__node.toxml()
82+
__node: minidom.Document
8583

8684
def find_first_by_tag(self, tag: str) -> DomNode | None:
8785
return self.find_nth_by_tag(tag, 0)
8886

89-
@property
90-
def children(self) -> list[DomNode]:
91-
return [type(self)(x) for x in self.__node.childNodes]
92-
93-
@property
94-
def get_unique_child(self) -> DomNode:
95-
children = self.children
96-
assert len(children) == 1
97-
return children[0]
87+
def get_first_by_tag(self, tag: str) -> DomNode:
88+
maybe = self.find_first_by_tag(tag)
89+
if maybe is None:
90+
raise LookupError(tag)
91+
else:
92+
return maybe
9893

9994
def find_nth_by_tag(self, tag: str, n: int) -> DomNode | None:
10095
items = self.__node.getElementsByTagName(tag)
@@ -103,15 +98,35 @@ def find_nth_by_tag(self, tag: str, n: int) -> DomNode | None:
10398
except IndexError:
10499
return None
105100
else:
106-
return type(self)(nth)
101+
return DomNode(nth)
107102

108103
def find_by_tag(self, tag: str) -> list[DomNode]:
109-
t = type(self)
110-
return [t(x) for x in self.__node.getElementsByTagName(tag)]
104+
return [DomNode(x) for x in self.__node.getElementsByTagName(tag)]
105+
106+
@property
107+
def children(self) -> list[DomNode]:
108+
return [DomNode(x) for x in self.__node.childNodes]
109+
110+
@property
111+
def get_unique_child(self) -> DomNode:
112+
children = self.children
113+
assert len(children) == 1
114+
return children[0]
115+
116+
def toxml(self) -> str:
117+
return self.__node.toxml()
118+
119+
120+
class DomNode(DomDocument):
121+
__node: minidom.Element
122+
123+
def __init__(self, dom: minidom.Element):
124+
self.__node = dom
125+
126+
def __repr__(self) -> str:
127+
return self.toxml()
111128

112129
def __getitem__(self, key: str) -> str:
113-
if isinstance(self.__node, minidom.Document):
114-
raise TypeError(type(self.__node))
115130
node = self.__node.getAttributeNode(key)
116131
if node is not None:
117132
return cast(str, node.value)
@@ -120,31 +135,19 @@ def __getitem__(self, key: str) -> str:
120135

121136
def assert_attr(self, **kwargs: object) -> None:
122137
__tracebackhide__ = True
123-
assert isinstance(self.__node, minidom.Element)
124138
return assert_attr(self.__node, **kwargs)
125139

126-
def toxml(self) -> str:
127-
return self.__node.toxml()
128-
129140
@property
130141
def text(self) -> str:
131142
return cast(str, self.__node.childNodes[0].wholeText)
132143

133144
@property
134145
def tag(self) -> str:
135-
assert isinstance(self.__node, minidom.Element)
136146
return self.__node.tagName
137147

138148
@property
139149
def next_sibling(self) -> DomNode:
140-
return type(self)(self.__node.nextSibling)
141-
142-
def get_first_by_tag(self, tag: str) -> DomNode:
143-
maybe = self.find_first_by_tag(tag)
144-
if maybe is None:
145-
raise LookupError(tag)
146-
else:
147-
return maybe
150+
return DomNode(self.__node.nextSibling)
148151

149152

150153
parametrize_families = pytest.mark.parametrize("xunit_family", ["xunit1", "xunit2"])

0 commit comments

Comments
 (0)