testit-python-commons 5.1.5.post580__tar.gz → 5.1.6.post580__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/PKG-INFO +1 -1
  2. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/setup.py +1 -1
  3. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/client/api_client.py +4 -0
  4. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/client/helpers/bulk_autotest_helper.py +3 -3
  5. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/models/test_result.py +1 -1
  6. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/utils/html_escape_utils.py +63 -35
  7. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons.egg-info/PKG-INFO +1 -1
  8. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons.egg-info/SOURCES.txt +2 -1
  9. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/tests/test_html_escape_utils.py +45 -0
  10. testit_python_commons-5.1.6.post580/tests/test_xss_parameters_escape.py +72 -0
  11. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/README.md +0 -0
  12. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/setup.cfg +0 -0
  13. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/__init__.py +0 -0
  14. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/__init__.py +0 -0
  15. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/attachments_api.py +0 -0
  16. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/auto_tests_api.py +0 -0
  17. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/configurations_api.py +0 -0
  18. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/parameters_api.py +0 -0
  19. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/project_attributes_api.py +0 -0
  20. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/project_sections_api.py +0 -0
  21. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/project_work_items_api.py +0 -0
  22. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/projects_api.py +0 -0
  23. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/sections_api.py +0 -0
  24. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/test_results_api.py +0 -0
  25. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/test_runs_api.py +0 -0
  26. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/work_items_api.py +0 -0
  27. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api/workflows_api.py +0 -0
  28. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/api_client.py +0 -0
  29. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/apis/__init__.py +0 -0
  30. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/configuration.py +0 -0
  31. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/exceptions.py +0 -0
  32. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/__init__.py +0 -0
  33. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_auto_tests_id_work_items_post_request.py +0 -0
  34. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_auto_tests_post_request.py +0 -0
  35. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_auto_tests_put_request.py +0 -0
  36. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_auto_tests_search_post_request.py +0 -0
  37. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_configurations_search_post_request.py +0 -0
  38. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_parameters_post_request.py +0 -0
  39. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_parameters_search_post_request.py +0 -0
  40. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_projects_post_request.py +0 -0
  41. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_projects_project_id_attributes_put_request.py +0 -0
  42. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_projects_project_id_attributes_search_post_request.py +0 -0
  43. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_projects_project_id_work_items_search_post_request.py +0 -0
  44. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_projects_search_post_request.py +0 -0
  45. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_sections_post_request.py +0 -0
  46. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_test_results_id_put_request.py +0 -0
  47. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_test_results_search_post_request.py +0 -0
  48. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_test_runs_id_reruns_post_request.py +0 -0
  49. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_test_runs_post_request.py +0 -0
  50. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_test_runs_put_request.py +0 -0
  51. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/adapters_work_items_post_request.py +0 -0
  52. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/assign_attachment_api_model.py +0 -0
  53. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/assign_auto_test_case_id_api_model.py +0 -0
  54. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/assign_iteration_api_model.py +0 -0
  55. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/attachment_api_result.py +0 -0
  56. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/attachment_model.py +0 -0
  57. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/attachment_put_model.py +0 -0
  58. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/attachment_put_model_auto_test_step_results_model.py +0 -0
  59. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/attachment_update_request.py +0 -0
  60. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test.py +0 -0
  61. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_api_result.py +0 -0
  62. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_case_api_model.py +0 -0
  63. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_create_api_model.py +0 -0
  64. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_filter_api_model.py +0 -0
  65. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_id_model.py +0 -0
  66. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_model.py +0 -0
  67. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_model_last_test_result_configuration.py +0 -0
  68. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_model_last_test_result_status.py +0 -0
  69. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_result_reason_short.py +0 -0
  70. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_results_for_test_run_model.py +0 -0
  71. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_search_api_model.py +0 -0
  72. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_search_api_model_filter.py +0 -0
  73. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_search_api_model_includes.py +0 -0
  74. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_search_include_api_model.py +0 -0
  75. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_step.py +0 -0
  76. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_step_api_model.py +0 -0
  77. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_step_api_result.py +0 -0
  78. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_step_model.py +0 -0
  79. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_step_result.py +0 -0
  80. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_step_result_update_request.py +0 -0
  81. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_update_api_model.py +0 -0
  82. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/auto_test_work_item_identifier_api_result.py +0 -0
  83. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/available_test_result_outcome.py +0 -0
  84. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/configuration_filter_model.py +0 -0
  85. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/configuration_model.py +0 -0
  86. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/configuration_short_model.py +0 -0
  87. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/create_empty_test_run_api_model.py +0 -0
  88. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/create_link_api_model.py +0 -0
  89. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/create_parameter_api_model.py +0 -0
  90. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/create_project_api_model.py +0 -0
  91. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/create_step_api_model.py +0 -0
  92. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/create_work_item_api_model.py +0 -0
  93. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/custom_attribute_api_result.py +0 -0
  94. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/custom_attribute_get_model.py +0 -0
  95. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/custom_attribute_option_api_result.py +0 -0
  96. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/custom_attribute_option_model.py +0 -0
  97. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/custom_attribute_put_model.py +0 -0
  98. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/custom_attribute_type.py +0 -0
  99. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/custom_attribute_types_enum.py +0 -0
  100. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/date_time_range_selector_model.py +0 -0
  101. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/deletion_state.py +0 -0
  102. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/detailed_project_api_result.py +0 -0
  103. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/detailed_project_api_result_workflow.py +0 -0
  104. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/failure_category_model.py +0 -0
  105. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/guid_extraction_model.py +0 -0
  106. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/image_resize_type.py +0 -0
  107. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/int32_range_selector_model.py +0 -0
  108. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/int64_range_selector_model.py +0 -0
  109. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/iteration_api_result.py +0 -0
  110. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/iteration_model.py +0 -0
  111. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/label_api_model.py +0 -0
  112. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/label_api_result.py +0 -0
  113. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/label_short_model.py +0 -0
  114. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/link_api_result.py +0 -0
  115. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/link_create_api_model.py +0 -0
  116. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/link_model.py +0 -0
  117. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/link_post_model.py +0 -0
  118. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/link_put_model.py +0 -0
  119. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/link_short_api_result.py +0 -0
  120. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/link_type.py +0 -0
  121. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/link_update_api_model.py +0 -0
  122. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/manual_rerun_api_result.py +0 -0
  123. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/manual_rerun_select_test_results_api_model.py +0 -0
  124. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/manual_rerun_select_test_results_api_model_extraction_model.py +0 -0
  125. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/manual_rerun_select_test_results_api_model_filter.py +0 -0
  126. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/manual_rerun_test_result_api_model.py +0 -0
  127. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/manual_rerun_test_result_api_model_test_result_ids.py +0 -0
  128. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/operation.py +0 -0
  129. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/parameter_api_result.py +0 -0
  130. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/parameter_iteration_model.py +0 -0
  131. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/parameter_short_api_result.py +0 -0
  132. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/parameter_short_model.py +0 -0
  133. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/parameters_filter_api_model.py +0 -0
  134. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/problem_details.py +0 -0
  135. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/project_api_result.py +0 -0
  136. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/project_attributes_filter_model.py +0 -0
  137. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/project_type_model.py +0 -0
  138. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/projects_filter_model.py +0 -0
  139. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/projects_filter_model_autotests_count.py +0 -0
  140. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/projects_filter_model_checklists_count.py +0 -0
  141. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/projects_filter_model_created_date.py +0 -0
  142. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/projects_filter_model_shared_steps_count.py +0 -0
  143. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/projects_filter_model_test_cases_count.py +0 -0
  144. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/section_model.py +0 -0
  145. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/section_post_model.py +0 -0
  146. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/section_shared_step.py +0 -0
  147. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/section_with_steps_model.py +0 -0
  148. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/shared_step_model.py +0 -0
  149. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/shared_step_result_api_model.py +0 -0
  150. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/step_comment_api_model.py +0 -0
  151. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/step_model.py +0 -0
  152. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/step_post_model.py +0 -0
  153. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/step_result_api_model.py +0 -0
  154. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/tag_model.py +0 -0
  155. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_result_link_api_result.py +0 -0
  156. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_result_outcome.py +0 -0
  157. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_result_response.py +0 -0
  158. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_result_short_response.py +0 -0
  159. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_result_short_response_status.py +0 -0
  160. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_result_step_comment_update_request.py +0 -0
  161. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_result_update_request.py +0 -0
  162. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_results_filter_api_model.py +0 -0
  163. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_results_filter_api_model_duration.py +0 -0
  164. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_run_api_result.py +0 -0
  165. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_run_api_result_status.py +0 -0
  166. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_run_state.py +0 -0
  167. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_status_api_result.py +0 -0
  168. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_status_api_type.py +0 -0
  169. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_status_model.py +0 -0
  170. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/test_status_type.py +0 -0
  171. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/update_empty_test_run_api_model.py +0 -0
  172. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/update_link_api_model.py +0 -0
  173. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/validation_problem_details.py +0 -0
  174. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_api_result.py +0 -0
  175. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_entity_type_api_model.py +0 -0
  176. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_filter_api_model.py +0 -0
  177. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_filter_api_model_duration.py +0 -0
  178. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_id_api_model.py +0 -0
  179. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_parameter_key_api_model.py +0 -0
  180. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_parameter_key_api_result.py +0 -0
  181. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_priority_api_model.py +0 -0
  182. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_priority_model.py +0 -0
  183. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_select_api_model.py +0 -0
  184. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_select_api_model_filter.py +0 -0
  185. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_short_api_result.py +0 -0
  186. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_source_type_model.py +0 -0
  187. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_state_api_model.py +0 -0
  188. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_states.py +0 -0
  189. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/work_item_type_model.py +0 -0
  190. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/workflow_api_result.py +0 -0
  191. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model/workflow_status_api_result.py +0 -0
  192. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/model_utils.py +0 -0
  193. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/models/__init__.py +0 -0
  194. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_adapters/rest.py +0 -0
  195. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/__init__.py +0 -0
  196. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/api/__init__.py +0 -0
  197. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/api/completion_api.py +0 -0
  198. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/api/health_api.py +0 -0
  199. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/api/system_api.py +0 -0
  200. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/api/test_results_api.py +0 -0
  201. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/api/workers_api.py +0 -0
  202. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/api_client.py +0 -0
  203. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/apis/__init__.py +0 -0
  204. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/configuration.py +0 -0
  205. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/exceptions.py +0 -0
  206. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/model/__init__.py +0 -0
  207. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/model/completion_response.py +0 -0
  208. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/model/health_status_response.py +0 -0
  209. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/model/register_request.py +0 -0
  210. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/model/register_response.py +0 -0
  211. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/model/set_worker_status_request.py +0 -0
  212. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/model/set_worker_status_response.py +0 -0
  213. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/model/shutdown_response.py +0 -0
  214. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/model/test_result_cut_api_model.py +0 -0
  215. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/model/test_result_save_response.py +0 -0
  216. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/model_utils.py +0 -0
  217. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/models/__init__.py +0 -0
  218. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/api_client_syncstorage/rest.py +0 -0
  219. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit.py +0 -0
  220. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/__init__.py +0 -0
  221. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/app_properties.py +0 -0
  222. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/client/__init__.py +0 -0
  223. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/client/client_configuration.py +0 -0
  224. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/client/converter.py +0 -0
  225. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/client/helpers/__init__.py +0 -0
  226. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/client/helpers/test_result_matching.py +0 -0
  227. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/client/helpers/threads_manager.py +0 -0
  228. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/client/models/__init__.py +0 -0
  229. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/client/models/threads_for_create_and_result.py +0 -0
  230. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/client/models/threads_for_update_and_result.py +0 -0
  231. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/configurations/__init__.py +0 -0
  232. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/configurations/properties_names.py +0 -0
  233. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/decorators.py +0 -0
  234. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/dynamic_methods.py +0 -0
  235. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/models/__init__.py +0 -0
  236. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/models/adapter_mode.py +0 -0
  237. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/models/fixture.py +0 -0
  238. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/models/link.py +0 -0
  239. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/models/link_type.py +0 -0
  240. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/models/outcome_type.py +0 -0
  241. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/models/status_type.py +0 -0
  242. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/models/step_result.py +0 -0
  243. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/models/test_result_with_all_fixture_step_results_model.py +0 -0
  244. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/__init__.py +0 -0
  245. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/adapter_manager.py +0 -0
  246. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/adapter_manager_configuration.py +0 -0
  247. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/fixture_manager.py +0 -0
  248. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/fixture_storage.py +0 -0
  249. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/logger.py +0 -0
  250. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/plugin_manager.py +0 -0
  251. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/retry.py +0 -0
  252. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/step_manager.py +0 -0
  253. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/step_result_storage.py +0 -0
  254. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/sync_storage/__init__.py +0 -0
  255. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/sync_storage/sync_storage_runner.py +0 -0
  256. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/test_run_metadata.py +0 -0
  257. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/services/utils.py +0 -0
  258. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/step.py +0 -0
  259. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons/utils/__init__.py +0 -0
  260. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons.egg-info/dependency_links.txt +0 -0
  261. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons.egg-info/requires.txt +0 -0
  262. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/src/testit_python_commons.egg-info/top_level.txt +0 -0
  263. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/tests/test_app_properties.py +0 -0
  264. {testit_python_commons-5.1.5.post580 → testit_python_commons-5.1.6.post580}/tests/test_dynamic_methods.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: testit-python-commons
3
- Version: 5.1.5.post580
3
+ Version: 5.1.6.post580
4
4
  Summary: Python commons for Test IT
5
5
  Home-page: https://github.com/testit-tms/adapters-python/
6
6
  Author: Integration team
@@ -1,6 +1,6 @@
1
1
  from setuptools import find_packages, setup
2
2
 
3
- VERSION = "5.1.5.post580"
3
+ VERSION = "5.1.6.post580"
4
4
 
5
5
  setup(
6
6
  name='testit-python-commons',
@@ -41,6 +41,7 @@ from testit_python_commons.services.retry import (
41
41
  retry,
42
42
  retry_on_connection_error,
43
43
  )
44
+ from testit_python_commons.utils.html_escape_utils import HtmlEscapeUtils
44
45
 
45
46
 
46
47
  class ApiClientWorker:
@@ -469,6 +470,7 @@ class ApiClientWorker:
469
470
  test_result,
470
471
  self.__config.get_project_id())
471
472
 
473
+ HtmlEscapeUtils.escape_html_in_object(model)
472
474
  autotest_response = self.__autotest_api.adapters_auto_tests_post(
473
475
  adapters_auto_tests_post_request=model)
474
476
 
@@ -496,6 +498,7 @@ class ApiClientWorker:
496
498
  model = Converter.prepare_to_update_autotest(test_result, autotest, self.__config.get_project_id())
497
499
 
498
500
  try:
501
+ HtmlEscapeUtils.escape_html_in_object(model)
499
502
  self.__autotest_api.adapters_auto_tests_put(adapters_auto_tests_put_request=model)
500
503
  except Exception as exc:
501
504
  if is_retriable_connection_error(exc):
@@ -562,6 +565,7 @@ class ApiClientWorker:
562
565
  self.__config.get_configuration_id(),
563
566
  self.__status_codes)
564
567
 
568
+ HtmlEscapeUtils.escape_html_in_object(model)
565
569
  response = self.__test_run_api.adapters_test_runs_id_test_results_post(
566
570
  id=self.__config.get_test_run_id(),
567
571
  auto_test_results_for_test_run_model=[model])
@@ -156,7 +156,7 @@ class BulkAutotestHelper:
156
156
  def __create_tests(self, autotests_for_create: List[AutoTestCreateApiModel]):
157
157
  # logging.debug(f'Creating autotests: "{autotests_for_create}')
158
158
 
159
- autotests_for_create = HtmlEscapeUtils.escape_html_in_object(autotests_for_create)
159
+ autotests_for_create = HtmlEscapeUtils.escape_html_in_object_list(autotests_for_create)
160
160
  self.__autotests_api.adapters_auto_tests_bulk_post(auto_test_create_api_model=autotests_for_create)
161
161
 
162
162
  logging.debug(f'Autotests were created')
@@ -165,7 +165,7 @@ class BulkAutotestHelper:
165
165
  def __update_tests(self, autotests_for_update: List[AutoTestUpdateApiModel]):
166
166
  # logging.debug(f'Updating autotests: {autotests_for_update}')
167
167
 
168
- autotests_for_update = HtmlEscapeUtils.escape_html_in_object(autotests_for_update)
168
+ autotests_for_update = HtmlEscapeUtils.escape_html_in_object_list(autotests_for_update)
169
169
  self.__autotests_api.adapters_auto_tests_bulk_put(auto_test_update_api_model=autotests_for_update)
170
170
 
171
171
  logging.debug(f'Autotests were updated')
@@ -174,7 +174,7 @@ class BulkAutotestHelper:
174
174
  def __load_test_results(self, test_results: List[AutoTestResultsForTestRunModel]):
175
175
  # logging.debug(f'Loading test results: {test_results}')
176
176
 
177
- test_results = HtmlEscapeUtils.escape_html_in_object(test_results)
177
+ test_results = HtmlEscapeUtils.escape_html_in_object_list(test_results)
178
178
  self.__test_runs_api.adapters_test_runs_id_test_results_post(
179
179
  id=self.__test_run_id,
180
180
  auto_test_results_for_test_run_model=test_results)
@@ -288,7 +288,7 @@ class TestResult:
288
288
 
289
289
  @adapter_logger
290
290
  def set_external_key(self, external_key: str):
291
- self.__external_key = external_key
291
+ self.__external_key = HtmlEscapeUtils.escape_html_tags(external_key)
292
292
 
293
293
  return self
294
294
 
@@ -80,7 +80,12 @@ class HtmlEscapeUtils:
80
80
  return obj
81
81
 
82
82
  try:
83
- HtmlEscapeUtils._process_object_attributes(obj)
83
+ if isinstance(obj, list):
84
+ HtmlEscapeUtils._process_list(obj)
85
+ elif isinstance(obj, dict):
86
+ HtmlEscapeUtils._process_dict(obj)
87
+ else:
88
+ HtmlEscapeUtils._process_object_attributes(obj)
84
89
  except Exception as e:
85
90
  # Silently ignore reflection errors
86
91
  logging.debug(f"Error processing object attributes: {e}")
@@ -90,7 +95,7 @@ class HtmlEscapeUtils:
90
95
  @staticmethod
91
96
  def escape_html_in_object_list(obj_list: Optional[List[Any]]) -> Optional[List[Any]]:
92
97
  """
93
- Escapes HTML tags in all string attributes of objects in a list using reflection.
98
+ Escapes HTML tags in list items: strings in-place, objects via reflection.
94
99
  Can be disabled by setting NO_ESCAPE_HTML environment variable to "true".
95
100
 
96
101
  Args:
@@ -106,47 +111,68 @@ class HtmlEscapeUtils:
106
111
  no_escape_html = os.environ.get(HtmlEscapeUtils.NO_ESCAPE_HTML_ENV_VAR, "").lower()
107
112
  if no_escape_html == "true":
108
113
  return obj_list
109
-
110
- for obj in obj_list:
111
- HtmlEscapeUtils.escape_html_in_object(obj)
112
-
114
+
115
+ HtmlEscapeUtils._process_list(obj_list)
113
116
  return obj_list
114
117
 
118
+ @staticmethod
119
+ def _process_dict(obj: dict) -> None:
120
+ for key, value in obj.items():
121
+ if isinstance(value, str):
122
+ obj[key] = HtmlEscapeUtils.escape_html_tags(value)
123
+ elif isinstance(value, list):
124
+ HtmlEscapeUtils._process_list(value)
125
+ elif isinstance(value, dict):
126
+ HtmlEscapeUtils._process_dict(value)
127
+ elif value is not None and not HtmlEscapeUtils._is_simple_type(type(value)):
128
+ HtmlEscapeUtils.escape_html_in_object(value)
129
+
130
+ @staticmethod
131
+ def _iter_object_attr_names(obj: Any):
132
+ """
133
+ OpenAPI models store fields in attribute_map/_data_store; they are not listed by dir().
134
+ Prefer those maps, fall back to public dir() attributes for plain objects.
135
+ """
136
+ attribute_map = getattr(obj, 'attribute_map', None)
137
+ if isinstance(attribute_map, dict) and attribute_map:
138
+ return attribute_map.keys()
139
+
140
+ data_store = getattr(obj, '_data_store', None)
141
+ if isinstance(data_store, dict) and data_store:
142
+ return data_store.keys()
143
+
144
+ return (
145
+ attr_name for attr_name in dir(obj)
146
+ if not attr_name.startswith('_') and not callable(getattr(obj, attr_name, None))
147
+ )
148
+
149
+ @staticmethod
150
+ def _should_skip_attr(attr_name: str) -> bool:
151
+ return (
152
+ attr_name.startswith('_')
153
+ or attr_name.startswith("external_id")
154
+ or attr_name.startswith("externalId")
155
+ or attr_name.startswith("auto_test_external_id")
156
+ or attr_name.startswith("autoTestExternalId")
157
+ )
158
+
115
159
  @staticmethod
116
160
  def _process_object_attributes(obj: Any) -> None:
117
161
  """
118
162
  Process all attributes of an object for HTML escaping.
119
163
  """
120
- # Handle dictionary-like objects (common in API models)
121
- if hasattr(obj, '__dict__'):
122
- for attr_name in dir(obj):
123
- # Skip private/protected attributes and methods
124
- if attr_name.startswith('_') or callable(getattr(obj, attr_name, None)):
125
- continue
126
- if (
127
- attr_name.startswith("external_id")
128
- or attr_name.startswith("externalId")
129
- or attr_name.startswith("auto_test_external_id")
130
- or attr_name.startswith("autoTestExternalId")
131
- ):
164
+ for attr_name in HtmlEscapeUtils._iter_object_attr_names(obj):
165
+ if HtmlEscapeUtils._should_skip_attr(attr_name):
166
+ continue
167
+
168
+ try:
169
+ value = getattr(obj, attr_name, None)
170
+ if callable(value):
132
171
  continue
133
-
134
- try:
135
- value = getattr(obj, attr_name)
136
- HtmlEscapeUtils._process_attribute_value(obj, attr_name, value)
137
- except Exception as e:
138
- # Silently ignore attribute errors
139
- logging.debug(f"Error processing attribute {attr_name}: {e}")
140
-
141
- # Handle dictionary objects
142
- elif isinstance(obj, dict):
143
- for key, value in obj.items():
144
- if isinstance(value, str):
145
- obj[key] = HtmlEscapeUtils.escape_html_tags(value)
146
- elif isinstance(value, list):
147
- HtmlEscapeUtils._process_list(value)
148
- elif not HtmlEscapeUtils._is_simple_type(type(value)):
149
- HtmlEscapeUtils.escape_html_in_object(value)
172
+ HtmlEscapeUtils._process_attribute_value(obj, attr_name, value)
173
+ except Exception as e:
174
+ # Silently ignore attribute errors
175
+ logging.debug(f"Error processing attribute {attr_name}: {e}")
150
176
 
151
177
  @staticmethod
152
178
  def _process_attribute_value(obj: Any, attr_name: str, value: Any) -> None:
@@ -162,6 +188,8 @@ class HtmlEscapeUtils:
162
188
  pass
163
189
  elif isinstance(value, list):
164
190
  HtmlEscapeUtils._process_list(value)
191
+ elif isinstance(value, dict):
192
+ HtmlEscapeUtils._process_dict(value)
165
193
  elif value is not None and not HtmlEscapeUtils._is_simple_type(type(value)):
166
194
  # Process nested objects (but not simple types)
167
195
  HtmlEscapeUtils.escape_html_in_object(value)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: testit-python-commons
3
- Version: 5.1.5.post580
3
+ Version: 5.1.6.post580
4
4
  Summary: Python commons for Test IT
5
5
  Home-page: https://github.com/testit-tms/adapters-python/
6
6
  Author: Integration team
@@ -258,4 +258,5 @@ src/testit_python_commons/utils/__init__.py
258
258
  src/testit_python_commons/utils/html_escape_utils.py
259
259
  tests/test_app_properties.py
260
260
  tests/test_dynamic_methods.py
261
- tests/test_html_escape_utils.py
261
+ tests/test_html_escape_utils.py
262
+ tests/test_xss_parameters_escape.py
@@ -101,6 +101,32 @@ class TestHtmlEscapeUtils(unittest.TestCase):
101
101
  self.assertEqual(result[0].description, "<div>content</div>")
102
102
  self.assertEqual(result[1].description, "<span>more</span>")
103
103
 
104
+ def test_escape_html_in_object_accepts_list(self):
105
+ """Bulk send path passes a list — must escape each item, not no-op."""
106
+ test_list = [
107
+ SampleData("First", "<script>alert(1)</script>"),
108
+ SampleData("Second", "<img src=x onerror=alert(1)>"),
109
+ ]
110
+ result = HtmlEscapeUtils.escape_html_in_object(test_list)
111
+
112
+ self.assertEqual(result[0].description, "&lt;script&gt;alert(1)&lt;/script&gt;")
113
+ self.assertEqual(result[1].description, "&lt;img src=x onerror=alert(1)&gt;")
114
+
115
+ def test_escape_html_in_list_of_strings(self):
116
+ tags = ["<script>alert(1)</script>", "safe", "<b>x</b>"]
117
+ result = HtmlEscapeUtils.escape_html_in_object(tags)
118
+
119
+ self.assertEqual(result[0], "&lt;script&gt;alert(1)&lt;/script&gt;")
120
+ self.assertEqual(result[1], "safe")
121
+ self.assertEqual(result[2], "&lt;b&gt;x&lt;/b&gt;")
122
+
123
+ def test_escape_html_in_list_of_dicts(self):
124
+ labels = [{"name": "<script>alert(1)</script>"}, {"name": "ok"}]
125
+ result = HtmlEscapeUtils.escape_html_in_object(labels)
126
+
127
+ self.assertEqual(result[0]["name"], "&lt;script&gt;alert(1)&lt;/script&gt;")
128
+ self.assertEqual(result[1]["name"], "ok")
129
+
104
130
  def test_escape_disabled_by_env_var(self):
105
131
  """Test that escaping can be disabled via environment variable"""
106
132
  os.environ[HtmlEscapeUtils.NO_ESCAPE_HTML_ENV_VAR] = "true"
@@ -131,6 +157,25 @@ class TestHtmlEscapeUtils(unittest.TestCase):
131
157
  self.assertEqual(result["tags"][0], "&lt;tag&gt;")
132
158
  self.assertEqual(result["tags"][1], "normal_tag")
133
159
 
160
+ def test_escape_openapi_model_parameters(self):
161
+ """OpenAPI models hide fields from dir(); parameters must still be escaped."""
162
+ from adapters_api.models import AutoTestResultsForTestRunModel, TestStatusType
163
+
164
+ model = AutoTestResultsForTestRunModel(
165
+ configuration_id="cfg",
166
+ auto_test_external_id="ext",
167
+ status_type=TestStatusType("Succeeded"),
168
+ parameters={"description": '<script>alert("1")</script>'},
169
+ message='<img src=x onerror=alert(1)>',
170
+ )
171
+ HtmlEscapeUtils.escape_html_in_object(model)
172
+
173
+ self.assertEqual(
174
+ model.parameters["description"],
175
+ '&lt;script&gt;alert("1")&lt;/script&gt;',
176
+ )
177
+ self.assertEqual(model.message, "&lt;img src=x onerror=alert(1)&gt;")
178
+
134
179
 
135
180
  if __name__ == '__main__':
136
181
  unittest.main()
@@ -0,0 +1,72 @@
1
+ """Regression: XSS in pytest params must be escaped before TMS API payloads."""
2
+
3
+ import importlib.util
4
+ import unittest
5
+ from pathlib import Path
6
+
7
+ from adapters_api import ApiClient
8
+ from testit_python_commons.client.converter import Converter
9
+ from testit_python_commons.models.test_result import TestResult
10
+ from testit_python_commons.utils.html_escape_utils import HtmlEscapeUtils
11
+
12
+
13
+ def _load_xss_payloads():
14
+ path = Path(__file__).resolve().parents[2] / "test_files" / "test_xss_parametrize.py"
15
+ spec = importlib.util.spec_from_file_location("test_xss_parametrize", path)
16
+ module = importlib.util.module_from_spec(spec)
17
+ spec.loader.exec_module(module)
18
+ return module.XSS_PAYLOADS
19
+
20
+
21
+ class TestXssParametersEscape(unittest.TestCase):
22
+ @classmethod
23
+ def setUpClass(cls):
24
+ cls.payloads = _load_xss_payloads()
25
+
26
+ def test_test_result_parameters_escaped_for_all_payloads(self):
27
+ for payload in self.payloads:
28
+ with self.subTest(payload=payload):
29
+ result = TestResult().set_parameters({"description": payload})
30
+ value = result.get_parameters()["description"]
31
+ if HtmlEscapeUtils._HTML_TAG_PATTERN.search(payload):
32
+ self.assertNotIn("<script", value.lower().replace("&lt;", ""))
33
+ self.assertIn("&lt;", value)
34
+ self.assertNotEqual(value, payload)
35
+ # API model must keep escaped value
36
+ model = Converter.test_result_to_testrun_result_post_model(
37
+ result.set_external_id("ext").set_outcome("Passed").set_status_type("Succeeded").set_duration(1),
38
+ "cfg",
39
+ ["PASSED"],
40
+ )
41
+ self.assertEqual(model.parameters["description"], value)
42
+ serialized = ApiClient.sanitize_for_serialization(model)
43
+ self.assertEqual(serialized["parameters"]["description"], value)
44
+
45
+ def test_external_key_with_nodeid_xss_is_escaped(self):
46
+ payload = '<script>alert("1")</script>'
47
+ node_key = f"tests and test_xss_parametrize.py and test_05_with_chg_xss[{payload}]"
48
+ result = TestResult().set_external_key(node_key)
49
+ escaped = result.get_external_key()
50
+ self.assertIn("&lt;script&gt;", escaped)
51
+ self.assertNotIn("<script>", escaped)
52
+
53
+ def test_bulk_list_escape_mutates_result_models(self):
54
+ payload = '<script>alert("1")</script>'
55
+ # Simulate model built WITHOUT going through TestResult setters (raw params)
56
+ class FakeResult:
57
+ def __init__(self):
58
+ self.parameters = {"description": payload}
59
+ self.message = payload
60
+
61
+ models = [FakeResult(), FakeResult()]
62
+ HtmlEscapeUtils.escape_html_in_object(models)
63
+ for model in models:
64
+ self.assertEqual(
65
+ model.parameters["description"],
66
+ '&lt;script&gt;alert("1")&lt;/script&gt;',
67
+ )
68
+ self.assertEqual(model.message, '&lt;script&gt;alert("1")&lt;/script&gt;')
69
+
70
+
71
+ if __name__ == "__main__":
72
+ unittest.main()