argus-alm 0.15.2__py3-none-any.whl → 0.15.5__py3-none-any.whl

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 (114) hide show
  1. argus/_version.py +2 -2
  2. argus/client/base.py +14 -8
  3. argus/client/generic/cli.py +3 -2
  4. argus/client/generic/client.py +2 -1
  5. argus/client/generic_result.py +6 -1
  6. argus/client/sct/client.py +2 -1
  7. argus/common/enums.py +16 -0
  8. {argus_alm-0.15.2.dist-info → argus_alm-0.15.5.dist-info}/METADATA +4 -4
  9. argus_alm-0.15.5.dist-info/RECORD +22 -0
  10. argus/backend/.gitkeep +0 -0
  11. argus/backend/__init__.py +0 -0
  12. argus/backend/cli.py +0 -57
  13. argus/backend/controller/__init__.py +0 -0
  14. argus/backend/controller/admin.py +0 -20
  15. argus/backend/controller/admin_api.py +0 -355
  16. argus/backend/controller/api.py +0 -589
  17. argus/backend/controller/auth.py +0 -67
  18. argus/backend/controller/client_api.py +0 -109
  19. argus/backend/controller/main.py +0 -316
  20. argus/backend/controller/notification_api.py +0 -72
  21. argus/backend/controller/notifications.py +0 -13
  22. argus/backend/controller/planner_api.py +0 -194
  23. argus/backend/controller/team.py +0 -129
  24. argus/backend/controller/team_ui.py +0 -19
  25. argus/backend/controller/testrun_api.py +0 -513
  26. argus/backend/controller/view_api.py +0 -188
  27. argus/backend/controller/views_widgets/__init__.py +0 -0
  28. argus/backend/controller/views_widgets/graphed_stats.py +0 -54
  29. argus/backend/controller/views_widgets/graphs.py +0 -68
  30. argus/backend/controller/views_widgets/highlights.py +0 -135
  31. argus/backend/controller/views_widgets/nemesis_stats.py +0 -26
  32. argus/backend/controller/views_widgets/summary.py +0 -43
  33. argus/backend/db.py +0 -98
  34. argus/backend/error_handlers.py +0 -41
  35. argus/backend/events/event_processors.py +0 -34
  36. argus/backend/models/__init__.py +0 -0
  37. argus/backend/models/argus_ai.py +0 -24
  38. argus/backend/models/github_issue.py +0 -60
  39. argus/backend/models/plan.py +0 -24
  40. argus/backend/models/result.py +0 -187
  41. argus/backend/models/runtime_store.py +0 -58
  42. argus/backend/models/view_widgets.py +0 -25
  43. argus/backend/models/web.py +0 -403
  44. argus/backend/plugins/__init__.py +0 -0
  45. argus/backend/plugins/core.py +0 -248
  46. argus/backend/plugins/driver_matrix_tests/controller.py +0 -66
  47. argus/backend/plugins/driver_matrix_tests/model.py +0 -429
  48. argus/backend/plugins/driver_matrix_tests/plugin.py +0 -21
  49. argus/backend/plugins/driver_matrix_tests/raw_types.py +0 -62
  50. argus/backend/plugins/driver_matrix_tests/service.py +0 -61
  51. argus/backend/plugins/driver_matrix_tests/udt.py +0 -42
  52. argus/backend/plugins/generic/model.py +0 -86
  53. argus/backend/plugins/generic/plugin.py +0 -15
  54. argus/backend/plugins/generic/types.py +0 -14
  55. argus/backend/plugins/loader.py +0 -39
  56. argus/backend/plugins/sct/controller.py +0 -224
  57. argus/backend/plugins/sct/plugin.py +0 -37
  58. argus/backend/plugins/sct/resource_setup.py +0 -177
  59. argus/backend/plugins/sct/service.py +0 -682
  60. argus/backend/plugins/sct/testrun.py +0 -288
  61. argus/backend/plugins/sct/udt.py +0 -100
  62. argus/backend/plugins/sirenada/model.py +0 -118
  63. argus/backend/plugins/sirenada/plugin.py +0 -16
  64. argus/backend/service/admin.py +0 -26
  65. argus/backend/service/argus_service.py +0 -696
  66. argus/backend/service/build_system_monitor.py +0 -185
  67. argus/backend/service/client_service.py +0 -127
  68. argus/backend/service/event_service.py +0 -18
  69. argus/backend/service/github_service.py +0 -233
  70. argus/backend/service/jenkins_service.py +0 -269
  71. argus/backend/service/notification_manager.py +0 -159
  72. argus/backend/service/planner_service.py +0 -608
  73. argus/backend/service/release_manager.py +0 -229
  74. argus/backend/service/results_service.py +0 -690
  75. argus/backend/service/stats.py +0 -610
  76. argus/backend/service/team_manager_service.py +0 -82
  77. argus/backend/service/test_lookup.py +0 -172
  78. argus/backend/service/testrun.py +0 -489
  79. argus/backend/service/user.py +0 -308
  80. argus/backend/service/views.py +0 -219
  81. argus/backend/service/views_widgets/__init__.py +0 -0
  82. argus/backend/service/views_widgets/graphed_stats.py +0 -180
  83. argus/backend/service/views_widgets/highlights.py +0 -374
  84. argus/backend/service/views_widgets/nemesis_stats.py +0 -34
  85. argus/backend/template_filters.py +0 -27
  86. argus/backend/tests/__init__.py +0 -0
  87. argus/backend/tests/client_service/__init__.py +0 -0
  88. argus/backend/tests/client_service/test_submit_results.py +0 -79
  89. argus/backend/tests/conftest.py +0 -180
  90. argus/backend/tests/results_service/__init__.py +0 -0
  91. argus/backend/tests/results_service/test_best_results.py +0 -178
  92. argus/backend/tests/results_service/test_cell.py +0 -65
  93. argus/backend/tests/results_service/test_chartjs_additional_functions.py +0 -259
  94. argus/backend/tests/results_service/test_create_chartjs.py +0 -220
  95. argus/backend/tests/results_service/test_result_metadata.py +0 -100
  96. argus/backend/tests/results_service/test_results_service.py +0 -203
  97. argus/backend/tests/results_service/test_validation_rules.py +0 -213
  98. argus/backend/tests/view_widgets/__init__.py +0 -0
  99. argus/backend/tests/view_widgets/test_highlights_api.py +0 -532
  100. argus/backend/util/common.py +0 -65
  101. argus/backend/util/config.py +0 -38
  102. argus/backend/util/encoders.py +0 -56
  103. argus/backend/util/logsetup.py +0 -80
  104. argus/backend/util/module_loaders.py +0 -30
  105. argus/backend/util/send_email.py +0 -91
  106. argus/client/tests/__init__.py +0 -0
  107. argus/client/tests/conftest.py +0 -19
  108. argus/client/tests/test_package.py +0 -45
  109. argus/client/tests/test_results.py +0 -224
  110. argus_alm-0.15.2.dist-info/RECORD +0 -122
  111. {argus_alm-0.15.2.dist-info → argus_alm-0.15.5.dist-info}/WHEEL +0 -0
  112. {argus_alm-0.15.2.dist-info → argus_alm-0.15.5.dist-info}/entry_points.txt +0 -0
  113. {argus_alm-0.15.2.dist-info → argus_alm-0.15.5.dist-info}/licenses/LICENSE +0 -0
  114. {argus_alm-0.15.2.dist-info → argus_alm-0.15.5.dist-info}/top_level.txt +0 -0
@@ -1,259 +0,0 @@
1
- from uuid import uuid4
2
-
3
- import pytest
4
- from datetime import datetime
5
-
6
- from argus.backend.plugins.sct.udt import PackageVersion
7
- from argus.backend.service.results_service import (
8
- get_sorted_data_for_column_and_row,
9
- get_min_max_y,
10
- coerce_values_to_axis_boundaries,
11
- create_chart_options,
12
- create_datasets_for_column,
13
- create_release_datasets,
14
- create_limit_dataset,
15
- calculate_limits,
16
- calculate_graph_ticks, _identify_most_changed_package, _split_results_by_release,
17
- BestResult, RunsDetails
18
- )
19
- from argus.backend.models.result import ArgusGenericResultMetadata, ArgusGenericResultData, ColumnMetadata, ValidationRules
20
-
21
-
22
- @pytest.fixture
23
- def package_data():
24
- return [
25
- PackageVersion(name='scylla-server', version='2024.3.0~dev',
26
- date='20241018', revision_id='c3e2bc', build_id='b974e8'),
27
- PackageVersion(name='scylla-manager-server', version='3.2.8', date='20240517', revision_id='', build_id='')
28
- ]
29
-
30
-
31
- def test_identify_main_package_should_return_most_frequent_package(package_data):
32
- packages_list = package_data * 5 + \
33
- [PackageVersion(name='java-driver', version='3.11.5.3', date='null', revision_id='', build_id='')]
34
- main_package = _identify_most_changed_package(packages_list)
35
- assert main_package == 'scylla-server'
36
-
37
-
38
- def test_split_results_by_versions_should_group_correctly(package_data):
39
- packages = {
40
- str(uuid4()): package_data,
41
- str(uuid4()): [
42
- PackageVersion(name='scylla-server', version='2024.2.0~dev', date='20241018', revision_id='c3e2bc', build_id='b974e8')],
43
- str(uuid4()): [PackageVersion(name='scylla-server', version='2024.2.0', date='20241018', revision_id='', build_id='')]
44
- }
45
- main_package = 'scylla-server'
46
- versions_map = _split_results_by_release(packages, main_package)
47
- print(versions_map)
48
- assert len(versions_map) == 2
49
- assert '2024.2' in versions_map
50
- assert 'dev' in versions_map
51
-
52
-
53
- def test_get_sorted_data_for_column_and_row():
54
- run_id1 = uuid4()
55
- run_id2 = uuid4()
56
- run_id3 = uuid4()
57
- data = [
58
- ArgusGenericResultData(run_id=run_id2, column="col1", row="row1", value=1.5, status="PASS",
59
- sut_timestamp=datetime(2023, 10, 23)),
60
- ArgusGenericResultData(run_id=run_id3, column="col1", row="row1", value=2.5, status="PASS",
61
- sut_timestamp=datetime(2023, 10, 24)),
62
- ArgusGenericResultData(run_id=run_id1, column="col1", row="row1", value=0.5, status="PASS",
63
- sut_timestamp=datetime(2023, 10, 22)),
64
- ]
65
- packages = {
66
- run_id1: [PackageVersion(name='pkg1', version='1.0', date='', revision_id='', build_id='')],
67
- run_id2: [PackageVersion(name='pkg1', version='1.1', date='', revision_id='', build_id=''),
68
- PackageVersion(name='pkg2', version='1.0', date='', revision_id='', build_id='')],
69
- run_id3: [PackageVersion(name='pkg1', version='1.1', date='', revision_id='', build_id=''),
70
- PackageVersion(name='pkg2', version='1.1', date='20241111', revision_id='', build_id='')],
71
- }
72
- runs_details = RunsDetails(ignored=[], packages=packages)
73
- result = get_sorted_data_for_column_and_row(data, "col1", "row1", runs_details, main_package="pkg1")
74
- expected = [
75
- {"x": "2023-10-22T00:00:00Z", "y": 0.5, "changes": ["pkg1: 1.0"]},
76
- {"x": "2023-10-23T00:00:00Z", "y": 1.5, "changes": ["pkg1: 1.1", "pkg2: None -> 1.0"]},
77
- {"x": "2023-10-24T00:00:00Z", "y": 2.5, "changes": ['pkg1: 1.1', "pkg2: 1.0 -> 1.1 (20241111)"]},
78
- ]
79
- result_data = [{"x": item["x"], "y": item["y"], "changes": item["changes"]} for item in result]
80
- assert result_data == expected
81
-
82
-
83
- def test_get_min_max_y():
84
- datasets = [
85
- {
86
- "data": [
87
- {"x": "2023-10-20T00:00:00Z", "y": 1.0},
88
- {"x": "2023-10-21T00:00:00Z", "y": 2.0},
89
- {"x": "2023-10-25T00:00:00Z", "y": 3.4},
90
- {"x": "2023-10-26T00:00:00Z", "y": 3.9},
91
- {"x": "2023-10-26T00:00:00Z", "y": 4.0},
92
- {"x": "2023-10-27T00:00:00Z", "y": 100.0},
93
- ]
94
- }
95
- ]
96
- min_y, max_y = get_min_max_y(datasets)
97
- assert min_y == 1
98
- assert max_y == 6
99
-
100
-
101
- def test_coerce_values_to_axis_boundries():
102
- datasets = [
103
- {
104
- "data": [
105
- {"x": "2023-10-22T00:00:00Z", "y": 1.0},
106
- {"x": "2023-10-23T00:00:00Z", "y": 2.0},
107
- {"x": "2023-10-24T00:00:00Z", "y": 3.0},
108
- {"x": "2023-10-25T00:00:00Z", "y": 4.0},
109
- {"x": "2023-10-26T00:00:00Z", "y": 100.0},
110
- {"x": "2023-10-21T00:00:00Z", "y": -50.0},
111
- ]
112
- }
113
- ]
114
- min_y = 0
115
- max_y = 6
116
- coerce_values_to_axis_boundaries(datasets, min_y, max_y)
117
- data = datasets[0]["data"]
118
- assert data[0]["y"] == 1.0
119
- assert data[4]["y"] == 6
120
- assert data[4]["ori"] == 100.0
121
- assert data[5]["y"] == 0
122
- assert data[5]["ori"] == -50.0
123
-
124
-
125
- def test_create_chart_options():
126
- table = ArgusGenericResultMetadata(name="Test Table", description="Test Description",
127
- columns_meta=[ColumnMetadata(name="col1", unit="ms",
128
- type="NUMBER", higher_is_better=True)],
129
- rows_meta=["row1"], validation_rules={})
130
- column = table.columns_meta[0]
131
- options = create_chart_options(table, column, min_y=0, max_y=10)
132
- assert options["plugins"]["title"]["text"] == "Test Table - col1"
133
- assert options["scales"]["y"]["title"]["text"] == "[ms]"
134
- assert options["scales"]["y"]["min"] == 0
135
- assert options["scales"]["y"]["max"] == 10
136
-
137
-
138
- def test_create_datasets_for_column():
139
- table = ArgusGenericResultMetadata(
140
- name="Test Table",
141
- description="Test Description",
142
- columns_meta=[ColumnMetadata(name="col1", unit="ms", type="NUMBER", higher_is_better=True)],
143
- rows_meta=["row1", "row2"],
144
- validation_rules={}
145
- )
146
- data = [
147
- ArgusGenericResultData(run_id=uuid4(), column="col1", row="row1", value=1.5,
148
- status="PASS", sut_timestamp=datetime(2023, 10, 23)),
149
- ArgusGenericResultData(run_id=uuid4(), column="col1", row="row1", value=2.5,
150
- status="PASS", sut_timestamp=datetime(2023, 10, 24)),
151
- ArgusGenericResultData(run_id=uuid4(), column="col1", row="row2", value=3.5,
152
- status="PASS", sut_timestamp=datetime(2023, 10, 25)),
153
- ]
154
- best_results = {}
155
- releases_map = {"2024.2": [point.run_id for point in data][:1], "2024.3": [point.run_id for point in data][2:]}
156
- column = table.columns_meta[0]
157
- runs_details = RunsDetails(ignored=[], packages={})
158
- datasets = create_datasets_for_column(table, data, best_results, releases_map,
159
- column, runs_details, main_package="pkg1")
160
- assert len(datasets) == 2
161
- labels = [dataset["label"] for dataset in datasets]
162
- assert "2024.2 - row1" in labels
163
- assert "2024.3 - row2" in labels
164
-
165
-
166
- def test_create_release_datasets():
167
- points = [
168
- {"x": "2023-10-23T00:00:00Z", "y": 1.5, "id": "run1"},
169
- {"x": "2023-10-24T00:00:00Z", "y": 2.5, "id": "run2"},
170
- {"x": "2023-10-25T00:00:00Z", "y": 3.5, "id": "run3"},
171
- ]
172
- row = "row1"
173
- releases_map = {"2024.2": ["run1", "run2"], "2024.3": ["run3"]}
174
- line_color = 'rgba(255, 0, 0, 1.0)'
175
- datasets = create_release_datasets(points, row, releases_map, line_color)
176
- assert len(datasets) == 2
177
- assert datasets[0]["label"] == "2024.2 - row1"
178
- assert datasets[1]["label"] == "2024.3 - row1"
179
-
180
-
181
- def test_create_limit_dataset():
182
- points = [
183
- {"x": "2023-10-23T00:00:00Z", "y": 1.5, "id": "run1"},
184
- {"x": "2023-10-24T00:00:00Z", "y": 2.5, "id": "run2"},
185
- {"x": "2023-10-25T00:00:00Z", "y": 3.5, "id": "run3"},
186
- ]
187
- column = ColumnMetadata(name="col1", unit="ms", type="NUMBER", higher_is_better=True)
188
- row = "row1"
189
- best_results = {
190
- "col1:row1": [BestResult(key="col1:row1", value=2.0, result_date=datetime(2023, 10, 24), run_id="run2")]
191
- }
192
- table = ArgusGenericResultMetadata(name="Test Table", description="Test Description",
193
- columns_meta=[column], rows_meta=[row], validation_rules={
194
- "col1": [{"fixed_limit": 1.8, "best_pct": 10, "best_abs": 0.2, "valid_from": datetime(2023, 10, 23)}]
195
- })
196
- line_color = 'rgba(255, 0, 0, 1.0)'
197
- is_fixed_limit_drawn = False
198
- limit_dataset = create_limit_dataset(points, column, row, best_results, table, line_color, is_fixed_limit_drawn)
199
- assert limit_dataset is not None
200
- assert limit_dataset["label"] == "error threshold"
201
- assert limit_dataset["data"]
202
-
203
-
204
- def test_calculate_limits():
205
- points = [
206
- {"x": "2023-10-23T00:00:00Z", "y": 1.5},
207
- {"x": "2023-10-24T00:00:00Z", "y": 2.5},
208
- {"x": "2023-10-25T00:00:00Z", "y": 3.5},
209
- ]
210
- best_results = [BestResult(key="col1:row1", value=2.0, result_date=datetime(2023, 10, 24), run_id="run2")]
211
- validation_rules_list = [ValidationRules(valid_from=datetime(
212
- 2023, 10, 23), best_pct=10, best_abs=0.2, fixed_limit=1.8)]
213
- higher_is_better = True
214
- updated_points = calculate_limits(points, best_results, validation_rules_list, higher_is_better)
215
- for point in updated_points:
216
- assert 'limit' in point
217
-
218
-
219
- def test_calculate_graph_ticks_with_data_returns_min_max_ticks():
220
- graphs = [
221
- {
222
- "data": {
223
- "datasets": [
224
- {"data": [{"x": "2023-10-22T00:00:00Z", "y": 1.0}, {"x": "2023-10-23T00:00:00Z", "y": 2.0}]}
225
- ]
226
- }
227
- },
228
- {
229
- "data": {
230
- "datasets": [
231
- {"data": [{"x": "2023-10-24T00:00:00Z", "y": 3.0}, {"x": "2023-10-25T00:00:00Z", "y": 4.0}]}
232
- ]
233
- }
234
- }
235
- ]
236
- ticks = calculate_graph_ticks(graphs)
237
- assert ticks["min"] == "2023-10-22"
238
- assert ticks["max"] == "2023-10-25"
239
-
240
-
241
- def test_calculate_graph_ticks_without_data_does_not_fail():
242
- graphs = [
243
- {
244
- "data": {
245
- "datasets": [
246
- {"data": []}
247
- ]
248
- }
249
- },
250
- {
251
- "data": {
252
- "datasets": [
253
- {"data": []}
254
- ]
255
- }
256
- }
257
- ]
258
- ticks = calculate_graph_ticks(graphs)
259
- assert ticks == {}
@@ -1,220 +0,0 @@
1
- from datetime import datetime
2
- from uuid import uuid4
3
-
4
- from argus.backend.models.result import ArgusGenericResultMetadata, ColumnMetadata, ArgusGenericResultData, ValidationRules
5
- from argus.backend.service.results_service import create_chartjs, BestResult, RunsDetails
6
-
7
-
8
- def test_create_chartjs_without_validation_rules_should_create_chart_without_limits_series():
9
- table = ArgusGenericResultMetadata(
10
- test_id=uuid4(),
11
- name='Test Table',
12
- columns_meta=[
13
- ColumnMetadata(name='col1', unit='ms', type='FLOAT', higher_is_better=False)
14
- ],
15
- rows_meta=['row1'],
16
- validation_rules={}
17
- )
18
- data = [
19
- ArgusGenericResultData(
20
- test_id=table.test_id,
21
- name=table.name,
22
- run_id=uuid4(),
23
- column='col1',
24
- row='row1',
25
- sut_timestamp=datetime(2021, 1, 1),
26
- value=100.0,
27
- status='UNSET'
28
- )
29
- ]
30
- best_results = {
31
- 'col1:row1': [BestResult(key='col1:row1', value=100.0, result_date=datetime(2021, 1, 1), run_id=str(uuid4()))]
32
- }
33
- releases_map = {"1.0": [point.run_id for point in data]}
34
- runs_details = RunsDetails(ignored=[], packages={})
35
- graphs = create_chartjs(table, data, best_results, releases_map, runs_details, main_package="pkg1")
36
- assert len(graphs) == 1
37
- assert len(graphs[0]['data']['datasets']) == 1 # no limits series
38
-
39
-
40
- def test_create_chartjs_without_best_results_should_not_fail():
41
- table = ArgusGenericResultMetadata(
42
- test_id=uuid4(),
43
- name='Test Table',
44
- columns_meta=[
45
- ColumnMetadata(name='col1', unit='ms', type='FLOAT')
46
- ],
47
- rows_meta=['row1'],
48
- validation_rules={}
49
- )
50
- data = [
51
- ArgusGenericResultData(
52
- test_id=table.test_id,
53
- name=table.name,
54
- run_id=uuid4(),
55
- column='col1',
56
- row='row1',
57
- sut_timestamp=datetime(2021, 1, 1),
58
- value=100.0,
59
- status='UNSET'
60
- )
61
- ]
62
- best_results = {}
63
- releases_map = {"1.0": [point.run_id for point in data]}
64
- runs_details = RunsDetails(ignored=[], packages={})
65
- graphs = create_chartjs(table, data, best_results, releases_map, runs_details, main_package="pkg1")
66
- assert len(graphs) == 1
67
- assert len(graphs[0]['data']['datasets']) == 1 # no limits series
68
-
69
-
70
- def test_create_chartjs_with_validation_rules_should_add_limit_series():
71
- table = ArgusGenericResultMetadata(
72
- test_id=uuid4(),
73
- name='Test Table',
74
- columns_meta=[
75
- ColumnMetadata(name='col1', unit='ms', type='FLOAT', higher_is_better=False)
76
- ],
77
- rows_meta=['row1'],
78
- validation_rules={
79
- 'col1': [ValidationRules(valid_from=datetime(2021, 1, 1), best_pct=5.0, best_abs=None, fixed_limit=None)]
80
- }
81
- )
82
- data = [
83
- ArgusGenericResultData(
84
- test_id=table.test_id,
85
- name=table.name,
86
- run_id=uuid4(),
87
- column='col1',
88
- row='row1',
89
- sut_timestamp=datetime(2021, 2, 1),
90
- value=95.0,
91
- status='UNSET'
92
- )
93
- ]
94
- best_results = {
95
- 'col1:row1': [BestResult(key='col1:row1', value=100.0, result_date=datetime(2021, 1, 1), run_id=str(uuid4()))]
96
- }
97
- releases_map = {"1.0": [point.run_id for point in data]}
98
- runs_details = RunsDetails(ignored=[], packages={})
99
- graphs = create_chartjs(table, data, best_results, releases_map, runs_details, main_package="pkg1")
100
- assert 'limit' in graphs[0]['data']['datasets'][0]['data'][0]
101
-
102
-
103
- def test_chartjs_with_multiple_best_results_and_validation_rules_should_adjust_limits_for_each_point():
104
- table = ArgusGenericResultMetadata(
105
- test_id=uuid4(),
106
- name='Test Table',
107
- columns_meta=[
108
- ColumnMetadata(name='col1', unit='ms', type='FLOAT', higher_is_better=False)
109
- ],
110
- rows_meta=['row1'],
111
- validation_rules={
112
- 'col1': [
113
- ValidationRules(valid_from=datetime(2021, 1, 1), best_pct=5.0, best_abs=None, fixed_limit=None),
114
- ValidationRules(valid_from=datetime(2021, 3, 1), best_pct=None, best_abs=2.0, fixed_limit=None)
115
- ]
116
- }
117
- )
118
- data = [
119
- ArgusGenericResultData(
120
- test_id=table.test_id,
121
- name=table.name,
122
- run_id=uuid4(),
123
- column='col1',
124
- row='row1',
125
- sut_timestamp=datetime(2021, 2, 1),
126
- value=95.0,
127
- status='UNSET'
128
- ),
129
- ArgusGenericResultData(
130
- test_id=table.test_id,
131
- name=table.name,
132
- run_id=uuid4(),
133
- column='col1',
134
- row='row1',
135
- sut_timestamp=datetime(2021, 4, 1),
136
- value=90.0,
137
- status='UNSET'
138
- )
139
- ]
140
- best_results = {
141
- 'col1:row1': [
142
- BestResult(key='col1:row1', value=100.0, result_date=datetime(2021, 1, 1), run_id=str(uuid4())),
143
- BestResult(key='col1:row1', value=94.0, result_date=datetime(2021, 3, 1), run_id=str(uuid4()))
144
- ]
145
- }
146
- releases_map = {"1.0": [point.run_id for point in data]}
147
- runs_details = RunsDetails(ignored=[], packages={})
148
- graphs = create_chartjs(table, data, best_results, releases_map, runs_details, main_package="pkg1")
149
- datasets = graphs[0]['data']['datasets']
150
- limits = [point.get('limit') for dataset in datasets for point in dataset['data'] if 'limit' in point]
151
- assert len(limits) == 2
152
- assert limits[0] == 105.0
153
- assert limits[1] == 96.0
154
-
155
-
156
- def test_create_chartjs_no_data_should_not_fail():
157
- table = ArgusGenericResultMetadata(
158
- test_id=uuid4(),
159
- name='Empty Table',
160
- columns_meta=[],
161
- rows_meta=[],
162
- validation_rules={}
163
- )
164
- data = []
165
- best_results = {}
166
- releases_map = {"1.0": []}
167
- runs_details = RunsDetails(ignored=[], packages={})
168
- graphs = create_chartjs(table, data, best_results, releases_map, runs_details, main_package="pkg1")
169
- assert len(graphs) == 0
170
-
171
-
172
- def test_create_chartjs_multiple_columns_and_rows():
173
- table = ArgusGenericResultMetadata(
174
- test_id=uuid4(),
175
- name='Complex Table',
176
- columns_meta=[
177
- ColumnMetadata(name='col1', unit='ms', type='FLOAT', higher_is_better=False),
178
- ColumnMetadata(name='col2', unit='%', type='FLOAT', higher_is_better=True)
179
- ],
180
- rows_meta=['row1', 'row2'],
181
- validation_rules={
182
- 'col1': [ValidationRules(valid_from=datetime(2021, 1, 1), best_pct=5.0, best_abs=None, fixed_limit=None)]
183
- }
184
- )
185
- data = [
186
- ArgusGenericResultData(
187
- test_id=table.test_id,
188
- name=table.name,
189
- run_id=uuid4(),
190
- column='col1',
191
- row='row1',
192
- sut_timestamp=datetime(2021, 1, 1),
193
- value=100.0,
194
- status='UNSET'
195
- ),
196
- ArgusGenericResultData(
197
- test_id=table.test_id,
198
- name=table.name,
199
- run_id=uuid4(),
200
- column='col2',
201
- row='row2',
202
- sut_timestamp=datetime(2021, 1, 2),
203
- value=50.0,
204
- status='UNSET'
205
- )
206
- ]
207
- best_results = {
208
- 'col1:row1': [
209
- BestResult(key='col1:row1', value=100.0, result_date=datetime(2021, 1, 1), run_id=str(uuid4())),
210
- ],
211
- 'col2:row2': [
212
- BestResult(key='col2:row2', value=50.0, result_date=datetime(2021, 1, 2), run_id=str(uuid4())),
213
- ]
214
- }
215
- releases_map = {"1.0": [point.run_id for point in data]}
216
- runs_details = RunsDetails(ignored=[], packages={})
217
- graphs = create_chartjs(table, data, best_results, releases_map, runs_details, main_package="pkg1")
218
- assert len(graphs) == 2
219
- assert len(graphs[0]['data']['datasets']) == 2 # should have also limits dataset
220
- assert len(graphs[1]['data']['datasets']) == 1 # no limits series
@@ -1,100 +0,0 @@
1
- import uuid
2
- from datetime import datetime, timezone
3
- from unittest.mock import patch
4
- from argus.backend.models.result import ArgusGenericResultMetadata
5
-
6
-
7
- def generate_random_test_id():
8
- return str(uuid.uuid4())
9
-
10
-
11
- def test_initialization(argus_db):
12
- metadata = ArgusGenericResultMetadata(
13
- test_id=generate_random_test_id(),
14
- name="Test Metadata",
15
- description="A test description",
16
- columns_meta=[{"name": "col1", "unit": "ms", "type": "float", "higher_is_better": True}],
17
- validation_rules={"col1": [{"valid_from": datetime.now(
18
- timezone.utc), "best_pct": 90.0, "best_abs": 100.0, "fixed_limit": 50.0}]},
19
- rows_meta=["row1", "row2"]
20
- )
21
- assert metadata.name == "Test Metadata"
22
- assert len(metadata.columns_meta) == 1
23
- assert len(metadata.validation_rules) == 1
24
- assert len(metadata.rows_meta) == 2
25
-
26
-
27
- def test_update_validation_rules():
28
- metadata = ArgusGenericResultMetadata(
29
- test_id=generate_random_test_id(),
30
- name="Test Metadata",
31
- columns_meta=[{"name": "col1", "unit": "ms", "type": "float", "higher_is_better": True}],
32
- validation_rules={"col1": [{"valid_from": datetime.now(
33
- timezone.utc), "best_pct": 90.0, "best_abs": 100.0, "fixed_limit": 50.0}]},
34
- rows_meta=["row1", "row2"]
35
- )
36
- new_rules = {"col1": {"best_pct": 95.0, "best_abs": 105.0, "fixed_limit": 55.0}}
37
- updated = metadata.update_validation_rules(new_rules)
38
- assert updated
39
- assert len(metadata.validation_rules["col1"]) == 2
40
- assert metadata.validation_rules["col1"][-1].best_pct == 95.0
41
-
42
-
43
- def test_update_if_changed():
44
- metadata = ArgusGenericResultMetadata(
45
- test_id=generate_random_test_id(),
46
- name="Test Metadata",
47
- columns_meta=[{"name": "col1", "unit": "ms", "type": "float", "higher_is_better": True}],
48
- validation_rules={"col1": [{"valid_from": datetime.now(
49
- timezone.utc), "best_pct": 90.0, "best_abs": 100.0, "fixed_limit": 50.0}]},
50
- rows_meta=["row1", "row2"]
51
- )
52
- new_data = {
53
- "name": "Updated Metadata",
54
- "columns_meta": [{"name": "col1", "unit": "ms", "type": "float", "higher_is_better": True}],
55
- "validation_rules": {"col1": {"best_pct": 95.0, "best_abs": 105.0, "fixed_limit": 50.0}},
56
- "rows_meta": ["row1"],
57
- "sut_package_name": "new_package",
58
- }
59
- updated_metadata = metadata.update_if_changed(new_data)
60
- assert updated_metadata.name == "Updated Metadata"
61
- assert updated_metadata.sut_package_name == "new_package"
62
- assert len(updated_metadata.columns_meta) == 1
63
- assert len(updated_metadata.rows_meta) == 2 # should not remove rows from other runs
64
- assert len(updated_metadata.validation_rules["col1"]) == 2 # keep also the old rule
65
-
66
-
67
- def test_no_update_on_same_data():
68
- metadata = ArgusGenericResultMetadata(
69
- test_id=generate_random_test_id(),
70
- name="Test Metadata",
71
- columns_meta=[{"name": "col1", "unit": "ms", "type": "float", "higher_is_better": True}],
72
- validation_rules={"col1": [{"valid_from": datetime.now(
73
- timezone.utc), "best_pct": 90.0, "best_abs": 100.0, "fixed_limit": 50.0}]},
74
- rows_meta=["row1", "row2"]
75
- )
76
- new_data = {
77
- "name": "Test Metadata",
78
- "columns_meta": [{"name": "col1", "unit": "ms", "type": "float", "higher_is_better": True}],
79
- "validation_rules": {"col1": {"valid_from": datetime.now(timezone.utc), "best_pct": 90.0, "best_abs": 100.0, "fixed_limit": 50.0}},
80
- "rows_meta": ["row1", "row2"]
81
- }
82
- with patch.object(metadata, 'save', wraps=metadata.save) as mock_save:
83
- metadata.update_if_changed(new_data)
84
- assert not mock_save.called
85
-
86
-
87
- def test_adding_new_rows():
88
- metadata = ArgusGenericResultMetadata(
89
- test_id=generate_random_test_id(),
90
- name="Test Metadata",
91
- columns_meta=[{"name": "col1", "unit": "ms", "type": "float", "higher_is_better": True}],
92
- validation_rules={"col1": [{"valid_from": datetime.now(
93
- timezone.utc), "best_pct": 90.0, "best_abs": 100.0, "fixed_limit": 50.0}]},
94
- rows_meta=["row1"]
95
- )
96
- new_data = {"rows_meta": ["row2", "row3"]}
97
- updated_metadata = metadata.update_if_changed(new_data)
98
- assert len(updated_metadata.rows_meta) == 3
99
- assert "row2" in updated_metadata.rows_meta
100
- assert "row3" in updated_metadata.rows_meta