Skip to content

Commit d527529

Browse files
committed
Correctly handle combined class and test order markers
- fixes #45
1 parent 9af6762 commit d527529

6 files changed

+96
-5
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# pytest-order Release Notes
22

3+
## Unreleased
4+
5+
### Fixes
6+
- correctly handle combined class and test order markers,
7+
see [#45](https://github.com/pytest-dev/pytest-order/issues/45)
8+
39
## [Version 1.0.0](https://pypi.org/project/pytest-order/1.0.0/) (2021-05-30)
410
First Python 3 only version.
511

pytest_order/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "1.0.0"
1+
__version__ = "1.1.dev0"

pytest_order/sorter.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def mark_binning(
128128
if has_dependency or self.settings.auto_mark_dep:
129129
self.handle_dependency_mark(item, has_order, dep_marks, aliases)
130130
if has_order:
131-
self.handle_order_mark(item)
131+
self.handle_order_marks(item)
132132

133133
def handle_dependency_mark(
134134
self,
@@ -160,8 +160,12 @@ def handle_dependency_mark(
160160
name_mark = item.node_id
161161
aliases[name_mark] = item
162162

163-
def handle_order_mark(self, item: Item) -> None:
164-
mark = cast(Mark, item.item.get_closest_marker("order"))
163+
def handle_order_marks(self, item: Item) -> None:
164+
marks = item.item.iter_markers("order")
165+
for mark in marks:
166+
self.handle_order_mark(item, mark)
167+
168+
def handle_order_mark(self, item: Item, mark: Mark) -> None:
165169
order = mark.args[0] if mark.args else mark.kwargs.get("index")
166170
if order is not None:
167171
if isinstance(order, int):
@@ -171,7 +175,8 @@ def handle_order_mark(self, item: Item) -> None:
171175
else:
172176
warn("Unknown order attribute:'{}'".format(order))
173177
order = None
174-
item.order = order
178+
if item.order is None:
179+
item.order = order
175180
self.handle_relative_marks(item, mark)
176181
if order is not None:
177182
item.nr_rel_items = 0

tests/test_class_marks.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,30 @@ def test_2(self): pass
179179
"Test1::test_1",
180180
"Test1::test_2",
181181
]
182+
183+
184+
def test_rel_class_mark_with_order_mark(item_names_for):
185+
tests_content = (
186+
"""
187+
import pytest
188+
189+
class Test1:
190+
def test_1(self): pass
191+
192+
def test_2(self): pass
193+
194+
@pytest.mark.order(before="Test1")
195+
class Test2:
196+
@pytest.mark.order(2)
197+
def test_1(self): pass
198+
199+
@pytest.mark.order(1)
200+
def test_2(self): pass
201+
"""
202+
)
203+
assert item_names_for(tests_content) == [
204+
"Test2::test_2",
205+
"Test2::test_1",
206+
"Test1::test_1",
207+
"Test1::test_2",
208+
]

tests/test_order_group_scope_relative.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,34 @@ def test_class_group_scope_module_scope(fixture_path):
133133
"test_rel4.py::test_one PASSED",
134134
"test_rel4.py::test_two PASSED",
135135
])
136+
137+
138+
def test_rel_class_mark_with_order_mark(test_path):
139+
test_path.makepyfile(
140+
test_class_rel="""
141+
import pytest
142+
143+
class Test1:
144+
def test_1(self): pass
145+
146+
@pytest.mark.order(1)
147+
def test_2(self): pass
148+
149+
@pytest.mark.order(before="Test1")
150+
class Test2:
151+
def test_1(self): pass
152+
153+
@pytest.mark.order(1)
154+
def test_2(self): pass
155+
"""
156+
)
157+
result = test_path.runpytest(
158+
"-v", "--order-group-scope=class"
159+
)
160+
result.assert_outcomes(passed=4, failed=0)
161+
result.stdout.fnmatch_lines([
162+
"test_class_rel.py::Test2::test_2 PASSED",
163+
"test_class_rel.py::Test2::test_1 PASSED",
164+
"test_class_rel.py::Test1::test_2 PASSED",
165+
"test_class_rel.py::Test1::test_1 PASSED",
166+
])

tests/test_relative_ordering.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,28 @@ def test_3():
322322
assert item_names_for(test_content) == ["test_3", "test_2", "test_1"]
323323

324324

325+
def test_multiple_markers(item_names_for):
326+
test_content = (
327+
"""
328+
import pytest
329+
330+
def test_1():
331+
pass
332+
333+
@pytest.mark.order(before="test_1")
334+
@pytest.mark.order(2)
335+
def test_2():
336+
pass
337+
338+
@pytest.mark.order(1)
339+
@pytest.mark.order(before="test_1")
340+
def test_3():
341+
pass
342+
"""
343+
)
344+
assert item_names_for(test_content) == ["test_3", "test_2", "test_1"]
345+
346+
325347
def test_combined_markers3(item_names_for):
326348
test_content = (
327349
"""

0 commit comments

Comments
 (0)