Skip to content

Commit 0bd6c0c

Browse files
author
Sylvain MARIE
committed
The current_cases fixture now contains case parameters if any. Fixes #214
1 parent 64e2dbf commit 0bd6c0c

10 files changed

+393
-180
lines changed

pytest_cases/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from .case_funcs import case, copy_case_info, set_case_id, get_case_id, get_case_marks, \
1717
get_case_tags, matches_tag_query, is_case_class, is_case_function
1818
from .case_parametrizer_new import parametrize_with_cases, THIS_MODULE, get_all_cases, get_parametrize_args, \
19-
get_current_case_id, get_current_cases
19+
get_current_case_id, get_current_cases, get_current_params
2020

2121
try:
2222
# -- Distribution mode --
@@ -54,5 +54,5 @@
5454
'get_case_tags', 'matches_tag_query', 'is_case_class', 'is_case_function',
5555
# test functions
5656
'get_all_cases', 'parametrize_with_cases', 'THIS_MODULE', 'get_parametrize_args', 'get_current_case_id',
57-
'get_current_cases'
57+
'get_current_cases', 'get_current_params'
5858
]

pytest_cases/case_parametrizer_new.py

+269-160
Large diffs are not rendered by default.

pytest_cases/common_pytest.py

+23
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,16 @@ def safe_isclass(obj # type: object
136136
return False
137137

138138

139+
def safe_isinstance(obj, # type: object
140+
cls):
141+
# type: (...) -> bool
142+
"""Ignore any exception via isinstance"""
143+
try:
144+
return isinstance(obj, cls)
145+
except Exception: # noqa
146+
return False
147+
148+
139149
def assert_is_fixture(fixture_fun # type: Any
140150
):
141151
"""
@@ -885,3 +895,16 @@ def apply(test_or_fixture_func):
885895
return apply_decorator(test_or_fixture_func, container)
886896

887897
return apply
898+
899+
900+
def get_pytest_request_and_item(request_or_item):
901+
"""Return the `request` and `item` (node) from whatever is provided"""
902+
try:
903+
item = request_or_item.node
904+
except AttributeError:
905+
item = request_or_item
906+
request = item._request
907+
else:
908+
request = request_or_item
909+
910+
return item, request

pytest_cases/tests/cases/doc/test_doc_get_current_cases.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,18 @@ def my_fixture(foo):
1515
def test_get_current_case(data, my_fixture, current_cases):
1616

1717
# this is how to access the case function for a test parameter
18-
actual_case_id, case_fun = current_cases["data"]
18+
actual_case_id, case_fun, case_params = current_cases["data"]
1919

2020
# this is how to access the case function for a fixture parameter
21-
fix_actual_case_id, fix_case_fun = current_cases["my_fixture"]["foo"]
21+
fix_actual_case_id, fix_case_fun, fix_case_params = current_cases["my_fixture"]["foo"]
2222

2323
# let's print everything
2424
print(current_cases)
2525

2626
assert current_cases == {
27-
"data": ("a", case_a),
27+
"data": ("a", case_a, {}),
2828
"my_fixture": {
29-
"foo": ("a", case_a)
29+
"foo": ("a", case_a, {})
3030
}
3131
}
3232

pytest_cases/tests/cases/doc/test_get_current_cases.py

+8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from pytest_cases.common_pytest_marks import PYTEST3_OR_GREATER
99

10+
1011
@case(tags=("no_fix_needed",))
1112
def case_a():
1213
return 1, 2
@@ -68,23 +69,30 @@ def _assert_cases(current_cases, local=True):
6869
'a': case_a if local else casesfile.case_a,
6970
'b': case_b if local else casesfile.case_b
7071
}
72+
assert len(current_cases["purelazy_a"]) == 3
7173
assert current_cases["purelazy_a"][1] is ref_dict[current_cases["purelazy_a"][0]]
74+
assert current_cases["purelazy_a"][2] == {}
7275

76+
assert len(current_cases["purelazy_t1"]) == 3
7377
assert current_cases["purelazy_t1"][0] == "custom_id"
7478
assert current_cases["purelazy_t1"][1] is (tuplecase_a if local else casesfile.tuplecase_a)
79+
assert current_cases["purelazy_t1"][2] == {}
7580
assert current_cases["purelazy_t1"] == current_cases["purelazy_t2"]
7681

7782
ref_dict = {
7883
'a': case_a if local else casesfile.case_a,
7984
'b': case_b if local else casesfile.case_b,
8085
'custom_id': case_a_fixture if local else casesfile.case_a_fixture
8186
}
87+
assert len(current_cases["withfixrefs_f"]) == 3
8288
assert current_cases["withfixrefs_f"][1] is ref_dict[current_cases["withfixrefs_f"][0]]
89+
assert current_cases["withfixrefs_f"][2] == {}
8390

8491
ref_dict = {
8592
'custom_id': tuplecase_a if local else casesfile.tuplecase_a,
8693
"a_fixture": tuplecase_a_fixture if local else casesfile.tuplecase_a_fixture
8794
}
95+
assert len(current_cases["withfixrefs_f1"]) == 3
8896
assert current_cases["withfixrefs_f1"][1] is ref_dict[current_cases["withfixrefs_f1"][0]]
8997
assert current_cases["withfixrefs_f2"] == current_cases["withfixrefs_f1"]
9098

pytest_cases/tests/cases/doc/test_get_current_cases_negative.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def case_foo2(name):
3131

3232
@parametrize_with_cases("a", cases=case_foo2)
3333
def test_foo2(a, current_cases):
34-
assert current_cases == {'a': ('foo2', case_foo2)}
34+
assert current_cases == {'a': ('foo2', case_foo2, {'name': 'bar'})}
3535

3636

3737
# ----------- fix for issue 213 bis
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from pytest_cases import parametrize, parametrize_with_cases, fixture, get_current_params, get_current_cases
2+
3+
4+
@fixture
5+
@parametrize(FP_simple=('john',))
6+
def fixa(FP_simple):
7+
return 0, FP_simple
8+
9+
10+
@parametrize(CP_simple=('joe',))
11+
def case_casea(CP_simple, fixa):
12+
return CP_simple
13+
14+
15+
@parametrize_with_cases("CP_acase", cases=case_casea, idstyle="explicit")
16+
def case_caseb(CP_acase):
17+
return CP_acase
18+
19+
20+
@fixture
21+
@parametrize_with_cases("FP_acase", cases=".", idstyle="explicit")
22+
def fixb(FP_acase):
23+
return FP_acase
24+
25+
26+
i = 0
27+
28+
29+
@parametrize(TP_direct=(0,))
30+
@parametrize_with_cases("TP_acase", cases=".", idstyle="explicit")
31+
def test_foo(TP_acase, TP_direct, fixb, request):
32+
global i
33+
i += 1
34+
current_cases = get_current_cases(request)
35+
if i == 1:
36+
assert current_cases == {
37+
"TP_acase": ("casea", case_casea, {"CP_simple": "joe"}),
38+
"fixb": {
39+
"FP_acase": ("casea", case_casea, {"CP_simple": "joe"}),
40+
}
41+
}
42+
elif i == 2:
43+
assert current_cases == {
44+
"TP_acase": ("casea", case_casea, {"CP_simple": "joe"}),
45+
"fixb": {
46+
"FP_acase": ("caseb", case_caseb, {"CP_acase": ("casea", case_casea, {"CP_simple": "joe"})}),
47+
}
48+
}
49+
elif i == 3:
50+
assert current_cases == {
51+
"TP_acase": ("caseb", case_caseb, {"CP_acase": ("casea", case_casea, {"CP_simple": "joe"})}),
52+
"fixb": {
53+
"FP_acase": ("casea", case_casea, {"CP_simple": "joe"}),
54+
}
55+
}
56+
elif i == 4:
57+
assert current_cases == {
58+
"TP_acase": ("caseb", case_caseb, {"CP_acase": ("casea", case_casea, {"CP_simple": "joe"})}),
59+
"fixb": {
60+
"FP_acase": ("caseb", case_caseb, {"CP_acase": ("casea", case_casea, {"CP_simple": "joe"})}),
61+
}
62+
}

pytest_cases/tests/cases/issues/test_issue_158.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,9 @@ def case_y(x):
1111

1212

1313
@pytest_cases.parametrize_with_cases("y", case_y)
14-
def test_foo(y):
14+
def test_foo(y, current_cases):
1515
print(y)
16+
# adding this as this example contains an interesting name conflict to challenge current_cases
17+
assert current_cases == {
18+
'y': ('y', case_y, {'x': ('x', case_x, {})})
19+
}

pytest_cases/tests/cases/issues/test_issue_211.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@ def case_foo(self):
1818
@parametrize_with_cases('val', cases=MyClassName)
1919
def test_function(val, current_cases, request):
2020
print(val)
21-
case_id, case_func = current_cases['val']
22-
print((case_id, case_func))
21+
case_id, case_func, case_params = current_cases['val']
22+
print((case_id, case_func, case_params))
2323

2424
if (case_func is MyClassName.case_widget) if PY3 else (case_func == MyClassName.case_widget):
25-
# workaround to get the parameter, but a bit dirty
26-
if request.node.callspec.params['widget'].argvalues[0] == "joe":
25+
if case_params['name'] == 'joe':
26+
# two other ways to get the same detection :
27+
assert request.node.callspec.params['widget'].argvalues[0] == "joe"
2728
assert request.node.name == 'test_function[widget-name=joe]'
29+
2830
pytest.skip("joe skipped")
2931

3032
assert request.node.name != 'test_function[widget-name=joe]'

pytest_cases/tests/cases/issues/test_issue_212.py

+13-8
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ def case_foo(self):
1414
def test_function_basic_parametrize(val, current_cases):
1515
assert val == "fooval"
1616

17-
case_id, case_func = current_cases['val']
17+
case_id, case_func, case_paramz = current_cases['val']
1818
assert case_id == "foo"
1919
if PY3:
2020
assert case_func is MyClassName.case_foo
2121
else:
2222
assert case_func == MyClassName.case_foo
23+
assert case_paramz == {}
2324

2425

2526
class MyClassNameTuple:
@@ -31,14 +32,16 @@ def case_foo(self):
3132
def test_function_tuple_basic_parametrize(a, b, current_cases):
3233
assert (a, b) == (1, 2)
3334

34-
case_id, case_func = current_cases['a']
35-
assert case_id, case_func == current_cases['b']
35+
case_id, case_func, case_paramz = current_cases['a']
36+
assert current_cases['a'] == current_cases['b']
3637
assert case_id == "foo"
3738
if PY3:
3839
assert case_func is MyClassNameTuple.case_foo
3940
else:
4041
assert case_func == MyClassNameTuple.case_foo
4142

43+
assert case_paramz == {}
44+
4245

4346
class MyClassName2:
4447
def case_bar(self):
@@ -52,14 +55,16 @@ def case_foo(self, dummy):
5255
@parametrize_with_cases('val', cases=MyClassName2)
5356
def test_function_nested_parametrize(val, current_cases):
5457
ref = {
55-
"barval": MyClassName2.case_bar,
56-
"fooval": MyClassName2.case_foo
58+
"barval": (MyClassName2.case_bar, {}),
59+
"fooval": (MyClassName2.case_foo, {"dummy": "a"})
5760
}
5861

59-
case_id, case_func = current_cases['val']
62+
case_id, case_func, case_paramz = current_cases['val']
6063
assert case_id == val[:3]
6164

6265
if PY3:
63-
assert case_func is ref[val]
66+
assert case_func is ref[val][0]
6467
else:
65-
assert case_func == ref[val]
68+
assert case_func == ref[val][0]
69+
70+
assert case_paramz == ref[val][1]

0 commit comments

Comments
 (0)