Skip to content

Commit 31ccb8a

Browse files
test junitxml: split the DomNode type to express the Document/Element difference
1 parent fd3ee18 commit 31ccb8a

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
@@ -40,7 +39,7 @@ def __init__(self, pytester: Pytester, schema: xmlschema.XMLSchema) -> None:
4039

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

5453

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

7776

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

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

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

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

9893
def find_nth_by_tag(self, tag: str, n: int) -> DomNode | None:
9994
items = self.__node.getElementsByTagName(tag)
@@ -102,15 +97,35 @@ def find_nth_by_tag(self, tag: str, n: int) -> DomNode | None:
10297
except IndexError:
10398
return None
10499
else:
105-
return type(self)(nth)
100+
return DomNode(nth)
106101

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

111128
def __getitem__(self, key: str) -> str:
112-
if isinstance(self.__node, minidom.Document):
113-
raise TypeError(type(self.__node))
114129
node = self.__node.getAttributeNode(key)
115130
if node is not None:
116131
return cast(str, node.value)
@@ -119,31 +134,19 @@ def __getitem__(self, key: str) -> str:
119134

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

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

132143
@property
133144
def tag(self) -> str:
134-
assert isinstance(self.__node, minidom.Element)
135145
return self.__node.tagName
136146

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

148151

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

0 commit comments

Comments
 (0)