统一前后端时间时区请求
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
from pathlib import Path
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
@@ -7,10 +8,39 @@ from tests.conftest import build_test_app, install_stub, load_module_from_path
|
||||
|
||||
def _load_simulation_module(monkeypatch):
|
||||
install_stub(monkeypatch, "app.services", package=True)
|
||||
def parse_aware_time(value, field_name="datetime"):
|
||||
dt = datetime.fromisoformat(str(value).replace("Z", "+00:00"))
|
||||
if dt.tzinfo is None:
|
||||
raise ValueError(f"{field_name} is missing timezone information.")
|
||||
return dt
|
||||
|
||||
def parse_utc_time(value, field_name="datetime"):
|
||||
return parse_aware_time(value, field_name=field_name).astimezone(
|
||||
timezone.utc
|
||||
)
|
||||
|
||||
install_stub(
|
||||
monkeypatch,
|
||||
"app.services.time_api",
|
||||
{
|
||||
"parse_aware_time": parse_aware_time,
|
||||
"parse_utc_time": parse_utc_time,
|
||||
},
|
||||
)
|
||||
install_stub(
|
||||
monkeypatch,
|
||||
"app.services.simulation",
|
||||
{"run_simulation": lambda **kwargs: None},
|
||||
{
|
||||
"run_simulation": lambda **kwargs: None,
|
||||
"query_corresponding_element_id_and_query_id": lambda name: None,
|
||||
"query_corresponding_pattern_id_and_query_id": lambda name: None,
|
||||
"query_non_realtime_region": lambda name: [],
|
||||
"get_source_outflow_region_id": lambda name, region_result: {},
|
||||
"query_realtime_region_pipe_flow_and_demand_id": lambda name, region_result: {},
|
||||
"query_pipe_flow_region_patterns": lambda name: {},
|
||||
"query_non_realtime_region_patterns": lambda name, region_result: {},
|
||||
"get_realtime_region_patterns": lambda name, source_outflow_region_id, realtime_region_pipe_flow_and_demand_id: ({}, {}),
|
||||
},
|
||||
)
|
||||
install_stub(monkeypatch, "app.services.globals", {})
|
||||
install_stub(
|
||||
@@ -173,3 +203,69 @@ def test_network_update_surfaces_service_error(monkeypatch, tmp_path):
|
||||
assert response.status_code == 500
|
||||
assert "数据库操作失败: write failed" in response.json()["detail"]
|
||||
assert list(Path(tmp_path).glob("network_update_*"))
|
||||
|
||||
|
||||
def test_run_simulation_manually_by_date_uses_utc_aware_timestamps(monkeypatch):
|
||||
module = _load_simulation_module(monkeypatch)
|
||||
captured_calls = []
|
||||
|
||||
monkeypatch.setattr(
|
||||
module.simulation,
|
||||
"run_simulation",
|
||||
lambda **kwargs: captured_calls.append(kwargs),
|
||||
)
|
||||
|
||||
module.run_simulation_manually_by_date(
|
||||
"demo",
|
||||
datetime(2025, 1, 1, 19, 4, 5, tzinfo=timezone.utc),
|
||||
30,
|
||||
)
|
||||
|
||||
assert [call["modify_pattern_start_time"] for call in captured_calls] == [
|
||||
"2025-01-01T19:04:05+00:00",
|
||||
"2025-01-01T19:19:05+00:00",
|
||||
]
|
||||
|
||||
|
||||
def test_runsimulationmanuallybydate_endpoint_accepts_timezone_aware_start_time(monkeypatch):
|
||||
module = _load_simulation_module(monkeypatch)
|
||||
captured = {}
|
||||
|
||||
def fake_run(network_name, start_time, duration):
|
||||
captured["network_name"] = network_name
|
||||
captured["start_time"] = start_time
|
||||
captured["duration"] = duration
|
||||
|
||||
monkeypatch.setattr(module, "run_simulation_manually_by_date", fake_run)
|
||||
client = TestClient(build_test_app(module.router, "/api/v1"))
|
||||
|
||||
response = client.post(
|
||||
"/api/v1/runsimulationmanuallybydate/",
|
||||
json={
|
||||
"name": "demo",
|
||||
"start_time": "2025-01-02T03:04:05+08:00",
|
||||
"duration": 30,
|
||||
},
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.json() == {"status": "success"}
|
||||
assert captured["network_name"] == "demo"
|
||||
assert captured["duration"] == 30
|
||||
assert captured["start_time"].isoformat() == "2025-01-01T19:04:05+00:00"
|
||||
|
||||
|
||||
def test_runsimulationmanuallybydate_endpoint_rejects_naive_start_time(monkeypatch):
|
||||
module = _load_simulation_module(monkeypatch)
|
||||
client = TestClient(build_test_app(module.router, "/api/v1"))
|
||||
|
||||
response = client.post(
|
||||
"/api/v1/runsimulationmanuallybydate/",
|
||||
json={
|
||||
"name": "demo",
|
||||
"start_time": "2025-01-02T03:04:05",
|
||||
"duration": 30,
|
||||
},
|
||||
)
|
||||
|
||||
assert response.status_code == 422
|
||||
|
||||
Reference in New Issue
Block a user