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.
- argus/_version.py +2 -2
- argus/client/generic_result.py +6 -1
- {argus_alm-0.15.2.dist-info → argus_alm-0.15.3.dist-info}/METADATA +1 -1
- argus_alm-0.15.3.dist-info/RECORD +22 -0
- argus/backend/.gitkeep +0 -0
- argus/backend/__init__.py +0 -0
- argus/backend/cli.py +0 -57
- argus/backend/controller/__init__.py +0 -0
- argus/backend/controller/admin.py +0 -20
- argus/backend/controller/admin_api.py +0 -355
- argus/backend/controller/api.py +0 -589
- argus/backend/controller/auth.py +0 -67
- argus/backend/controller/client_api.py +0 -109
- argus/backend/controller/main.py +0 -316
- argus/backend/controller/notification_api.py +0 -72
- argus/backend/controller/notifications.py +0 -13
- argus/backend/controller/planner_api.py +0 -194
- argus/backend/controller/team.py +0 -129
- argus/backend/controller/team_ui.py +0 -19
- argus/backend/controller/testrun_api.py +0 -513
- argus/backend/controller/view_api.py +0 -188
- argus/backend/controller/views_widgets/__init__.py +0 -0
- argus/backend/controller/views_widgets/graphed_stats.py +0 -54
- argus/backend/controller/views_widgets/graphs.py +0 -68
- argus/backend/controller/views_widgets/highlights.py +0 -135
- argus/backend/controller/views_widgets/nemesis_stats.py +0 -26
- argus/backend/controller/views_widgets/summary.py +0 -43
- argus/backend/db.py +0 -98
- argus/backend/error_handlers.py +0 -41
- argus/backend/events/event_processors.py +0 -34
- argus/backend/models/__init__.py +0 -0
- argus/backend/models/argus_ai.py +0 -24
- argus/backend/models/github_issue.py +0 -60
- argus/backend/models/plan.py +0 -24
- argus/backend/models/result.py +0 -187
- argus/backend/models/runtime_store.py +0 -58
- argus/backend/models/view_widgets.py +0 -25
- argus/backend/models/web.py +0 -403
- argus/backend/plugins/__init__.py +0 -0
- argus/backend/plugins/core.py +0 -248
- argus/backend/plugins/driver_matrix_tests/controller.py +0 -66
- argus/backend/plugins/driver_matrix_tests/model.py +0 -429
- argus/backend/plugins/driver_matrix_tests/plugin.py +0 -21
- argus/backend/plugins/driver_matrix_tests/raw_types.py +0 -62
- argus/backend/plugins/driver_matrix_tests/service.py +0 -61
- argus/backend/plugins/driver_matrix_tests/udt.py +0 -42
- argus/backend/plugins/generic/model.py +0 -86
- argus/backend/plugins/generic/plugin.py +0 -15
- argus/backend/plugins/generic/types.py +0 -14
- argus/backend/plugins/loader.py +0 -39
- argus/backend/plugins/sct/controller.py +0 -224
- argus/backend/plugins/sct/plugin.py +0 -37
- argus/backend/plugins/sct/resource_setup.py +0 -177
- argus/backend/plugins/sct/service.py +0 -682
- argus/backend/plugins/sct/testrun.py +0 -288
- argus/backend/plugins/sct/udt.py +0 -100
- argus/backend/plugins/sirenada/model.py +0 -118
- argus/backend/plugins/sirenada/plugin.py +0 -16
- argus/backend/service/admin.py +0 -26
- argus/backend/service/argus_service.py +0 -696
- argus/backend/service/build_system_monitor.py +0 -185
- argus/backend/service/client_service.py +0 -127
- argus/backend/service/event_service.py +0 -18
- argus/backend/service/github_service.py +0 -233
- argus/backend/service/jenkins_service.py +0 -269
- argus/backend/service/notification_manager.py +0 -159
- argus/backend/service/planner_service.py +0 -608
- argus/backend/service/release_manager.py +0 -229
- argus/backend/service/results_service.py +0 -690
- argus/backend/service/stats.py +0 -610
- argus/backend/service/team_manager_service.py +0 -82
- argus/backend/service/test_lookup.py +0 -172
- argus/backend/service/testrun.py +0 -489
- argus/backend/service/user.py +0 -308
- argus/backend/service/views.py +0 -219
- argus/backend/service/views_widgets/__init__.py +0 -0
- argus/backend/service/views_widgets/graphed_stats.py +0 -180
- argus/backend/service/views_widgets/highlights.py +0 -374
- argus/backend/service/views_widgets/nemesis_stats.py +0 -34
- argus/backend/template_filters.py +0 -27
- argus/backend/tests/__init__.py +0 -0
- argus/backend/tests/client_service/__init__.py +0 -0
- argus/backend/tests/client_service/test_submit_results.py +0 -79
- argus/backend/tests/conftest.py +0 -180
- argus/backend/tests/results_service/__init__.py +0 -0
- argus/backend/tests/results_service/test_best_results.py +0 -178
- argus/backend/tests/results_service/test_cell.py +0 -65
- argus/backend/tests/results_service/test_chartjs_additional_functions.py +0 -259
- argus/backend/tests/results_service/test_create_chartjs.py +0 -220
- argus/backend/tests/results_service/test_result_metadata.py +0 -100
- argus/backend/tests/results_service/test_results_service.py +0 -203
- argus/backend/tests/results_service/test_validation_rules.py +0 -213
- argus/backend/tests/view_widgets/__init__.py +0 -0
- argus/backend/tests/view_widgets/test_highlights_api.py +0 -532
- argus/backend/util/common.py +0 -65
- argus/backend/util/config.py +0 -38
- argus/backend/util/encoders.py +0 -56
- argus/backend/util/logsetup.py +0 -80
- argus/backend/util/module_loaders.py +0 -30
- argus/backend/util/send_email.py +0 -91
- argus/client/tests/__init__.py +0 -0
- argus/client/tests/conftest.py +0 -19
- argus/client/tests/test_package.py +0 -45
- argus/client/tests/test_results.py +0 -224
- argus_alm-0.15.2.dist-info/RECORD +0 -122
- {argus_alm-0.15.2.dist-info → argus_alm-0.15.3.dist-info}/WHEEL +0 -0
- {argus_alm-0.15.2.dist-info → argus_alm-0.15.3.dist-info}/entry_points.txt +0 -0
- {argus_alm-0.15.2.dist-info → argus_alm-0.15.3.dist-info}/licenses/LICENSE +0 -0
- {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
|