优化 CLI 命令,增加获取所有节点和管道属性的功能

This commit is contained in:
2026-06-03 17:31:49 +08:00
parent 233960d8db
commit b7872f29a9
12 changed files with 823 additions and 433 deletions
+89
View File
@@ -269,3 +269,92 @@ def test_runsimulationmanuallybydate_endpoint_rejects_naive_start_time(monkeypat
)
assert response.status_code == 422
def test_valve_close_endpoint_passes_scheme_name(monkeypatch):
module = _load_simulation_module(monkeypatch)
captured = {}
def fake_valve_close_analysis(**kwargs):
captured.update(kwargs)
return "ok"
monkeypatch.setattr(module, "valve_close_analysis", fake_valve_close_analysis)
client = TestClient(build_test_app(module.router, "/api/v1"))
response = client.get(
"/api/v1/valve_close_analysis/",
params={
"network": "demo",
"start_time": "2025-01-02T03:04:05+08:00",
"valves": ["V1", "V2"],
"duration": 900,
"scheme_name": "valve_case_01",
},
)
assert response.status_code == 200
assert response.text == "ok"
assert captured == {
"name": "demo",
"modify_pattern_start_time": "2025-01-02T03:04:05+08:00",
"modify_total_duration": 900,
"modify_valve_opening": {"V1": 0.0, "V2": 0.0},
"scheme_name": "valve_case_01",
}
def test_flushing_endpoint_passes_required_scheme_name(monkeypatch):
module = _load_simulation_module(monkeypatch)
captured = {}
def fake_flushing_analysis(**kwargs):
captured.update(kwargs)
return "ok"
monkeypatch.setattr(module, "flushing_analysis", fake_flushing_analysis)
client = TestClient(build_test_app(module.router, "/api/v1"))
response = client.get(
"/api/v1/flushing_analysis/",
params={
"network": "demo",
"start_time": "2025-01-02T03:04:05+08:00",
"valves": ["V1"],
"valves_k": [0.5],
"drainage_node_ID": "N1",
"flush_flow": 100.0,
"duration": 900,
"scheme_name": "flush_case_01",
},
)
assert response.status_code == 200
assert response.text == "ok"
assert captured == {
"name": "demo",
"modify_pattern_start_time": "2025-01-02T03:04:05+08:00",
"modify_total_duration": 900,
"modify_valve_opening": {"V1": 0.5},
"drainage_node_ID": "N1",
"flushing_flow": 100.0,
"scheme_name": "flush_case_01",
}
def test_contaminant_endpoint_requires_scheme_name(monkeypatch):
module = _load_simulation_module(monkeypatch)
client = TestClient(build_test_app(module.router, "/api/v1"))
response = client.get(
"/api/v1/contaminant_simulation/",
params={
"network": "demo",
"start_time": "2025-01-02T03:04:05+08:00",
"source": "N1",
"concentration": 10.0,
"duration": 900,
},
)
assert response.status_code == 422
+88
View File
@@ -0,0 +1,88 @@
import json
from tests.conftest import install_stub, load_module_from_path
def _load_scenarios_module(monkeypatch):
install_stub(monkeypatch, "app.services", package=True)
install_stub(monkeypatch, "app.algorithms", package=True)
install_stub(monkeypatch, "app.algorithms.simulation", package=True)
install_stub(monkeypatch, "app.services.simulation", {})
install_stub(
monkeypatch,
"app.algorithms.simulation.runner",
{
"run_simulation_ex": lambda *args, **kwargs: json.dumps(
{"output": {"node_results": [], "link_results": []}}
),
"from_clock_to_seconds_2": lambda value: value,
},
)
install_stub(monkeypatch, "app.services.scheme_management", {"store_scheme_info": lambda *args, **kwargs: None})
install_stub(
monkeypatch,
"app.services.tjnetwork",
{
"ChangeSet": type("ChangeSet", (), {}),
"OPTION_DEMAND_MODEL_PDA": "OPTION_DEMAND_MODEL_PDA",
"OPTION_QUALITY_CHEMICAL": "OPTION_QUALITY_CHEMICAL",
"SOURCE_TYPE_SETPOINT": "SOURCE_TYPE_SETPOINT",
"add_pattern": lambda *args, **kwargs: None,
"add_source": lambda *args, **kwargs: None,
"close_project": lambda *args, **kwargs: None,
"copy_project": lambda *args, **kwargs: None,
"delete_project": lambda *args, **kwargs: None,
"get_demand": lambda *args, **kwargs: None,
"get_emitter": lambda *args, **kwargs: None,
"get_node_links": lambda *args, **kwargs: None,
"get_option": lambda *args, **kwargs: None,
"get_pattern": lambda *args, **kwargs: None,
"get_pipe": lambda *args, **kwargs: None,
"get_source": lambda *args, **kwargs: None,
"get_time": lambda *args, **kwargs: None,
"have_project": lambda *args, **kwargs: False,
"is_junction": lambda *args, **kwargs: False,
"is_project_open": lambda *args, **kwargs: False,
"open_project": lambda *args, **kwargs: None,
"set_demand": lambda *args, **kwargs: None,
"set_emitter": lambda *args, **kwargs: None,
"set_option": lambda *args, **kwargs: None,
"set_source": lambda *args, **kwargs: None,
"set_time": lambda *args, **kwargs: None,
},
)
return load_module_from_path(
"tests_age_analysis_scenarios_module",
"app/algorithms/simulation/scenarios.py",
)
def test_age_analysis_passes_duration_by_keyword(monkeypatch):
module = _load_scenarios_module(monkeypatch)
captured = {}
monkeypatch.setattr(module, "copy_project", lambda *args, **kwargs: None)
monkeypatch.setattr(module, "open_project", lambda *args, **kwargs: None)
monkeypatch.setattr(module, "close_project", lambda *args, **kwargs: None)
monkeypatch.setattr(module, "delete_project", lambda *args, **kwargs: None)
monkeypatch.setattr(module, "have_project", lambda *args, **kwargs: False)
monkeypatch.setattr(module, "is_project_open", lambda *args, **kwargs: False)
def fake_run_simulation_ex(*args, **kwargs):
captured["args"] = args
captured["kwargs"] = kwargs
return json.dumps({"output": {"node_results": [], "link_results": []}})
monkeypatch.setattr(module, "run_simulation_ex", fake_run_simulation_ex)
module.age_analysis("demo", "2026-06-03T07:00:00+08:00", 300)
assert captured["args"] == (
"age_Anal_demo",
"realtime",
"2026-06-03T07:00:00+08:00",
)
assert captured["kwargs"] == {
"duration": 300,
"downloading_prohibition": True,
}