argus-alm 0.15.2__py3-none-any.whl → 0.15.3__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 (109) hide show
  1. argus/_version.py +2 -2
  2. argus/client/generic_result.py +6 -1
  3. {argus_alm-0.15.2.dist-info → argus_alm-0.15.3.dist-info}/METADATA +1 -1
  4. argus_alm-0.15.3.dist-info/RECORD +22 -0
  5. argus/backend/.gitkeep +0 -0
  6. argus/backend/__init__.py +0 -0
  7. argus/backend/cli.py +0 -57
  8. argus/backend/controller/__init__.py +0 -0
  9. argus/backend/controller/admin.py +0 -20
  10. argus/backend/controller/admin_api.py +0 -355
  11. argus/backend/controller/api.py +0 -589
  12. argus/backend/controller/auth.py +0 -67
  13. argus/backend/controller/client_api.py +0 -109
  14. argus/backend/controller/main.py +0 -316
  15. argus/backend/controller/notification_api.py +0 -72
  16. argus/backend/controller/notifications.py +0 -13
  17. argus/backend/controller/planner_api.py +0 -194
  18. argus/backend/controller/team.py +0 -129
  19. argus/backend/controller/team_ui.py +0 -19
  20. argus/backend/controller/testrun_api.py +0 -513
  21. argus/backend/controller/view_api.py +0 -188
  22. argus/backend/controller/views_widgets/__init__.py +0 -0
  23. argus/backend/controller/views_widgets/graphed_stats.py +0 -54
  24. argus/backend/controller/views_widgets/graphs.py +0 -68
  25. argus/backend/controller/views_widgets/highlights.py +0 -135
  26. argus/backend/controller/views_widgets/nemesis_stats.py +0 -26
  27. argus/backend/controller/views_widgets/summary.py +0 -43
  28. argus/backend/db.py +0 -98
  29. argus/backend/error_handlers.py +0 -41
  30. argus/backend/events/event_processors.py +0 -34
  31. argus/backend/models/__init__.py +0 -0
  32. argus/backend/models/argus_ai.py +0 -24
  33. argus/backend/models/github_issue.py +0 -60
  34. argus/backend/models/plan.py +0 -24
  35. argus/backend/models/result.py +0 -187
  36. argus/backend/models/runtime_store.py +0 -58
  37. argus/backend/models/view_widgets.py +0 -25
  38. argus/backend/models/web.py +0 -403
  39. argus/backend/plugins/__init__.py +0 -0
  40. argus/backend/plugins/core.py +0 -248
  41. argus/backend/plugins/driver_matrix_tests/controller.py +0 -66
  42. argus/backend/plugins/driver_matrix_tests/model.py +0 -429
  43. argus/backend/plugins/driver_matrix_tests/plugin.py +0 -21
  44. argus/backend/plugins/driver_matrix_tests/raw_types.py +0 -62
  45. argus/backend/plugins/driver_matrix_tests/service.py +0 -61
  46. argus/backend/plugins/driver_matrix_tests/udt.py +0 -42
  47. argus/backend/plugins/generic/model.py +0 -86
  48. argus/backend/plugins/generic/plugin.py +0 -15
  49. argus/backend/plugins/generic/types.py +0 -14
  50. argus/backend/plugins/loader.py +0 -39
  51. argus/backend/plugins/sct/controller.py +0 -224
  52. argus/backend/plugins/sct/plugin.py +0 -37
  53. argus/backend/plugins/sct/resource_setup.py +0 -177
  54. argus/backend/plugins/sct/service.py +0 -682
  55. argus/backend/plugins/sct/testrun.py +0 -288
  56. argus/backend/plugins/sct/udt.py +0 -100
  57. argus/backend/plugins/sirenada/model.py +0 -118
  58. argus/backend/plugins/sirenada/plugin.py +0 -16
  59. argus/backend/service/admin.py +0 -26
  60. argus/backend/service/argus_service.py +0 -696
  61. argus/backend/service/build_system_monitor.py +0 -185
  62. argus/backend/service/client_service.py +0 -127
  63. argus/backend/service/event_service.py +0 -18
  64. argus/backend/service/github_service.py +0 -233
  65. argus/backend/service/jenkins_service.py +0 -269
  66. argus/backend/service/notification_manager.py +0 -159
  67. argus/backend/service/planner_service.py +0 -608
  68. argus/backend/service/release_manager.py +0 -229
  69. argus/backend/service/results_service.py +0 -690
  70. argus/backend/service/stats.py +0 -610
  71. argus/backend/service/team_manager_service.py +0 -82
  72. argus/backend/service/test_lookup.py +0 -172
  73. argus/backend/service/testrun.py +0 -489
  74. argus/backend/service/user.py +0 -308
  75. argus/backend/service/views.py +0 -219
  76. argus/backend/service/views_widgets/__init__.py +0 -0
  77. argus/backend/service/views_widgets/graphed_stats.py +0 -180
  78. argus/backend/service/views_widgets/highlights.py +0 -374
  79. argus/backend/service/views_widgets/nemesis_stats.py +0 -34
  80. argus/backend/template_filters.py +0 -27
  81. argus/backend/tests/__init__.py +0 -0
  82. argus/backend/tests/client_service/__init__.py +0 -0
  83. argus/backend/tests/client_service/test_submit_results.py +0 -79
  84. argus/backend/tests/conftest.py +0 -180
  85. argus/backend/tests/results_service/__init__.py +0 -0
  86. argus/backend/tests/results_service/test_best_results.py +0 -178
  87. argus/backend/tests/results_service/test_cell.py +0 -65
  88. argus/backend/tests/results_service/test_chartjs_additional_functions.py +0 -259
  89. argus/backend/tests/results_service/test_create_chartjs.py +0 -220
  90. argus/backend/tests/results_service/test_result_metadata.py +0 -100
  91. argus/backend/tests/results_service/test_results_service.py +0 -203
  92. argus/backend/tests/results_service/test_validation_rules.py +0 -213
  93. argus/backend/tests/view_widgets/__init__.py +0 -0
  94. argus/backend/tests/view_widgets/test_highlights_api.py +0 -532
  95. argus/backend/util/common.py +0 -65
  96. argus/backend/util/config.py +0 -38
  97. argus/backend/util/encoders.py +0 -56
  98. argus/backend/util/logsetup.py +0 -80
  99. argus/backend/util/module_loaders.py +0 -30
  100. argus/backend/util/send_email.py +0 -91
  101. argus/client/tests/__init__.py +0 -0
  102. argus/client/tests/conftest.py +0 -19
  103. argus/client/tests/test_package.py +0 -45
  104. argus/client/tests/test_results.py +0 -224
  105. argus_alm-0.15.2.dist-info/RECORD +0 -122
  106. {argus_alm-0.15.2.dist-info → argus_alm-0.15.3.dist-info}/WHEEL +0 -0
  107. {argus_alm-0.15.2.dist-info → argus_alm-0.15.3.dist-info}/entry_points.txt +0 -0
  108. {argus_alm-0.15.2.dist-info → argus_alm-0.15.3.dist-info}/licenses/LICENSE +0 -0
  109. {argus_alm-0.15.2.dist-info → argus_alm-0.15.3.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