diff --git a/CHANGELOG.md b/CHANGELOG.md index bfe60316..51259201 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] ### Added +- Escaping of binary symbol '\0' in parameters, by @HardNorth + +## [5.4.6] +### Added - Support for `Python 3.13`, by @HardNorth - Support for `name` Pytest marker, by @HardNorth - `rp_hierarchy_test_file` configuration parameter, which controls display of test file name in the hierarchy, by @ramir-dn, @HardNorth diff --git a/examples/params/test_binary_symbol_in_parameters.py b/examples/params/test_binary_symbol_in_parameters.py new file mode 100644 index 00000000..6ae5cac7 --- /dev/null +++ b/examples/params/test_binary_symbol_in_parameters.py @@ -0,0 +1,16 @@ +"""A simple example test with different parameter types.""" +import pytest + + +BINARY_TEXT = 'Some text with binary symbol \0' + + +@pytest.mark.parametrize( + ['text'], [[BINARY_TEXT]] +) +def test_in_class_parameterized(text): + """ + This is my test with different parameter types. + """ + assert text == BINARY_TEXT + assert text != BINARY_TEXT.replace('\0', '\\0') diff --git a/pytest_reportportal/service.py b/pytest_reportportal/service.py index adef8ca1..31a593fe 100644 --- a/pytest_reportportal/service.py +++ b/pytest_reportportal/service.py @@ -592,14 +592,17 @@ def _process_item_name(self, leaf: Dict[str, Any]) -> str: name = mark_name return name - def _get_parameters(self, item): + def _get_parameters(self, item) -> Optional[Dict[str, Any]]: """ Get params of item. :param item: Pytest.Item :return: dict of params """ - return item.callspec.params if hasattr(item, 'callspec') else None + params = item.callspec.params if hasattr(item, 'callspec') else None + if not params: + return None + return {str(k): v.replace('\0', '\\0') if isinstance(v, str) else v for k, v in params.items()} def _process_test_case_id(self, leaf): """ @@ -650,7 +653,7 @@ def _process_attributes(self, item): return [self._to_attribute(attribute) for attribute in attributes] - def _process_metadata_item_start(self, leaf: Dict[str, Any]): + def _process_metadata_item_start(self, leaf: Dict[str, Any]) -> None: """ Process all types of item metadata for its start event. @@ -664,7 +667,7 @@ def _process_metadata_item_start(self, leaf: Dict[str, Any]): leaf['issue'] = self._process_issue(item) leaf['attributes'] = self._process_attributes(item) - def _process_metadata_item_finish(self, leaf: Dict[str, Any]): + def _process_metadata_item_finish(self, leaf: Dict[str, Any]) -> None: """ Process all types of item metadata for its finish event. @@ -674,7 +677,7 @@ def _process_metadata_item_finish(self, leaf: Dict[str, Any]): leaf['attributes'] = self._process_attributes(item) leaf['issue'] = self._process_issue(item) - def _build_start_step_rq(self, leaf): + def _build_start_step_rq(self, leaf: Dict[str, Any]) -> Dict[str, Any]: payload = { 'attributes': leaf.get('attributes', None), 'name': self._truncate_item_name(leaf['name']), @@ -683,8 +686,7 @@ def _build_start_step_rq(self, leaf): 'item_type': 'STEP', 'code_ref': leaf.get('code_ref', None), 'parameters': leaf.get('parameters', None), - 'parent_item_id': self._lock(leaf['parent'], - lambda p: p['item_id']), + 'parent_item_id': self._lock(leaf['parent'], lambda p: p['item_id']), 'test_case_id': leaf.get('test_case_id', None) } return payload diff --git a/setup.py b/setup.py index 5ecc76db..b5dc3abc 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ from setuptools import setup -__version__ = '5.4.6' +__version__ = '5.4.7' def read_file(fname): diff --git a/tests/integration/test_parameters_report.py b/tests/integration/test_parameters_report.py index 47177108..e4a7cbaf 100644 --- a/tests/integration/test_parameters_report.py +++ b/tests/integration/test_parameters_report.py @@ -16,6 +16,7 @@ import pytest from unittest import mock +from examples.params.test_binary_symbol_in_parameters import BINARY_TEXT from tests import REPORT_PORTAL_SERVICE from tests.helpers import utils @@ -25,7 +26,8 @@ ('examples/test_simple.py', None), ('examples/params/test_in_class_parameterized.py', {'param': 'param'}), ('examples/params/test_different_parameter_types.py', - {'integer': 1, 'floating_point': 1.5, 'boolean': True, 'none': None}) + {'integer': 1, 'floating_point': 1.5, 'boolean': True, 'none': None}), + ('examples/params/test_binary_symbol_in_parameters.py', {'text': BINARY_TEXT.replace('\0', '\\0')}), ]) def test_parameters(mock_client_init, test, expected_params): """Verify different tests have correct parameters.