Skip to content

Commit d9c1411

Browse files
authored
Merge pull request #132 from saroad2/argnames_can_be_lists
parametrize_with_cases can get argnames as list
2 parents 09eae11 + 9edea6a commit d9c1411

File tree

3 files changed

+55
-14
lines changed

3 files changed

+55
-14
lines changed

pytest_cases/case_parametrizer_new.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
pass
4040

4141

42-
def parametrize_with_cases(argnames, # type: str
42+
def parametrize_with_cases(argnames, # type: Union[str, List[str], Tuple[str, ...]]
4343
cases=AUTO, # type: Union[Callable, Type, ModuleRef]
4444
prefix=CASE_PREFIX_FUN, # type: str
4545
glob=None, # type: str

pytest_cases/fixture_parametrize_plus.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -800,24 +800,31 @@ def _get_argnames_argvalues(argnames=None, argvalues=None, **args):
800800
# simplify if needed to comply with pytest.mark.parametrize
801801
if len(argnames) == 1:
802802
argvalues = [l[0] if not is_marked_parameter_value(l) else l for l in argvalues]
803+
return argnames, argvalues
803804

804-
elif isinstance(argnames, string_types):
805+
if isinstance(argnames, string_types):
805806
# (2) argnames + argvalues, as usual. However **args can also be passed and should be added
806807
argnames = get_param_argnames_as_list(argnames)
807808

808-
if argvalues is None:
809-
raise ValueError("No argvalues provided while argnames are provided")
809+
if not isinstance(argnames, (list, tuple)):
810+
raise TypeError("argnames should be a string, list or a tuple")
810811

811-
# transform argvalues to a list (it can be a generator)
812-
try:
813-
argvalues = list(argvalues)
814-
except TypeError:
815-
raise InvalidParamsList(argvalues)
816-
817-
# append **args
818-
if len(kw_argnames) > 0:
819-
argnames, argvalues = cart_product_pytest((argnames, kw_argnames),
820-
(argvalues, kw_argvalues))
812+
if any([not isinstance(argname, str) for argname in argnames]):
813+
raise TypeError("all argnames should be strings")
814+
815+
if argvalues is None:
816+
raise ValueError("No argvalues provided while argnames are provided")
817+
818+
# transform argvalues to a list (it can be a generator)
819+
try:
820+
argvalues = list(argvalues)
821+
except TypeError:
822+
raise InvalidParamsList(argvalues)
823+
824+
# append **args
825+
if len(kw_argnames) > 0:
826+
argnames, argvalues = cart_product_pytest((argnames, kw_argnames),
827+
(argvalues, kw_argvalues))
821828

822829
return argnames, argvalues
823830

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import pytest
2+
3+
from pytest_cases import parametrize_with_cases
4+
5+
6+
def case_sum_one_plus_two():
7+
a = 1
8+
b = 2
9+
c = 3
10+
return a, b, c
11+
12+
13+
@parametrize_with_cases(argnames=["a", "b", "c"], cases=".")
14+
def test_argnames_as_list(a, b, c):
15+
assert a + b == c
16+
17+
18+
@parametrize_with_cases(argnames=("a", "b", "c"), cases=".")
19+
def test_argnames_as_tuple(a, b, c):
20+
assert a + b == c
21+
22+
23+
def test_argnames_from_invalid_type():
24+
with pytest.raises(
25+
TypeError, match="^argnames should be a string, list or a tuple$"
26+
):
27+
parametrize_with_cases(argnames=42, cases=".")(lambda _: None)
28+
29+
30+
def test_argnames_element_from_invalid_type():
31+
with pytest.raises(
32+
TypeError, match="^all argnames should be strings$"
33+
):
34+
parametrize_with_cases(argnames=["a", 2, "c"], cases=".")(lambda _: None)

0 commit comments

Comments
 (0)