utf-queue-client 1.21.4b4__tar.gz → 1.21.5__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 (94) hide show
  1. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/Jenkinsfile +2 -2
  2. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/PKG-INFO +2 -2
  3. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/pyproject.toml +4 -2
  4. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/requirements.txt +1 -1
  5. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/script_test.groovy +1 -1
  6. utf_queue_client-1.21.5/test/scripts/test_package_release_metadata_cli.py +497 -0
  7. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/scripts/package_release_metadata_cli.py +192 -69
  8. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client.egg-info/PKG-INFO +2 -2
  9. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client.egg-info/SOURCES.txt +1 -0
  10. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client.egg-info/entry_points.txt +2 -0
  11. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client.egg-info/requires.txt +1 -1
  12. utf_queue_client-1.21.5/uv.lock +2710 -0
  13. utf_queue_client-1.21.4b4/test/scripts/test_package_release_metadata_cli.py +0 -291
  14. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/.gitignore +0 -0
  15. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/.gitmodules +0 -0
  16. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/.idea/.gitignore +0 -0
  17. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/.idea/modules.xml +0 -0
  18. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/.idea/utf_queue_client_python.iml +0 -0
  19. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/.idea/vcs.xml +0 -0
  20. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/.pre-commit-config.yaml +0 -0
  21. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/README.md +0 -0
  22. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/examples/example_async_consumer.py +0 -0
  23. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/setup.cfg +0 -0
  24. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/sonar-project.properties +0 -0
  25. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/.gitattributes +0 -0
  26. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/Dockerfile.script_test +0 -0
  27. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/clients/test_amqp_connections.py +0 -0
  28. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/clients/test_async_consumer.py +0 -0
  29. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/clients/test_connection_retry.py +0 -0
  30. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/clients/test_data_lake_data_producer.py +0 -0
  31. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/clients/test_http_producer.py +0 -0
  32. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/clients/test_opentelemetry_data_producer.py +0 -0
  33. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/clients/test_rail_data_producer_tests.py +0 -0
  34. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/clients/test_sqa_test_result_producer.py +0 -0
  35. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/clients/test_xray_data_producer.py +0 -0
  36. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/conftest.py +0 -0
  37. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/pytest.ini +0 -0
  38. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/scripts/test_ca_cert.py +0 -0
  39. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/scripts/test_publish_release_info.py +0 -0
  40. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/scripts/test_publish_test_results.py +0 -0
  41. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/scripts/test_ubai_copy.py +0 -0
  42. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/scripts/test_ubai_search.py +0 -0
  43. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/scripts/test_ubai_update_retention.py +0 -0
  44. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/scripts/test_ubai_upload.py +0 -0
  45. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/silabs-intermediate.pem +0 -0
  46. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/silabs-root.pem +0 -0
  47. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/stopwatch.py +0 -0
  48. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/test.hex +0 -0
  49. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/test_models.py +0 -0
  50. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test/test_utils.py +0 -0
  51. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test-requirements-pydantic-v1.txt +0 -0
  52. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/test-requirements.txt +0 -0
  53. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/tools/build_dist.bat +0 -0
  54. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/tools/setup_venv.bat +0 -0
  55. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/tools/silabs-net.pem +0 -0
  56. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/tools/silabs.pem +0 -0
  57. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/tools/update_schema.bat +0 -0
  58. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/tools/upload_to_nexus.bat +0 -0
  59. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/tools/upload_to_pypi.bat +0 -0
  60. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/tools/upload_to_testpypi.bat +0 -0
  61. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/tox.ini +0 -0
  62. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/__init__.py +0 -0
  63. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/clients/__init__.py +0 -0
  64. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/clients/async_consumer.py +0 -0
  65. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/clients/base_producer.py +0 -0
  66. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/clients/data_lake_data_producer.py +0 -0
  67. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/clients/http_producer.py +0 -0
  68. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/clients/opentelemetry_data_producer.py +0 -0
  69. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/clients/sqa_test_result_producer.py +0 -0
  70. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/clients/test_rail_data_producer.py +0 -0
  71. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/clients/ubai_artifact_upload_request_producer.py +0 -0
  72. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/clients/xray_data_producer.py +0 -0
  73. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/exceptions/__init__.py +0 -0
  74. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/models/__init__.py +0 -0
  75. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/models/base_model.py +0 -0
  76. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/models/model_factory.py +0 -0
  77. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/models/schemas/__init__.py +0 -0
  78. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/models/schemas/utf_queue_models/models/python/__init__.py +0 -0
  79. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/models/schemas/utf_queue_models/models/python/generated_models.py +0 -0
  80. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/models/schemas/utf_queue_models/models/python/generated_models_pydantic_v1.py +0 -0
  81. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/models/schemas/utf_queue_models/models/python/generated_models_pydantic_v2.py +0 -0
  82. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/models/schemas/utf_queue_models/schema/queue_message.json +0 -0
  83. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/scripts/__init__.py +0 -0
  84. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/scripts/publish_release_info_cli.py +0 -0
  85. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/scripts/publish_test_results_cli.py +0 -0
  86. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/scripts/ubai_copy_cli.py +0 -0
  87. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/scripts/ubai_search_cli.py +0 -0
  88. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/scripts/ubai_update_retention_cli.py +0 -0
  89. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/scripts/ubai_upload_cli.py +0 -0
  90. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/utils/__init__.py +0 -0
  91. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/utils/queue_metrics_exporter.py +0 -0
  92. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client/utils/queue_span_exporter.py +0 -0
  93. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client.egg-info/dependency_links.txt +0 -0
  94. {utf_queue_client-1.21.4b4 → utf_queue_client-1.21.5}/utf_queue_client.egg-info/top_level.txt +0 -0
@@ -46,7 +46,7 @@ pipeline {
46
46
  python3 -m venv venv
47
47
  . venv/bin/activate
48
48
  uv pip install --upgrade pip wheel
49
- uv pip install -r test-requirements.txt
49
+ uv pip install --extra-index-url https://artifactory-bos.silabs.net/artifactory/api/pypi/infrasw-python-local/simple -r test-requirements.txt
50
50
 
51
51
  pre-commit run --all-files
52
52
  '''
@@ -55,7 +55,7 @@ pipeline {
55
55
  python3 -m venv venv_2
56
56
  . venv_2/bin/activate
57
57
  uv pip install --upgrade pip wheel
58
- uv pip install -r test-requirements-pydantic-v1.txt
58
+ uv pip install --extra-index-url https://artifactory-bos.silabs.net/artifactory/api/pypi/infrasw-python-local/simple -r test-requirements-pydantic-v1.txt
59
59
  '''
60
60
  }
61
61
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: utf-queue-client
3
- Version: 1.21.4b4
3
+ Version: 1.21.5
4
4
  Summary: No description provided
5
5
  Author-email: Joe Savage <joe.savage@silabs.com>
6
6
  Keywords: UTF
@@ -14,7 +14,7 @@ Requires-Dist: typing_extensions; python_version < "3.8"
14
14
  Requires-Dist: click
15
15
  Requires-Dist: certifi>=2020.4
16
16
  Requires-Dist: ubai-client>=1.2.0
17
- Requires-Dist: package-release-metadata-client
17
+ Requires-Dist: package-release-metadata-client==0.1.4
18
18
  Requires-Dist: opentelemetry-distro[otlp]
19
19
  Requires-Dist: otel-extensions>=0.1.2
20
20
  Requires-Dist: retry>=0.9.2
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "utf-queue-client"
7
- version = "1.21.4b4"
7
+ version = "1.21.5"
8
8
  description = "No description provided"
9
9
  authors = [
10
10
  { name = "Joe Savage", email = "joe.savage@silabs.com" }
@@ -20,7 +20,7 @@ dependencies = [
20
20
  "click",
21
21
  "certifi >= 2020.4",
22
22
  "ubai-client >= 1.2.0",
23
- "package-release-metadata-client",
23
+ "package-release-metadata-client == 0.1.4",
24
24
  "opentelemetry-distro[otlp]",
25
25
  "otel-extensions >= 0.1.2",
26
26
  "retry>=0.9.2",
@@ -37,6 +37,8 @@ publish_test_results_cli = "utf_queue_client.scripts.publish_test_results_cli:cl
37
37
  ubai_update_retention_cli = "utf_queue_client.scripts.ubai_update_retention_cli:cli_entrypoint"
38
38
  publish_release_info_cli = "utf_queue_client.scripts.publish_release_info_cli:cli_entrypoint"
39
39
  ubai_copy_cli = "utf_queue_client.scripts.ubai_copy_cli:cli_entrypoint"
40
+ pkgrelease_manifest_read = "utf_queue_client.scripts.package_release_metadata_cli:manifest_read_cli_entrypoint"
41
+ pkgrelease_manifest_write = "utf_queue_client.scripts.package_release_metadata_cli:manifest_write_cli_entrypoint"
40
42
  pkgrelease_quality_status_update = "utf_queue_client.scripts.package_release_metadata_cli:update_cli_entrypoint"
41
43
  pkgrelease_quality_status_enquiry = "utf_queue_client.scripts.package_release_metadata_cli:enquiry_cli_entrypoint"
42
44
 
@@ -9,7 +9,7 @@ typing_extensions; python_version < '3.8'
9
9
  click
10
10
  certifi>=2020.4
11
11
  ubai-client>=1.2.0
12
- package-release-metadata-client==0.1.2
12
+ package-release-metadata-client==0.1.4
13
13
  opentelemetry-distro[otlp]
14
14
  otel-extensions>=0.2.4
15
15
  retry>=0.9.2
@@ -17,7 +17,7 @@ pipeline {
17
17
  . venv/bin/activate
18
18
  pip install --upgrade pip
19
19
  pip install ubai_client
20
- pip install .
20
+ pip install . --extra-index-url https://artifactory-bos.silabs.net/artifactory/api/pypi/infrasw-python-local/simple
21
21
  '''
22
22
  }
23
23
  }
@@ -0,0 +1,497 @@
1
+ import json
2
+ from unittest.mock import MagicMock, patch
3
+
4
+ import pytest
5
+ from click.testing import CliRunner
6
+
7
+ pytest.importorskip("package_release_metadata_client")
8
+
9
+ from utf_queue_client.scripts.package_release_metadata_cli import ( # noqa: E402
10
+ enquiry_cli_entrypoint,
11
+ manifest_read_cli_entrypoint,
12
+ manifest_write_cli_entrypoint,
13
+ update_cli_entrypoint,
14
+ )
15
+
16
+ runner = CliRunner()
17
+
18
+ # ---------------------------------------------------------------------------
19
+ # Shared helpers
20
+ # ---------------------------------------------------------------------------
21
+
22
+ REQUIRED_UPDATE_ARGS = [
23
+ "--release-name",
24
+ "2.4.1",
25
+ "--build-number",
26
+ "42",
27
+ "--job-url",
28
+ "https://ci/build/1",
29
+ "--stack-name",
30
+ "zigbee",
31
+ "--test-result-type",
32
+ "sanity",
33
+ "--status",
34
+ "pass",
35
+ "--run-num",
36
+ "1",
37
+ ]
38
+
39
+ REQUIRED_MANIFEST_WRITE_ARGS = [
40
+ "--release-name",
41
+ "2.4.1",
42
+ "--build-number",
43
+ "42",
44
+ ]
45
+
46
+
47
+ def _qs_client_mock(create_data=None, latest_data=None, list_data=None):
48
+ """Return a MagicMock QualityStatusClient with pre-configured .data on each method."""
49
+ client = MagicMock()
50
+ if create_data is not None:
51
+ client.create_quality_status.return_value = MagicMock(data=create_data)
52
+ if latest_data is not None:
53
+ client.get_latest_quality_status.return_value = MagicMock(data=latest_data)
54
+ if list_data is not None:
55
+ client.list_quality_status.return_value = MagicMock(data=list_data)
56
+ return client
57
+
58
+
59
+ def _manifest_client_mock(create_data=None, latest_data=None):
60
+ """Return a MagicMock ManifestClient with pre-configured .data on each method."""
61
+ client = MagicMock()
62
+ if create_data is not None:
63
+ client.create_manifest.return_value = MagicMock(data=create_data)
64
+ if latest_data is not None:
65
+ client.get_latest_manifest.return_value = MagicMock(data=latest_data)
66
+ return client
67
+
68
+
69
+ # ---------------------------------------------------------------------------
70
+ # pkgrelease_manifest_read — argument validation
71
+ # ---------------------------------------------------------------------------
72
+
73
+
74
+ def test_manifest_read_help_exits_cleanly():
75
+ result = runner.invoke(manifest_read_cli_entrypoint, ["--help"])
76
+ assert result.exit_code == 0
77
+ assert "ManifestRead" in result.output
78
+
79
+
80
+ def test_manifest_read_missing_release_name_fails():
81
+ result = runner.invoke(manifest_read_cli_entrypoint, [])
82
+ assert result.exit_code != 0
83
+ assert "Missing option" in result.output
84
+
85
+
86
+ # ---------------------------------------------------------------------------
87
+ # pkgrelease_manifest_read — API routing and output
88
+ # ---------------------------------------------------------------------------
89
+
90
+
91
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_manifest_client")
92
+ def test_manifest_read_targets_prod_by_default(mock_make):
93
+ data = MagicMock(manifest_id="uuid-1", to_dict=lambda: {"manifest_id": "uuid-1"})
94
+ mock_make.return_value = _manifest_client_mock(latest_data=data)
95
+ runner.invoke(manifest_read_cli_entrypoint, ["--release-name", "2.4.1"])
96
+ mock_make.assert_called_once_with(False)
97
+
98
+
99
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_manifest_client")
100
+ def test_manifest_read_dev_flag_targets_dev(mock_make):
101
+ data = MagicMock(manifest_id="uuid-1", to_dict=lambda: {"manifest_id": "uuid-1"})
102
+ mock_make.return_value = _manifest_client_mock(latest_data=data)
103
+ runner.invoke(manifest_read_cli_entrypoint, ["--release-name", "2.4.1", "--dev"])
104
+ mock_make.assert_called_once_with(True)
105
+
106
+
107
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_manifest_client")
108
+ def test_manifest_read_calls_get_latest_manifest(mock_make):
109
+ data = MagicMock(manifest_id="uuid-1", to_dict=lambda: {"manifest_id": "uuid-1"})
110
+ client = _manifest_client_mock(latest_data=data)
111
+ mock_make.return_value = client
112
+ result = runner.invoke(manifest_read_cli_entrypoint, ["--release-name", "2.4.1"])
113
+ assert result.exit_code == 0
114
+ client.get_latest_manifest.assert_called_once_with("2.4.1")
115
+
116
+
117
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_manifest_client")
118
+ def test_manifest_read_output_is_json(mock_make):
119
+ data = MagicMock(
120
+ manifest_id="uuid-abc",
121
+ to_dict=lambda: {"manifest_id": "uuid-abc", "release_name": "2.4.1"},
122
+ )
123
+ mock_make.return_value = _manifest_client_mock(latest_data=data)
124
+ result = runner.invoke(manifest_read_cli_entrypoint, ["--release-name", "2.4.1"])
125
+ assert result.exit_code == 0
126
+ parsed = json.loads(result.output)
127
+ assert parsed["manifest_id"] == "uuid-abc"
128
+
129
+
130
+ # ---------------------------------------------------------------------------
131
+ # pkgrelease_manifest_write — argument validation
132
+ # ---------------------------------------------------------------------------
133
+
134
+
135
+ def test_manifest_write_help_exits_cleanly():
136
+ result = runner.invoke(manifest_write_cli_entrypoint, ["--help"])
137
+ assert result.exit_code == 0
138
+ assert "ManifestRead" in result.output
139
+
140
+
141
+ def test_manifest_write_missing_release_name_fails():
142
+ result = runner.invoke(manifest_write_cli_entrypoint, ["--build-number", "42"])
143
+ assert result.exit_code != 0
144
+ assert "Missing option" in result.output
145
+
146
+
147
+ def test_manifest_write_missing_build_number_fails():
148
+ result = runner.invoke(manifest_write_cli_entrypoint, ["--release-name", "2.4.1"])
149
+ assert result.exit_code != 0
150
+ assert "Missing option" in result.output
151
+
152
+
153
+ # ---------------------------------------------------------------------------
154
+ # pkgrelease_manifest_write — API routing and output
155
+ # ---------------------------------------------------------------------------
156
+
157
+
158
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_manifest_client")
159
+ def test_manifest_write_targets_prod_by_default(mock_make):
160
+ data = MagicMock(manifest_id="uuid-1", to_dict=lambda: {"manifest_id": "uuid-1"})
161
+ mock_make.return_value = _manifest_client_mock(create_data=data)
162
+ runner.invoke(manifest_write_cli_entrypoint, REQUIRED_MANIFEST_WRITE_ARGS)
163
+ mock_make.assert_called_once_with(False)
164
+
165
+
166
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_manifest_client")
167
+ def test_manifest_write_dev_flag_targets_dev(mock_make):
168
+ data = MagicMock(manifest_id="uuid-1", to_dict=lambda: {"manifest_id": "uuid-1"})
169
+ mock_make.return_value = _manifest_client_mock(create_data=data)
170
+ runner.invoke(
171
+ manifest_write_cli_entrypoint, REQUIRED_MANIFEST_WRITE_ARGS + ["--dev"]
172
+ )
173
+ mock_make.assert_called_once_with(True)
174
+
175
+
176
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_manifest_client")
177
+ def test_manifest_write_calls_create_manifest(mock_make):
178
+ data = MagicMock(
179
+ manifest_id="uuid-new", to_dict=lambda: {"manifest_id": "uuid-new"}
180
+ )
181
+ client = _manifest_client_mock(create_data=data)
182
+ mock_make.return_value = client
183
+ result = runner.invoke(manifest_write_cli_entrypoint, REQUIRED_MANIFEST_WRITE_ARGS)
184
+ assert result.exit_code == 0
185
+ client.create_manifest.assert_called_once()
186
+ payload = client.create_manifest.call_args[0][0]
187
+ assert payload.release_name == "2.4.1"
188
+ assert payload.build_number == 42
189
+
190
+
191
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_manifest_client")
192
+ def test_manifest_write_optional_artifactory_url_forwarded(mock_make):
193
+ data = MagicMock(
194
+ manifest_id="uuid-new", to_dict=lambda: {"manifest_id": "uuid-new"}
195
+ )
196
+ client = _manifest_client_mock(create_data=data)
197
+ mock_make.return_value = client
198
+ result = runner.invoke(
199
+ manifest_write_cli_entrypoint,
200
+ REQUIRED_MANIFEST_WRITE_ARGS
201
+ + ["--artifactory-url", "https://art.example.com/pkg"],
202
+ )
203
+ assert result.exit_code == 0
204
+ payload = client.create_manifest.call_args[0][0]
205
+ assert payload.artifactory_url == "https://art.example.com/pkg"
206
+
207
+
208
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_manifest_client")
209
+ def test_manifest_write_output_is_json(mock_make):
210
+ data = MagicMock(
211
+ manifest_id="uuid-new",
212
+ to_dict=lambda: {
213
+ "manifest_id": "uuid-new",
214
+ "release_name": "2.4.1",
215
+ "build_number": 42,
216
+ },
217
+ )
218
+ mock_make.return_value = _manifest_client_mock(create_data=data)
219
+ result = runner.invoke(manifest_write_cli_entrypoint, REQUIRED_MANIFEST_WRITE_ARGS)
220
+ assert result.exit_code == 0
221
+ parsed = json.loads(result.output)
222
+ assert parsed["manifest_id"] == "uuid-new"
223
+ assert parsed["build_number"] == 42
224
+
225
+
226
+ # ---------------------------------------------------------------------------
227
+ # pkgrelease_quality_status_update — argument validation
228
+ # ---------------------------------------------------------------------------
229
+
230
+
231
+ def test_update_help_exits_cleanly():
232
+ result = runner.invoke(update_cli_entrypoint, ["--help"])
233
+ assert result.exit_code == 0
234
+ assert "QualityStatusRead" in result.output
235
+
236
+
237
+ def test_update_missing_required_args_fails():
238
+ result = runner.invoke(update_cli_entrypoint, ["--release-name", "2.4.1"])
239
+ assert result.exit_code != 0
240
+ assert "Missing option" in result.output
241
+
242
+
243
+ def test_update_invalid_status_rejected():
244
+ args = REQUIRED_UPDATE_ARGS[:]
245
+ args[args.index("pass")] = "passed"
246
+ result = runner.invoke(update_cli_entrypoint, args)
247
+ assert result.exit_code != 0
248
+ assert "'passed' is not" in result.output
249
+
250
+
251
+ @pytest.mark.parametrize("status", ["pass", "fail", "aborted"])
252
+ def test_update_all_valid_statuses_accepted(status):
253
+ args = REQUIRED_UPDATE_ARGS[:]
254
+ args[args.index("pass")] = status
255
+ data = MagicMock(id=1, to_dict=lambda: {"id": 1})
256
+ with patch(
257
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
258
+ ) as mock_make:
259
+ mock_make.return_value = _qs_client_mock(create_data=data)
260
+ result = runner.invoke(update_cli_entrypoint, args)
261
+ assert result.exit_code == 0
262
+
263
+
264
+ # ---------------------------------------------------------------------------
265
+ # pkgrelease_quality_status_update — API routing and output
266
+ # ---------------------------------------------------------------------------
267
+
268
+
269
+ @patch(
270
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
271
+ )
272
+ def test_update_targets_prod_by_default(mock_make):
273
+ data = MagicMock(id=1, to_dict=lambda: {"id": 1})
274
+ mock_make.return_value = _qs_client_mock(create_data=data)
275
+ runner.invoke(update_cli_entrypoint, REQUIRED_UPDATE_ARGS)
276
+ mock_make.assert_called_once_with(False)
277
+
278
+
279
+ @patch(
280
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
281
+ )
282
+ def test_update_dev_flag_targets_dev(mock_make):
283
+ data = MagicMock(id=1, to_dict=lambda: {"id": 1})
284
+ mock_make.return_value = _qs_client_mock(create_data=data)
285
+ runner.invoke(update_cli_entrypoint, REQUIRED_UPDATE_ARGS + ["--dev"])
286
+ mock_make.assert_called_once_with(True)
287
+
288
+
289
+ @patch(
290
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
291
+ )
292
+ def test_update_calls_create_quality_status(mock_make):
293
+ data = MagicMock(id=99, to_dict=lambda: {"id": 99})
294
+ client = _qs_client_mock(create_data=data)
295
+ mock_make.return_value = client
296
+ result = runner.invoke(update_cli_entrypoint, REQUIRED_UPDATE_ARGS)
297
+ assert result.exit_code == 0
298
+ client.create_quality_status.assert_called_once()
299
+
300
+
301
+ @patch(
302
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
303
+ )
304
+ def test_update_optional_fields_forwarded(mock_make):
305
+ data = MagicMock(id=1, to_dict=lambda: {"id": 1})
306
+ client = _qs_client_mock(create_data=data)
307
+ mock_make.return_value = client
308
+ result = runner.invoke(
309
+ update_cli_entrypoint,
310
+ REQUIRED_UPDATE_ARGS
311
+ + [
312
+ "--pass-cnt",
313
+ "80",
314
+ "--fail-cnt",
315
+ "20",
316
+ "--total-cnt",
317
+ "100",
318
+ "--pass-pct",
319
+ "80.0",
320
+ "--sub-stack",
321
+ "core",
322
+ ],
323
+ )
324
+ assert result.exit_code == 0
325
+ payload = client.create_quality_status.call_args[0][0]
326
+ assert payload.pass_cnt == 80
327
+ assert payload.fail_cnt == 20
328
+ assert payload.sub_stack == "core"
329
+
330
+
331
+ @patch(
332
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
333
+ )
334
+ def test_update_output_is_json(mock_make):
335
+ data = MagicMock(id=7, to_dict=lambda: {"id": 7, "status": "pass"})
336
+ mock_make.return_value = _qs_client_mock(create_data=data)
337
+ result = runner.invoke(update_cli_entrypoint, REQUIRED_UPDATE_ARGS)
338
+ assert result.exit_code == 0
339
+ parsed = json.loads(result.output)
340
+ assert parsed["id"] == 7
341
+
342
+
343
+ # ---------------------------------------------------------------------------
344
+ # pkgrelease_quality_status_enquiry — argument validation
345
+ # ---------------------------------------------------------------------------
346
+
347
+
348
+ def test_enquiry_help_exits_cleanly():
349
+ result = runner.invoke(enquiry_cli_entrypoint, ["--help"])
350
+ assert result.exit_code == 0
351
+ assert "LatestQualityStatusResponse" in result.output
352
+ assert "List[QualityStatusRead]" in result.output
353
+
354
+
355
+ def test_enquiry_missing_release_name_fails():
356
+ result = runner.invoke(enquiry_cli_entrypoint, [])
357
+ assert result.exit_code != 0
358
+ assert "Missing option" in result.output
359
+
360
+
361
+ # ---------------------------------------------------------------------------
362
+ # pkgrelease_quality_status_enquiry — API routing
363
+ # ---------------------------------------------------------------------------
364
+
365
+
366
+ @patch(
367
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
368
+ )
369
+ def test_enquiry_release_name_only_calls_latest(mock_make):
370
+ data = MagicMock(
371
+ to_dict=lambda: {"release_name": "2.4.1", "build_number": 42, "stacks": []}
372
+ )
373
+ client = _qs_client_mock(latest_data=data)
374
+ mock_make.return_value = client
375
+ result = runner.invoke(enquiry_cli_entrypoint, ["--release-name", "2.4.1"])
376
+ assert result.exit_code == 0
377
+ client.get_latest_quality_status.assert_called_once_with(
378
+ release_name="2.4.1", build_number=None
379
+ )
380
+
381
+
382
+ @patch(
383
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
384
+ )
385
+ def test_enquiry_with_build_num_calls_latest(mock_make):
386
+ data = MagicMock(to_dict=lambda: {})
387
+ client = _qs_client_mock(latest_data=data)
388
+ mock_make.return_value = client
389
+ result = runner.invoke(
390
+ enquiry_cli_entrypoint, ["--release-name", "2.4.1", "--build-num", "42"]
391
+ )
392
+ assert result.exit_code == 0
393
+ client.get_latest_quality_status.assert_called_once_with(
394
+ release_name="2.4.1", build_number=42
395
+ )
396
+
397
+
398
+ @patch(
399
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
400
+ )
401
+ def test_enquiry_with_stack_name_calls_list(mock_make):
402
+ client = _qs_client_mock(list_data=[])
403
+ mock_make.return_value = client
404
+ result = runner.invoke(
405
+ enquiry_cli_entrypoint, ["--release-name", "2.4.1", "--stack-name", "zigbee"]
406
+ )
407
+ assert result.exit_code == 0
408
+ client.list_quality_status.assert_called_once_with(
409
+ release_name="2.4.1",
410
+ build_number=None,
411
+ stack_name="zigbee",
412
+ test_result_type=None,
413
+ )
414
+
415
+
416
+ @patch(
417
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
418
+ )
419
+ def test_enquiry_with_test_result_type_calls_list(mock_make):
420
+ client = _qs_client_mock(list_data=[])
421
+ mock_make.return_value = client
422
+ result = runner.invoke(
423
+ enquiry_cli_entrypoint,
424
+ ["--release-name", "2.4.1", "--test-result-type", "sanity"],
425
+ )
426
+ assert result.exit_code == 0
427
+ client.list_quality_status.assert_called_once_with(
428
+ release_name="2.4.1",
429
+ build_number=None,
430
+ stack_name=None,
431
+ test_result_type="sanity",
432
+ )
433
+
434
+
435
+ @patch(
436
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
437
+ )
438
+ def test_enquiry_targets_prod_by_default(mock_make):
439
+ data = MagicMock(to_dict=lambda: {})
440
+ mock_make.return_value = _qs_client_mock(latest_data=data)
441
+ runner.invoke(enquiry_cli_entrypoint, ["--release-name", "2.4.1"])
442
+ mock_make.assert_called_once_with(False)
443
+
444
+
445
+ @patch(
446
+ "utf_queue_client.scripts.package_release_metadata_cli._make_quality_status_client"
447
+ )
448
+ def test_enquiry_dev_flag_targets_dev(mock_make):
449
+ data = MagicMock(to_dict=lambda: {})
450
+ mock_make.return_value = _qs_client_mock(latest_data=data)
451
+ runner.invoke(enquiry_cli_entrypoint, ["--release-name", "2.4.1", "--dev"])
452
+ mock_make.assert_called_once_with(True)
453
+
454
+
455
+ # ---------------------------------------------------------------------------
456
+ # _make_manifest_client / _make_quality_status_client — construction
457
+ # ---------------------------------------------------------------------------
458
+
459
+
460
+ @patch("utf_queue_client.scripts.package_release_metadata_cli.ManifestClient")
461
+ def test_make_manifest_client_prod_by_default(mock_cls):
462
+ from utf_queue_client.scripts.package_release_metadata_cli import (
463
+ _make_manifest_client,
464
+ )
465
+
466
+ _make_manifest_client(dev=False)
467
+ mock_cls.assert_called_once_with(dev=False)
468
+
469
+
470
+ @patch("utf_queue_client.scripts.package_release_metadata_cli.ManifestClient")
471
+ def test_make_manifest_client_dev_flag(mock_cls):
472
+ from utf_queue_client.scripts.package_release_metadata_cli import (
473
+ _make_manifest_client,
474
+ )
475
+
476
+ _make_manifest_client(dev=True)
477
+ mock_cls.assert_called_once_with(dev=True)
478
+
479
+
480
+ @patch("utf_queue_client.scripts.package_release_metadata_cli.QualityStatusClient")
481
+ def test_make_quality_status_client_prod_by_default(mock_cls):
482
+ from utf_queue_client.scripts.package_release_metadata_cli import (
483
+ _make_quality_status_client,
484
+ )
485
+
486
+ _make_quality_status_client(dev=False)
487
+ mock_cls.assert_called_once_with(dev=False)
488
+
489
+
490
+ @patch("utf_queue_client.scripts.package_release_metadata_cli.QualityStatusClient")
491
+ def test_make_quality_status_client_dev_flag(mock_cls):
492
+ from utf_queue_client.scripts.package_release_metadata_cli import (
493
+ _make_quality_status_client,
494
+ )
495
+
496
+ _make_quality_status_client(dev=True)
497
+ mock_cls.assert_called_once_with(dev=True)