testit-cli 2.10.3__tar.gz → 2.11.0__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 (238) hide show
  1. {testit_cli-2.10.3 → testit_cli-2.11.0}/PKG-INFO +29 -1
  2. {testit_cli-2.10.3 → testit_cli-2.11.0}/README.md +28 -0
  3. {testit_cli-2.10.3 → testit_cli-2.11.0}/setup.py +1 -1
  4. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/custom_attribute_api_result.py +11 -17
  5. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/layer_source.py +5 -4
  6. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/apiclient.py +1 -0
  7. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/click_commands.py +17 -2
  8. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/converter.py +43 -17
  9. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/importer.py +2 -2
  10. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/models/config.py +1 -0
  11. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli.egg-info/PKG-INFO +29 -1
  12. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli.egg-info/SOURCES.txt +1 -0
  13. testit_cli-2.11.0/tests/test_autotest_layer.py +44 -0
  14. {testit_cli-2.10.3 → testit_cli-2.11.0}/LICENSE +0 -0
  15. {testit_cli-2.10.3 → testit_cli-2.11.0}/setup.cfg +0 -0
  16. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/__init__.py +0 -0
  17. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/__main__.py +0 -0
  18. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/__init__.py +0 -0
  19. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/__init__.py +0 -0
  20. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/attachments_api.py +0 -0
  21. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/auto_tests_api.py +0 -0
  22. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/configurations_api.py +0 -0
  23. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/custom_attributes_api.py +0 -0
  24. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/parameters_api.py +0 -0
  25. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/project_attributes_api.py +0 -0
  26. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/project_sections_api.py +0 -0
  27. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/project_work_items_api.py +0 -0
  28. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/projects_api.py +0 -0
  29. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/sections_api.py +0 -0
  30. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/test_results_api.py +0 -0
  31. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/test_runs_api.py +0 -0
  32. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/work_items_api.py +0 -0
  33. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api/workflows_api.py +0 -0
  34. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/api_client.py +0 -0
  35. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/apis/__init__.py +0 -0
  36. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/configuration.py +0 -0
  37. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/exceptions.py +0 -0
  38. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/__init__.py +0 -0
  39. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_auto_tests_id_work_items_post_request.py +0 -0
  40. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_auto_tests_post_request.py +0 -0
  41. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_auto_tests_put_request.py +0 -0
  42. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_auto_tests_search_post_request.py +0 -0
  43. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_configurations_search_post_request.py +0 -0
  44. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_custom_attributes_global_id_put_request.py +0 -0
  45. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_custom_attributes_global_post_request.py +0 -0
  46. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_custom_attributes_search_post_request.py +0 -0
  47. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_parameters_post_request.py +0 -0
  48. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_parameters_search_post_request.py +0 -0
  49. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_projects_post_request.py +0 -0
  50. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_projects_project_id_attributes_put_request.py +0 -0
  51. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_projects_project_id_attributes_search_post_request.py +0 -0
  52. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_projects_project_id_work_items_search_post_request.py +0 -0
  53. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_projects_search_post_request.py +0 -0
  54. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_sections_post_request.py +0 -0
  55. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_test_results_id_put_request.py +0 -0
  56. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_test_results_search_post_request.py +0 -0
  57. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_test_runs_id_reruns_post_request.py +0 -0
  58. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_test_runs_post_request.py +0 -0
  59. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_test_runs_put_request.py +0 -0
  60. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/adapters_work_items_post_request.py +0 -0
  61. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/assign_attachment_api_model.py +0 -0
  62. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/assign_auto_test_case_id_api_model.py +0 -0
  63. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/assign_iteration_api_model.py +0 -0
  64. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/attachment_api_result.py +0 -0
  65. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/attachment_model.py +0 -0
  66. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/attachment_put_model.py +0 -0
  67. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/attachment_put_model_auto_test_step_results_model.py +0 -0
  68. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/attachment_update_request.py +0 -0
  69. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test.py +0 -0
  70. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_api_result.py +0 -0
  71. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_api_result_layer.py +0 -0
  72. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_case_api_model.py +0 -0
  73. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_create_api_model.py +0 -0
  74. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_create_api_model_layer.py +0 -0
  75. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_filter_api_model.py +0 -0
  76. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_id_model.py +0 -0
  77. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_model.py +0 -0
  78. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_model_last_test_result_configuration.py +0 -0
  79. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_model_last_test_result_status.py +0 -0
  80. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_result_reason_short.py +0 -0
  81. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_results_for_test_run_model.py +0 -0
  82. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_search_api_model.py +0 -0
  83. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_search_api_model_filter.py +0 -0
  84. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_search_api_model_includes.py +0 -0
  85. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_search_include_api_model.py +0 -0
  86. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_step.py +0 -0
  87. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_step_api_model.py +0 -0
  88. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_step_api_result.py +0 -0
  89. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_step_model.py +0 -0
  90. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_step_result.py +0 -0
  91. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_step_result_update_request.py +0 -0
  92. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_update_api_model.py +0 -0
  93. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/auto_test_work_item_identifier_api_result.py +0 -0
  94. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/available_test_result_outcome.py +0 -0
  95. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/configuration_filter_model.py +0 -0
  96. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/configuration_model.py +0 -0
  97. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/configuration_short_model.py +0 -0
  98. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/create_empty_test_run_api_model.py +0 -0
  99. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/create_link_api_model.py +0 -0
  100. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/create_parameter_api_model.py +0 -0
  101. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/create_project_api_model.py +0 -0
  102. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/create_step_api_model.py +0 -0
  103. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/create_work_item_api_model.py +0 -0
  104. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/custom_attribute_model.py +0 -0
  105. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/custom_attribute_option_api_result.py +0 -0
  106. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/custom_attribute_option_model.py +0 -0
  107. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/custom_attribute_option_post_api_model.py +0 -0
  108. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/custom_attribute_option_update_api_model.py +0 -0
  109. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/custom_attribute_put_model.py +0 -0
  110. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/custom_attribute_search_api_model.py +0 -0
  111. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/custom_attribute_search_api_result.py +0 -0
  112. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/custom_attribute_type.py +0 -0
  113. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/custom_attribute_types_enum.py +0 -0
  114. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/date_time_range_selector_model.py +0 -0
  115. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/deletion_state.py +0 -0
  116. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/detailed_project_api_result.py +0 -0
  117. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/detailed_project_api_result_workflow.py +0 -0
  118. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/failure_category_model.py +0 -0
  119. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/global_custom_attribute_post_api_model.py +0 -0
  120. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/global_custom_attribute_update_api_model.py +0 -0
  121. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/guid_extraction_model.py +0 -0
  122. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/image_resize_type.py +0 -0
  123. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/int32_range_selector_model.py +0 -0
  124. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/int64_range_selector_model.py +0 -0
  125. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/iteration_api_result.py +0 -0
  126. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/iteration_model.py +0 -0
  127. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/label_api_model.py +0 -0
  128. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/label_api_result.py +0 -0
  129. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/label_short_model.py +0 -0
  130. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/layer_api_model.py +0 -0
  131. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/layer_api_result.py +0 -0
  132. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/link_api_result.py +0 -0
  133. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/link_create_api_model.py +0 -0
  134. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/link_model.py +0 -0
  135. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/link_post_model.py +0 -0
  136. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/link_put_model.py +0 -0
  137. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/link_short_api_result.py +0 -0
  138. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/link_type.py +0 -0
  139. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/link_update_api_model.py +0 -0
  140. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/manual_rerun_api_result.py +0 -0
  141. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/manual_rerun_select_test_results_api_model.py +0 -0
  142. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/manual_rerun_select_test_results_api_model_extraction_model.py +0 -0
  143. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/manual_rerun_select_test_results_api_model_filter.py +0 -0
  144. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/manual_rerun_test_result_api_model.py +0 -0
  145. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/manual_rerun_test_result_api_model_test_result_ids.py +0 -0
  146. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/operation.py +0 -0
  147. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/parameter_api_result.py +0 -0
  148. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/parameter_iteration_model.py +0 -0
  149. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/parameter_short_api_result.py +0 -0
  150. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/parameter_short_model.py +0 -0
  151. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/parameters_filter_api_model.py +0 -0
  152. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/problem_details.py +0 -0
  153. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/project_api_result.py +0 -0
  154. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/project_attributes_filter_model.py +0 -0
  155. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/project_shortest_api_result.py +0 -0
  156. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/project_type_model.py +0 -0
  157. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/projects_filter_model.py +0 -0
  158. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/projects_filter_model_autotests_count.py +0 -0
  159. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/projects_filter_model_checklists_count.py +0 -0
  160. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/projects_filter_model_created_date.py +0 -0
  161. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/projects_filter_model_shared_steps_count.py +0 -0
  162. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/projects_filter_model_test_cases_count.py +0 -0
  163. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/section_model.py +0 -0
  164. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/section_post_model.py +0 -0
  165. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/section_shared_step.py +0 -0
  166. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/section_with_steps_model.py +0 -0
  167. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/shared_step_model.py +0 -0
  168. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/shared_step_result_api_model.py +0 -0
  169. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/step_comment_api_model.py +0 -0
  170. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/step_model.py +0 -0
  171. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/step_post_model.py +0 -0
  172. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/step_result_api_model.py +0 -0
  173. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/tag_model.py +0 -0
  174. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_result_link_api_result.py +0 -0
  175. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_result_outcome.py +0 -0
  176. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_result_response.py +0 -0
  177. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_result_short_response.py +0 -0
  178. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_result_short_response_status.py +0 -0
  179. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_result_step_comment_update_request.py +0 -0
  180. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_result_update_request.py +0 -0
  181. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_results_filter_api_model.py +0 -0
  182. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_results_filter_api_model_duration.py +0 -0
  183. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_run_api_result.py +0 -0
  184. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_run_api_result_status.py +0 -0
  185. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_run_state.py +0 -0
  186. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_status_api_result.py +0 -0
  187. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_status_api_type.py +0 -0
  188. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_status_model.py +0 -0
  189. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/test_status_type.py +0 -0
  190. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/update_empty_test_run_api_model.py +0 -0
  191. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/update_link_api_model.py +0 -0
  192. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/validation_problem_details.py +0 -0
  193. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_api_result.py +0 -0
  194. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_entity_type_api_model.py +0 -0
  195. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_filter_api_model.py +0 -0
  196. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_filter_api_model_duration.py +0 -0
  197. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_id_api_model.py +0 -0
  198. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_parameter_key_api_model.py +0 -0
  199. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_parameter_key_api_result.py +0 -0
  200. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_priority_api_model.py +0 -0
  201. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_priority_model.py +0 -0
  202. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_select_api_model.py +0 -0
  203. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_select_api_model_filter.py +0 -0
  204. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_short_api_result.py +0 -0
  205. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_source_type_model.py +0 -0
  206. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_state_api_model.py +0 -0
  207. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_states.py +0 -0
  208. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/work_item_type_model.py +0 -0
  209. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/workflow_api_result.py +0 -0
  210. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model/workflow_status_api_result.py +0 -0
  211. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/model_utils.py +0 -0
  212. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/models/__init__.py +0 -0
  213. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/adapters_api/rest.py +0 -0
  214. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/autotests_filter.py +0 -0
  215. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/dir_worker.py +0 -0
  216. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/file_worker.py +0 -0
  217. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/filter_factory.py +0 -0
  218. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/html_escape_utils.py +0 -0
  219. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/http_retry.py +0 -0
  220. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/logger.py +0 -0
  221. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/models/__init__.py +0 -0
  222. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/models/mode.py +0 -0
  223. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/models/status_type.py +0 -0
  224. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/models/testcase.py +0 -0
  225. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/models/testrun.py +0 -0
  226. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/models/testrun_link.py +0 -0
  227. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/parser.py +0 -0
  228. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/service.py +0 -0
  229. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/service_factory.py +0 -0
  230. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/testrun_metadata.py +0 -0
  231. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli/validation.py +0 -0
  232. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli.egg-info/dependency_links.txt +0 -0
  233. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli.egg-info/entry_points.txt +0 -0
  234. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli.egg-info/requires.txt +0 -0
  235. {testit_cli-2.10.3 → testit_cli-2.11.0}/src/testit_cli.egg-info/top_level.txt +0 -0
  236. {testit_cli-2.10.3 → testit_cli-2.11.0}/tests/test_click.py +0 -0
  237. {testit_cli-2.10.3 → testit_cli-2.11.0}/tests/test_service.py +0 -0
  238. {testit_cli-2.10.3 → testit_cli-2.11.0}/tests/test_testrun_metadata.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: testit-cli
3
- Version: 2.10.3
3
+ Version: 2.11.0
4
4
  Summary: This tool is the command line wrapper of Test IT allowing you to upload the test results in real time to Test IT
5
5
  Home-page: https://pypi.org/project/testit-cli/
6
6
  Author: Integration team
@@ -145,3 +145,31 @@ Notes:
145
145
  - Test run tags/links are independent from autotest/result tags and links.
146
146
  - On an existing run, new tags/links are **merged** (existing values are kept; duplicates by tag name / link URL are skipped).
147
147
  - Empty or omitted values mean “do not change tags/links”.
148
+
149
+ ## Autotest layer (test pyramid)
150
+
151
+ When importing XML results, CLI can set the **autotest** pyramid layer for every upserted autotest (create/update).
152
+ This is a **run-level default** for file-based import; adapters still read layer from test code annotations.
153
+
154
+ | Intent | CLI | Env |
155
+ |--------|-----|-----|
156
+ | Default autotest layer | `--autotest-layer` / `-al` | `TMS_AUTOTEST_LAYER` |
157
+
158
+ Supported commands: `results import`, `results upload`.
159
+
160
+ Recommended values: `E2E`, `UI`, `API`, `Contract`, `Integration`, `Component`, `Unit`. Any other non-empty string is accepted.
161
+
162
+ ```bash
163
+ export TMS_AUTOTEST_LAYER=API
164
+ testit results import \
165
+ --url "$TMS_URL" \
166
+ --token "$TMS_TOKEN" \
167
+ --project-id "$TMS_PROJECT_ID" \
168
+ --configuration-id "$TMS_CONFIGURATION_ID" \
169
+ --results ./results
170
+ ```
171
+
172
+ Behaviour (aligned with adapters API):
173
+
174
+ - Layer set → send `layer: { name, source: Run }` on create/update.
175
+ - Layer not set → do not send `layer`; on update always send `resetLayer: false`.
@@ -111,3 +111,31 @@ Notes:
111
111
  - Test run tags/links are independent from autotest/result tags and links.
112
112
  - On an existing run, new tags/links are **merged** (existing values are kept; duplicates by tag name / link URL are skipped).
113
113
  - Empty or omitted values mean “do not change tags/links”.
114
+
115
+ ## Autotest layer (test pyramid)
116
+
117
+ When importing XML results, CLI can set the **autotest** pyramid layer for every upserted autotest (create/update).
118
+ This is a **run-level default** for file-based import; adapters still read layer from test code annotations.
119
+
120
+ | Intent | CLI | Env |
121
+ |--------|-----|-----|
122
+ | Default autotest layer | `--autotest-layer` / `-al` | `TMS_AUTOTEST_LAYER` |
123
+
124
+ Supported commands: `results import`, `results upload`.
125
+
126
+ Recommended values: `E2E`, `UI`, `API`, `Contract`, `Integration`, `Component`, `Unit`. Any other non-empty string is accepted.
127
+
128
+ ```bash
129
+ export TMS_AUTOTEST_LAYER=API
130
+ testit results import \
131
+ --url "$TMS_URL" \
132
+ --token "$TMS_TOKEN" \
133
+ --project-id "$TMS_PROJECT_ID" \
134
+ --configuration-id "$TMS_CONFIGURATION_ID" \
135
+ --results ./results
136
+ ```
137
+
138
+ Behaviour (aligned with adapters API):
139
+
140
+ - Layer set → send `layer: { name, source: Run }` on create/update.
141
+ - Layer not set → do not send `layer`; on update always send `resetLayer: false`.
@@ -1,6 +1,6 @@
1
1
  from setuptools import find_packages, setup
2
2
 
3
- VERSION = "2.10.3"
3
+ VERSION = "2.11.0"
4
4
 
5
5
  ADAPTERS_ROOT = "src/testit_cli/adapters_api"
6
6
  ADAPTERS_PACKAGES = ["adapters_api"] + [
@@ -90,9 +90,9 @@ class CustomAttributeApiResult(ModelNormal):
90
90
  'is_enabled': (bool,), # noqa: E501
91
91
  'is_required': (bool,), # noqa: E501
92
92
  'is_global': (bool,), # noqa: E501
93
- 'is_read_only': (bool, none_type,), # noqa: E501
94
- 'is_system': (bool, none_type,), # noqa: E501
95
- 'targets': ([str], none_type,), # noqa: E501
93
+ 'is_read_only': (bool,), # noqa: E501
94
+ 'is_system': (bool,), # noqa: E501
95
+ 'targets': ([str],), # noqa: E501
96
96
  'code': (str, none_type,), # noqa: E501
97
97
  }
98
98
 
@@ -123,7 +123,7 @@ class CustomAttributeApiResult(ModelNormal):
123
123
 
124
124
  @classmethod
125
125
  @convert_js_args_to_python_args
126
- def _from_openapi_data(cls, id, options, type, is_deleted, name, is_enabled, is_required, is_global, *args, **kwargs): # noqa: E501
126
+ def _from_openapi_data(cls, id, options, type, is_deleted, name, is_enabled, is_required, is_global, is_read_only, is_system, targets, *args, **kwargs): # noqa: E501
127
127
  """CustomAttributeApiResult - a model defined in OpenAPI
128
128
 
129
129
  Args:
@@ -135,11 +135,11 @@ class CustomAttributeApiResult(ModelNormal):
135
135
  is_enabled (bool): Indicates if the attribute is enabled
136
136
  is_required (bool): Indicates if the attribute value is mandatory to specify
137
137
  is_global (bool): Indicates if the attribute is available across all projects
138
+ is_read_only (bool): Indicates if the attribute is read-only
139
+ is_system (bool): Indicates if the attribute is system
140
+ targets ([str]): Collection of the attribute targets Defines where the attribute can be used (e.g., TestCases, AutoTestCases, TestPlans)
138
141
 
139
142
  Keyword Args:
140
- is_read_only (bool): Indicates if the attribute is read-only. [optional] # noqa: E501
141
- is_system (bool): Indicates if the attribute is system. [optional] # noqa: E501
142
- targets ([str]): Collection of the attribute targets. [optional] # noqa: E501
143
143
  _check_type (bool): if True, values for parameters in openapi_types
144
144
  will be type checked and a TypeError will be
145
145
  raised if the wrong type is input.
@@ -178,9 +178,6 @@ class CustomAttributeApiResult(ModelNormal):
178
178
  _path_to_item = kwargs.pop('_path_to_item', ())
179
179
  _configuration = kwargs.pop('_configuration', None)
180
180
  _visited_composed_classes = kwargs.pop('_visited_composed_classes', ())
181
- is_read_only = kwargs.pop('is_read_only', False)
182
- is_system = kwargs.pop('is_system', False)
183
- targets = kwargs.pop('targets', None)
184
181
 
185
182
  self = super(OpenApiModel, cls).__new__(cls)
186
183
 
@@ -236,7 +233,7 @@ class CustomAttributeApiResult(ModelNormal):
236
233
  ])
237
234
 
238
235
  @convert_js_args_to_python_args
239
- def __init__(self, id, options, type, is_deleted, name, is_enabled, is_required, is_global, *args, **kwargs): # noqa: E501
236
+ def __init__(self, id, options, type, is_deleted, name, is_enabled, is_required, is_global, is_read_only, is_system, targets, *args, **kwargs): # noqa: E501
240
237
  """CustomAttributeApiResult - a model defined in OpenAPI
241
238
 
242
239
  Args:
@@ -248,11 +245,11 @@ class CustomAttributeApiResult(ModelNormal):
248
245
  is_enabled (bool): Indicates if the attribute is enabled
249
246
  is_required (bool): Indicates if the attribute value is mandatory to specify
250
247
  is_global (bool): Indicates if the attribute is available across all projects
248
+ is_read_only (bool): Indicates if the attribute is read-only
249
+ is_system (bool): Indicates if the attribute is system
250
+ targets ([str]): Collection of the attribute targets Defines where the attribute can be used (e.g., TestCases, AutoTestCases, TestPlans)
251
251
 
252
252
  Keyword Args:
253
- is_read_only (bool): Indicates if the attribute is read-only. [optional] # noqa: E501
254
- is_system (bool): Indicates if the attribute is system. [optional] # noqa: E501
255
- targets ([str]): Collection of the attribute targets. [optional] # noqa: E501
256
253
  _check_type (bool): if True, values for parameters in openapi_types
257
254
  will be type checked and a TypeError will be
258
255
  raised if the wrong type is input.
@@ -291,9 +288,6 @@ class CustomAttributeApiResult(ModelNormal):
291
288
  _path_to_item = kwargs.pop('_path_to_item', ())
292
289
  _configuration = kwargs.pop('_configuration', None)
293
290
  _visited_composed_classes = kwargs.pop('_visited_composed_classes', ())
294
- is_read_only = kwargs.pop('is_read_only', False)
295
- is_system = kwargs.pop('is_system', False)
296
- targets = kwargs.pop('targets', None)
297
291
 
298
292
  if args:
299
293
  for arg in args:
@@ -53,6 +53,7 @@ class LayerSource(ModelSimple):
53
53
  allowed_values = {
54
54
  ('value',): {
55
55
  'MANUAL': "Manual",
56
+ 'REPORT': "Report",
56
57
  'RUN': "Run",
57
58
  'RULE': "Rule",
58
59
  },
@@ -106,10 +107,10 @@ class LayerSource(ModelSimple):
106
107
  Note that value can be passed either in args or in kwargs, but not in both.
107
108
 
108
109
  Args:
109
- args[0] (str):, must be one of ["Manual", "Run", "Rule", ] # noqa: E501
110
+ args[0] (str):, must be one of ["Manual", "Report", "Run", "Rule", ] # noqa: E501
110
111
 
111
112
  Keyword Args:
112
- value (str):, must be one of ["Manual", "Run", "Rule", ] # noqa: E501
113
+ value (str):, must be one of ["Manual", "Report", "Run", "Rule", ] # noqa: E501
113
114
  _check_type (bool): if True, values for parameters in openapi_types
114
115
  will be type checked and a TypeError will be
115
116
  raised if the wrong type is input.
@@ -200,10 +201,10 @@ class LayerSource(ModelSimple):
200
201
  Note that value can be passed either in args or in kwargs, but not in both.
201
202
 
202
203
  Args:
203
- args[0] (str):, must be one of ["Manual", "Run", "Rule", ] # noqa: E501
204
+ args[0] (str):, must be one of ["Manual", "Report", "Run", "Rule", ] # noqa: E501
204
205
 
205
206
  Keyword Args:
206
- value (str):, must be one of ["Manual", "Run", "Rule", ] # noqa: E501
207
+ value (str):, must be one of ["Manual", "Report", "Run", "Rule", ] # noqa: E501
207
208
  _check_type (bool): if True, values for parameters in openapi_types
208
209
  will be type checked and a TypeError will be
209
210
  raised if the wrong type is input.
@@ -212,6 +212,7 @@ class ApiClient:
212
212
  def update_autotest(self, model: AdaptersAutoTestsPutRequest) -> None:
213
213
  """Function updates autotest"""
214
214
  try:
215
+ model.reset_layer = False
215
216
  escaped_model: AdaptersAutoTestsPutRequest = HtmlEscapeUtils.escape_html_in_object(model)
216
217
 
217
218
  logging.debug(f"Updating autotest {escaped_model}")
@@ -1,3 +1,4 @@
1
+ import typing
1
2
  from itertools import chain
2
3
 
3
4
  import click
@@ -71,6 +72,16 @@ _TESTRUN_LINKS_HELP = (
71
72
  '([{"url":"https://ci.example/jobs/1","title":"CI Job","type":"Related"}]). '
72
73
  "Types: Related, BlockedBy, Defect, Issue, Requirement, Repository"
73
74
  )
75
+ _AUTOTEST_LAYER_HELP = (
76
+ "Default autotest pyramid layer for all imported tests "
77
+ "(E2E, UI, API, Contract, Integration, Component, Unit, or any string)"
78
+ )
79
+
80
+
81
+ def _parse_autotest_layer(raw: typing.Optional[str]) -> typing.Optional[str]:
82
+ if raw is None or not str(raw).strip():
83
+ return None
84
+ return str(raw).strip()
74
85
 
75
86
 
76
87
  @results.command("upload")
@@ -88,7 +99,8 @@ _TESTRUN_LINKS_HELP = (
88
99
  @click.option("-d", "--debug", is_flag=True, help="Set debug logs")
89
100
  @click.option("-dcv", "--disable-cert-validation", is_flag=True, help="Disables certificate validation")
90
101
  @click.option("-iff", "--ignore-flaky-failure", is_flag=True, help="Ignore status flakyFailure in results")
91
- def upload_results(url, token, configuration_id, testrun_id, testruntags, testrunlinks, separator, namespace, classname, results, debug, attachments, disable_cert_validation, ignore_flaky_failure):
102
+ @click.option("-al", "--autotest-layer", type=str, envvar='TMS_AUTOTEST_LAYER', default=None, help=_AUTOTEST_LAYER_HELP)
103
+ def upload_results(url, token, configuration_id, testrun_id, testruntags, testrunlinks, separator, namespace, classname, results, debug, attachments, disable_cert_validation, ignore_flaky_failure, autotest_layer):
92
104
  """Uploading results from different streams"""
93
105
  config = Config(
94
106
  url=url,
@@ -105,6 +117,7 @@ def upload_results(url, token, configuration_id, testrun_id, testruntags, testru
105
117
  paths_to_attachments=list(chain.from_iterable(attachments)),
106
118
  disable_cert_validation=disable_cert_validation,
107
119
  ignore_flaky_failure=ignore_flaky_failure,
120
+ autotest_layer=_parse_autotest_layer(autotest_layer),
108
121
  )
109
122
  service = ServiceFactory().get(config)
110
123
 
@@ -128,8 +141,9 @@ def upload_results(url, token, configuration_id, testrun_id, testruntags, testru
128
141
  @click.option("-d", "--debug", is_flag=True, help="Set debug logs")
129
142
  @click.option("-dcv", "--disable-cert-validation", is_flag=True, help="Disables certificate validation")
130
143
  @click.option("-iff", "--ignore-flaky-failure", is_flag=True, help="Ignore status flakyFailure in results")
144
+ @click.option("-al", "--autotest-layer", type=str, envvar='TMS_AUTOTEST_LAYER', default=None, help=_AUTOTEST_LAYER_HELP)
131
145
  def import_results(url, token, project_id, configuration_id, testrun_id, testrun_name, testruntags, testrunlinks, separator, namespace, classname, results, debug,
132
- attachments, disable_cert_validation, ignore_flaky_failure):
146
+ attachments, disable_cert_validation, ignore_flaky_failure, autotest_layer):
133
147
  """Uploading the first test results"""
134
148
  if testrun_id is not None and testrun_name is not None:
135
149
  click.echo("Illegal usage: `{}` are mutually exclusive arguments.".format(', '.join(["--testrun-id", "--testrun-name"])), err=True)
@@ -151,6 +165,7 @@ def import_results(url, token, project_id, configuration_id, testrun_id, testrun
151
165
  paths_to_attachments=list(chain.from_iterable(attachments)),
152
166
  disable_cert_validation=disable_cert_validation,
153
167
  ignore_flaky_failure=ignore_flaky_failure,
168
+ autotest_layer=_parse_autotest_layer(autotest_layer),
154
169
  )
155
170
  service = ServiceFactory().get(config)
156
171
 
@@ -9,9 +9,11 @@ from adapters_api.model.assign_attachment_api_model import AssignAttachmentApiMo
9
9
  from adapters_api.model.attachment_api_result import AttachmentApiResult
10
10
  from adapters_api.model.attachment_put_model import AttachmentPutModel
11
11
  from adapters_api.model.auto_test_api_result import AutoTestApiResult
12
+ from adapters_api.model.auto_test_create_api_model_layer import AutoTestCreateApiModelLayer
12
13
  from adapters_api.model.auto_test_results_for_test_run_model import AutoTestResultsForTestRunModel
13
14
  from adapters_api.model.auto_test_search_api_model_filter import AutoTestSearchApiModelFilter
14
15
  from adapters_api.model.auto_test_search_api_model_includes import AutoTestSearchApiModelIncludes
16
+ from adapters_api.model.layer_source import LayerSource
15
17
  from adapters_api.model.link_api_result import LinkApiResult
16
18
  from adapters_api.model.test_result_short_response import TestResultShortResponse
17
19
  from adapters_api.model.test_run_api_result import TestRunApiResult
@@ -23,6 +25,15 @@ from .models.testrun import TestRun
23
25
 
24
26
 
25
27
  class Converter:
28
+ @staticmethod
29
+ def layer_to_api_model(layer_name: typing.Optional[str]) -> typing.Optional[AutoTestCreateApiModelLayer]:
30
+ if layer_name is None or not str(layer_name).strip():
31
+ return None
32
+ return AutoTestCreateApiModelLayer(
33
+ name=str(layer_name).strip(),
34
+ source=LayerSource("Run"),
35
+ )
36
+
26
37
  @staticmethod
27
38
  def project_id_and_external_id_to_autotests_search_post_request(
28
39
  project_id: str, external_id: str) -> AdaptersAutoTestsSearchPostRequest:
@@ -85,26 +96,41 @@ class Converter:
85
96
 
86
97
  @staticmethod
87
98
  def test_result_to_create_autotest_request(
88
- result: TestCase, external_id: str, project_id: str) -> AdaptersAutoTestsPostRequest:
89
- return AdaptersAutoTestsPostRequest(
90
- external_id=external_id,
91
- project_id=project_id,
92
- name=result.get_name(),
93
- namespace=result.get_name_space(),
94
- classname=result.get_class_name(),
95
- )
99
+ result: TestCase,
100
+ external_id: str,
101
+ project_id: str,
102
+ layer: typing.Optional[str] = None) -> AdaptersAutoTestsPostRequest:
103
+ request_kwargs = {
104
+ "external_id": external_id,
105
+ "project_id": project_id,
106
+ "name": result.get_name(),
107
+ "namespace": result.get_name_space(),
108
+ "classname": result.get_class_name(),
109
+ }
110
+ api_layer = Converter.layer_to_api_model(layer)
111
+ if api_layer is not None:
112
+ request_kwargs["layer"] = api_layer
113
+ return AdaptersAutoTestsPostRequest(**request_kwargs)
96
114
 
97
115
  @staticmethod
98
116
  def test_result_to_update_autotest_request(
99
- result: TestCase, external_id: str, project_id: str) -> AdaptersAutoTestsPutRequest:
100
- return AdaptersAutoTestsPutRequest(
101
- external_id=external_id,
102
- project_id=project_id,
103
- name=result.get_name(),
104
- namespace=result.get_name_space(),
105
- classname=result.get_class_name(),
106
- is_flaky=result.get_is_flaky()
107
- )
117
+ result: TestCase,
118
+ external_id: str,
119
+ project_id: str,
120
+ layer: typing.Optional[str] = None) -> AdaptersAutoTestsPutRequest:
121
+ request_kwargs = {
122
+ "external_id": external_id,
123
+ "project_id": project_id,
124
+ "name": result.get_name(),
125
+ "namespace": result.get_name_space(),
126
+ "classname": result.get_class_name(),
127
+ "is_flaky": result.get_is_flaky(),
128
+ "reset_layer": False,
129
+ }
130
+ api_layer = Converter.layer_to_api_model(layer)
131
+ if api_layer is not None:
132
+ request_kwargs["layer"] = api_layer
133
+ return AdaptersAutoTestsPutRequest(**request_kwargs)
108
134
 
109
135
  @staticmethod
110
136
  def test_result_to_testrun_result_post_model(
@@ -34,7 +34,7 @@ class Importer:
34
34
  if not autotests:
35
35
  self.__api_client.create_autotest(
36
36
  Converter.test_result_to_create_autotest_request(
37
- result, external_id, self.__config.project_id
37
+ result, external_id, self.__config.project_id, self.__config.autotest_layer
38
38
  )
39
39
  )
40
40
  else:
@@ -42,7 +42,7 @@ class Importer:
42
42
 
43
43
  self.__api_client.update_autotest(
44
44
  Converter.test_result_to_update_autotest_request(
45
- result, external_id, self.__config.project_id
45
+ result, external_id, self.__config.project_id, self.__config.autotest_layer
46
46
  )
47
47
  )
48
48
 
@@ -37,3 +37,4 @@ class Config:
37
37
  disable_cert_validation: bool = False
38
38
  framework: str = ""
39
39
  ignore_flaky_failure: bool = False
40
+ autotest_layer: typing.Optional[str] = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: testit-cli
3
- Version: 2.10.3
3
+ Version: 2.11.0
4
4
  Summary: This tool is the command line wrapper of Test IT allowing you to upload the test results in real time to Test IT
5
5
  Home-page: https://pypi.org/project/testit-cli/
6
6
  Author: Integration team
@@ -145,3 +145,31 @@ Notes:
145
145
  - Test run tags/links are independent from autotest/result tags and links.
146
146
  - On an existing run, new tags/links are **merged** (existing values are kept; duplicates by tag name / link URL are skipped).
147
147
  - Empty or omitted values mean “do not change tags/links”.
148
+
149
+ ## Autotest layer (test pyramid)
150
+
151
+ When importing XML results, CLI can set the **autotest** pyramid layer for every upserted autotest (create/update).
152
+ This is a **run-level default** for file-based import; adapters still read layer from test code annotations.
153
+
154
+ | Intent | CLI | Env |
155
+ |--------|-----|-----|
156
+ | Default autotest layer | `--autotest-layer` / `-al` | `TMS_AUTOTEST_LAYER` |
157
+
158
+ Supported commands: `results import`, `results upload`.
159
+
160
+ Recommended values: `E2E`, `UI`, `API`, `Contract`, `Integration`, `Component`, `Unit`. Any other non-empty string is accepted.
161
+
162
+ ```bash
163
+ export TMS_AUTOTEST_LAYER=API
164
+ testit results import \
165
+ --url "$TMS_URL" \
166
+ --token "$TMS_TOKEN" \
167
+ --project-id "$TMS_PROJECT_ID" \
168
+ --configuration-id "$TMS_CONFIGURATION_ID" \
169
+ --results ./results
170
+ ```
171
+
172
+ Behaviour (aligned with adapters API):
173
+
174
+ - Layer set → send `layer: { name, source: Run }` on create/update.
175
+ - Layer not set → do not send `layer`; on update always send `resetLayer: false`.
@@ -230,6 +230,7 @@ src/testit_cli/models/status_type.py
230
230
  src/testit_cli/models/testcase.py
231
231
  src/testit_cli/models/testrun.py
232
232
  src/testit_cli/models/testrun_link.py
233
+ tests/test_autotest_layer.py
233
234
  tests/test_click.py
234
235
  tests/test_service.py
235
236
  tests/test_testrun_metadata.py
@@ -0,0 +1,44 @@
1
+ import pytest
2
+ from src.testit_cli.converter import Converter
3
+ from src.testit_cli.models.testcase import TestCase
4
+
5
+
6
+ @pytest.mark.parametrize("raw", [None, "", " "])
7
+ def test_layer_to_api_model_omits_when_empty(raw):
8
+ assert Converter.layer_to_api_model(raw) is None
9
+
10
+
11
+ def test_layer_to_api_model_maps_name_and_run_source():
12
+ layer = Converter.layer_to_api_model("API")
13
+ assert layer is not None
14
+ assert layer.name == "API"
15
+ assert str(layer.source) == "Run"
16
+
17
+
18
+ def test_create_autotest_request_includes_layer_when_set():
19
+ result = TestCase("test", "ns", "cls", 1)
20
+ request = Converter.test_result_to_create_autotest_request(
21
+ result, "ext-id", "proj-id", layer="E2E"
22
+ )
23
+ assert request.layer is not None
24
+ assert request.layer.name == "E2E"
25
+ assert str(request.layer.source) == "Run"
26
+
27
+
28
+ def test_create_autotest_request_omits_layer_when_not_set():
29
+ result = TestCase("test", "ns", "cls", 1)
30
+ request = Converter.test_result_to_create_autotest_request(
31
+ result, "ext-id", "proj-id"
32
+ )
33
+ assert "layer" not in request.to_dict()
34
+
35
+
36
+ def test_update_autotest_request_always_resets_layer_false_and_sets_layer_when_given():
37
+ result = TestCase("test", "ns", "cls", 1)
38
+ result.set_is_flaky(False)
39
+ request = Converter.test_result_to_update_autotest_request(
40
+ result, "ext-id", "proj-id", layer="API"
41
+ )
42
+ assert request.reset_layer is False
43
+ assert request.layer is not None
44
+ assert request.layer.name == "API"
File without changes
File without changes