refactor resolve_arg_value_types
* more explicit type checks * expand from list+tuple to sequence
This commit is contained in:
		
							parent
							
								
									898028cb22
								
							
						
					
					
						commit
						2c071a060e
					
				|  | @ -1,11 +1,12 @@ | |||
| """ Python test discovery, setup and run of test functions. """ | ||||
| import collections | ||||
| import enum | ||||
| import fnmatch | ||||
| import inspect | ||||
| import os | ||||
| import sys | ||||
| import warnings | ||||
| from collections import Counter | ||||
| from collections.abc import Sequence | ||||
| from functools import partial | ||||
| from textwrap import dedent | ||||
| 
 | ||||
|  | @ -1042,12 +1043,9 @@ class Metafunc(fixtures.FuncargnamesCompatAttr): | |||
|             * "params" if the argname should be the parameter of a fixture of the same name. | ||||
|             * "funcargs" if the argname should be a parameter to the parametrized test function. | ||||
|         """ | ||||
|         valtypes = {} | ||||
|         if indirect is True: | ||||
|             valtypes = dict.fromkeys(argnames, "params") | ||||
|         elif indirect is False: | ||||
|             valtypes = dict.fromkeys(argnames, "funcargs") | ||||
|         elif isinstance(indirect, (tuple, list)): | ||||
|         if isinstance(indirect, bool): | ||||
|             valtypes = dict.fromkeys(argnames, "params" if indirect else "funcargs") | ||||
|         elif isinstance(indirect, Sequence): | ||||
|             valtypes = dict.fromkeys(argnames, "funcargs") | ||||
|             for arg in indirect: | ||||
|                 if arg not in argnames: | ||||
|  | @ -1058,6 +1056,13 @@ class Metafunc(fixtures.FuncargnamesCompatAttr): | |||
|                         pytrace=False, | ||||
|                     ) | ||||
|                 valtypes[arg] = "params" | ||||
|         else: | ||||
|             fail( | ||||
|                 "In {func}: expected Sequence or boolean for indirect, got {type}".format( | ||||
|                     type=type(indirect).__name__, func=self.function.__name__ | ||||
|                 ), | ||||
|                 pytrace=False, | ||||
|             ) | ||||
|         return valtypes | ||||
| 
 | ||||
|     def _validate_if_using_arg_names(self, argnames, indirect): | ||||
|  | @ -1185,7 +1190,7 @@ def idmaker(argnames, parametersets, idfn=None, ids=None, config=None, item=None | |||
|     if len(set(ids)) != len(ids): | ||||
|         # The ids are not unique | ||||
|         duplicates = [testid for testid in ids if ids.count(testid) > 1] | ||||
|         counters = collections.defaultdict(lambda: 0) | ||||
|         counters = Counter() | ||||
|         for index, testid in enumerate(ids): | ||||
|             if testid in duplicates: | ||||
|                 ids[index] = testid + str(counters[testid]) | ||||
|  |  | |||
|  | @ -599,6 +599,17 @@ class TestMetafunc: | |||
|         assert metafunc._calls[0].funcargs == dict(x="a", y="b") | ||||
|         assert metafunc._calls[0].params == {} | ||||
| 
 | ||||
|     def test_parametrize_indirect_wrong_type(self): | ||||
|         def func(x, y): | ||||
|             pass | ||||
| 
 | ||||
|         metafunc = self.Metafunc(func) | ||||
|         with pytest.raises( | ||||
|             pytest.fail.Exception, | ||||
|             match="In func: expected Sequence or boolean for indirect, got dict", | ||||
|         ): | ||||
|             metafunc.parametrize("x, y", [("a", "b")], indirect={}) | ||||
| 
 | ||||
|     def test_parametrize_indirect_list_functional(self, testdir): | ||||
|         """ | ||||
|         #714 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue