Skip to content

Commit 33f3bed

Browse files
committed
test: added tests for idf_parametrize
1 parent 0afaba0 commit 33f3bed

File tree

2 files changed

+198
-12
lines changed

2 files changed

+198
-12
lines changed

pytest-embedded-idf/pytest_embedded_idf/unity.py renamed to pytest-embedded-idf/pytest_embedded_idf/utils.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,24 @@ def _expand_target_values(values: t.List[t.List[t.Any]], target_index: int) -> t
2424
return expanded_values
2525

2626

27-
def _process_pytest_value(value: t.List[t.Any], runner_index: int) -> t.Union[t.Any, pytest.param]:
27+
def _process_pytest_value(value: t.Union[t.List[t.Any], t.Any], markers_index: int) -> t.Any:
2828
"""
2929
Processes a single parameter value, converting it to pytest.param if needed.
3030
"""
31-
if isinstance(value, (int, str)):
31+
if not isinstance(value, (list, tuple)):
3232
return value
3333

3434
params, marks = [], []
3535
for i, element in enumerate(value):
36-
if i == runner_index:
37-
if isinstance(element, str):
38-
element = tuple(element.split(','))
36+
if i == markers_index:
37+
if not isinstance(element, tuple):
38+
element = (element,)
3939
if isinstance(element, tuple):
40-
marks.extend(getattr(pytest.mark, mark) for mark in element)
40+
marks.extend(element)
4141
else:
4242
params.append(element)
4343

44-
return pytest.param(*params, marks=marks)
44+
return pytest.param(*params, marks=tuple(marks))
4545

4646

4747
def idf_parametrize(
@@ -59,20 +59,21 @@ def idf_parametrize(
5959
Decorated test function with parametrization applied
6060
"""
6161
param_list = [name.strip() for name in param_names.split(',')]
62-
if not param_list:
63-
raise ValueError('No parameter names provided')
62+
for param in param_list:
63+
if not param:
64+
raise ValueError(f'One of the provided parameters name is empty: {param_list}')
6465

65-
runner_index = param_list.index('env_marker') if 'env_marker' in param_list else -1
66+
markers_index = param_list.index('markers') if 'markers' in param_list else -1
6667
target_index = param_list.index('target') if 'target' in param_list else -1
6768

68-
filtered_params = [name for name in param_list if name != 'env_marker']
69+
filtered_params = [name for name in param_list if name != 'markers']
6970

7071
normalized_values = [[value] if len(param_list) == 1 else list(value) for value in values]
7172

7273
if target_index != -1:
7374
normalized_values = _expand_target_values(normalized_values, target_index)
7475

75-
processed_values = [_process_pytest_value(value, runner_index) for value in normalized_values]
76+
processed_values = [_process_pytest_value(value, markers_index) for value in normalized_values]
7677

7778
def decorator(func):
7879
return pytest.mark.parametrize(','.join(filtered_params), processed_values, indirect=indirect)(func)

pytest-embedded-idf/tests/test_idf.py

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,3 +1176,188 @@ def test_from_args():
11761176

11771177
for result, expected in results:
11781178
result.assert_outcomes(**expected)
1179+
1180+
1181+
def test_expand_target_values_supported_targets(testdir, copy_mock_esp_idf, monkeypatch): # noqa: ARG001
1182+
monkeypatch.setenv('IDF_PATH', str(testdir))
1183+
1184+
from esp_bool_parser import SUPPORTED_TARGETS
1185+
from pytest_embedded_idf.utils import _expand_target_values
1186+
1187+
values = [['param_1', 'supported_targets', 'param_2']]
1188+
result = _expand_target_values(values, 1)
1189+
assert len(result) == len(SUPPORTED_TARGETS)
1190+
for target, expanded in zip(SUPPORTED_TARGETS, result):
1191+
assert expanded == ['param_1', target, 'param_2']
1192+
1193+
1194+
def test_expand_target_values_preview_targets(testdir, copy_mock_esp_idf, monkeypatch): # noqa: ARG001
1195+
monkeypatch.setenv('IDF_PATH', str(testdir))
1196+
1197+
from esp_bool_parser import PREVIEW_TARGETS
1198+
from pytest_embedded_idf.utils import _expand_target_values
1199+
1200+
"""Test expansion of preview_targets"""
1201+
values = [['param_1', 'preview_targets', 'param_2']]
1202+
result = _expand_target_values(values, 1)
1203+
1204+
assert len(result) == len(PREVIEW_TARGETS)
1205+
for target, expanded in zip(PREVIEW_TARGETS, result):
1206+
assert expanded == ['param_1', target, 'param_2']
1207+
1208+
1209+
def test_expand_target_values_specific_target(testdir, copy_mock_esp_idf, monkeypatch): # noqa: ARG001
1210+
monkeypatch.setenv('IDF_PATH', str(testdir))
1211+
1212+
from esp_bool_parser import SUPPORTED_TARGETS
1213+
from pytest_embedded_idf.utils import _expand_target_values
1214+
1215+
"""Test handling of specific target"""
1216+
values = [['param_1', 'esp32', 'param_2'], ['param_3', 'supported_targets', 'param_4']]
1217+
result = _expand_target_values(values, 1)
1218+
1219+
assert len(result) == 1 + len(SUPPORTED_TARGETS)
1220+
assert result == [['param_1', 'esp32', 'param_2']] + [['param_3', _t, 'param_4'] for _t in SUPPORTED_TARGETS]
1221+
1222+
1223+
def test_process_pytest_value_simple(testdir, copy_mock_esp_idf, monkeypatch): # noqa: ARG001
1224+
"""Test processing of simple parameter values"""
1225+
monkeypatch.setenv('IDF_PATH', str(testdir))
1226+
1227+
from pytest_embedded_idf.utils import _process_pytest_value
1228+
1229+
value = 'simple_value'
1230+
result = _process_pytest_value(value, -1)
1231+
assert result == 'simple_value'
1232+
1233+
1234+
def test_process_pytest_value_with_single_mark(testdir, copy_mock_esp_idf, monkeypatch): # noqa: ARG001
1235+
"""Test processing value with a single pytest mark"""
1236+
monkeypatch.setenv('IDF_PATH', str(testdir))
1237+
from pytest_embedded_idf.utils import _process_pytest_value
1238+
1239+
mark = pytest.mark.skip(reason='test')
1240+
value = ['param1', 'param2', (mark,)]
1241+
result = _process_pytest_value(value, 2)
1242+
1243+
assert result == pytest.param(*('param1', 'param2'), marks=(mark))
1244+
assert result.marks == (mark,)
1245+
assert result.values == ('param1', 'param2')
1246+
1247+
1248+
def test_process_pytest_value_with_multiple_marks(testdir, copy_mock_esp_idf, monkeypatch): # noqa: ARG001
1249+
"""Test processing value with multiple pytest marks"""
1250+
monkeypatch.setenv('IDF_PATH', str(testdir))
1251+
from pytest_embedded_idf.utils import _process_pytest_value
1252+
1253+
marks = (pytest.mark.skip(reason='test'), pytest.mark.xfail())
1254+
value = ['param1', 'param2', marks]
1255+
result = _process_pytest_value(value, 2)
1256+
1257+
assert result == pytest.param(*('param1', 'param2'), marks=marks)
1258+
assert result.marks == marks
1259+
assert result.values == ('param1', 'param2')
1260+
1261+
1262+
def test_idf_parametrize_basic(testdir, copy_mock_esp_idf, monkeypatch): # noqa: ARG001
1263+
"""Test basic parametrize functionality"""
1264+
monkeypatch.setenv('IDF_PATH', str(testdir))
1265+
from pytest_embedded_idf.utils import idf_parametrize
1266+
1267+
@idf_parametrize('param', ['value1', 'value2'], indirect=True)
1268+
def test_func():
1269+
pass
1270+
1271+
markers = [mark for mark in test_func.pytestmark if mark.name == 'parametrize']
1272+
assert len(markers) == 1
1273+
assert markers == [
1274+
(
1275+
pytest.mark.parametrize(
1276+
'param',
1277+
[pytest.param(*('value1',), marks=(), id=None), pytest.param(*('value2',), marks=(), id=None)],
1278+
indirect=True,
1279+
)
1280+
).mark
1281+
] # Changed to indirect=True
1282+
assert markers[0].args[0] == 'param'
1283+
assert markers[0].args[1] == [
1284+
pytest.param(*('value1',), marks=(), id=None),
1285+
pytest.param(*('value2',), marks=(), id=None),
1286+
]
1287+
1288+
1289+
def test_idf_parametrize_with_target(testdir, copy_mock_esp_idf, monkeypatch): # noqa: ARG001
1290+
"""Test parametrize with target expansion"""
1291+
monkeypatch.setenv('IDF_PATH', str(testdir))
1292+
from esp_bool_parser import SUPPORTED_TARGETS
1293+
from pytest_embedded_idf.utils import idf_parametrize
1294+
1295+
@idf_parametrize('target,param', [('supported_targets', 'something')], indirect=True)
1296+
def test_func():
1297+
pass
1298+
1299+
markers = [mark for mark in test_func.pytestmark if mark.name == 'parametrize']
1300+
assert len(markers) == 1
1301+
1302+
expected_params = [pytest.param(*(target, 'something'), marks=(), id=None) for target in SUPPORTED_TARGETS]
1303+
1304+
assert markers == [(pytest.mark.parametrize('target,param', expected_params, indirect=True)).mark]
1305+
1306+
assert markers[0].args[0] == 'target,param'
1307+
assert markers[0].args[1] == expected_params
1308+
1309+
1310+
def test_idf_parametrize_with_marker(testdir, copy_mock_esp_idf, monkeypatch): # noqa: ARG001
1311+
"""Test parametrize with pytest markers"""
1312+
monkeypatch.setenv('IDF_PATH', str(testdir))
1313+
from pytest_embedded_idf.utils import idf_parametrize
1314+
1315+
mark = pytest.mark.skip(reason='test')
1316+
1317+
@idf_parametrize('param,markers', [('something', mark)], indirect=True)
1318+
def test_func():
1319+
pass
1320+
1321+
markers = [mark for mark in test_func.pytestmark if mark.name == 'parametrize']
1322+
assert len(markers) == 1
1323+
1324+
expected_params = [pytest.param(*('something',), marks=(mark,), id=None)]
1325+
1326+
assert markers == [(pytest.mark.parametrize('param', expected_params, indirect=True)).mark]
1327+
1328+
assert markers[0].args[0] == 'param'
1329+
assert markers[0].args[1] == expected_params
1330+
1331+
1332+
def test_idf_parametrize_with_markers(testdir, copy_mock_esp_idf, monkeypatch): # noqa: ARG001
1333+
"""Test parametrize with pytest markers"""
1334+
monkeypatch.setenv('IDF_PATH', str(testdir))
1335+
from pytest_embedded_idf.utils import idf_parametrize
1336+
1337+
marks = (pytest.mark.skip(reason='test'), pytest.mark.skip(reason='wait for fix'))
1338+
1339+
@idf_parametrize('param,markers', [('something', marks)], indirect=True)
1340+
def test_func():
1341+
pass
1342+
1343+
markers = [mark for mark in test_func.pytestmark if mark.name == 'parametrize']
1344+
assert len(markers) == 1
1345+
1346+
expected_params = [pytest.param(*('something',), marks=marks, id=None)]
1347+
1348+
assert markers == [(pytest.mark.parametrize('param', expected_params, indirect=True)).mark]
1349+
1350+
assert markers[0].args[0] == 'param'
1351+
assert markers[0].args[1] == expected_params
1352+
1353+
1354+
def test_idf_parametrize_invalid_params(testdir, copy_mock_esp_idf, monkeypatch): # noqa: ARG001
1355+
"""Test parametrize with invalid parameters"""
1356+
monkeypatch.setenv('IDF_PATH', str(testdir))
1357+
from pytest_embedded_idf.utils import idf_parametrize
1358+
1359+
with pytest.raises(ValueError):
1360+
1361+
@idf_parametrize('', [])
1362+
def test_func():
1363+
pass

0 commit comments

Comments
 (0)