|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
| 3 | +from datetime import datetime, timedelta, timezone |
3 | 4 | from pathlib import Path |
4 | 5 |
|
5 | 6 | import pytest |
|
15 | 16 | evaluate_metric_table_findings, |
16 | 17 | ) |
17 | 18 | from pg_diag.planner import PlannedItem |
| 19 | +from pg_diag.security import json_safe |
18 | 20 | from pg_diag.versioning import select_query_variant |
19 | 21 |
|
20 | 22 |
|
|
43 | 45 | } |
44 | 46 |
|
45 | 47 |
|
| 48 | +@pytest.mark.parametrize(("transform", "expected"), [("delta", 120), ("rate", 4.0)]) |
| 49 | +def test_chart_intervals_accept_serialized_utc_timestamps(transform: str, expected: float) -> None: |
| 50 | + start = datetime(2026, 9, 5, tzinfo=timezone.utc) |
| 51 | + samples = json_safe([ |
| 52 | + {"timestamp": start, "rows": [{"value": 10}]}, |
| 53 | + {"timestamp": start + timedelta(seconds=30), "rows": [{"value": 130}]}, |
| 54 | + ]) |
| 55 | + assert all(sample["timestamp"].endswith("Z") for sample in samples) |
| 56 | + result = build_chart_result( |
| 57 | + {"series": [{"name": "count", "value_ref": "value", "transform": transform}]}, |
| 58 | + samples, |
| 59 | + {}, |
| 60 | + ) |
| 61 | + assert result["series"][0]["points"][-1]["value"] == expected |
| 62 | + assert result["interval_coverage"]["comparable"] == 1 |
| 63 | + |
| 64 | + |
46 | 65 | @pytest.mark.parametrize("entry", [ |
47 | 66 | {"name": "rx", "sample_count": 2, "missing_count": -1}, |
48 | 67 | {"name": "rx", "sample_count": True, "missing_count": 0}, |
|
0 commit comments