164 lines
4.6 KiB
Python
164 lines
4.6 KiB
Python
from app.native.wndb.gis import network_views, region_geometry
|
|
from app.native.wndb.model import elements
|
|
|
|
|
|
def test_network_node_coords_use_one_unified_view_query(monkeypatch) -> None:
|
|
calls = []
|
|
|
|
def fake_read_all(name, statement, params=None):
|
|
calls.append((name, statement, params))
|
|
return [
|
|
{"id": "J-1", "x": 10.5, "y": 20.5, "node_type": "junction"},
|
|
{"id": "R-1", "x": 30.0, "y": 40.0, "node_type": "reservoir"},
|
|
]
|
|
|
|
monkeypatch.setattr(network_views, "read_all", fake_read_all)
|
|
|
|
assert network_views.get_network_node_coords("project_a") == {
|
|
"J-1": {"x": 10.5, "y": 20.5, "type": "junction"},
|
|
"R-1": {"x": 30.0, "y": 40.0, "type": "reservoir"},
|
|
}
|
|
assert len(calls) == 1
|
|
assert "FROM gis.network_nodes" in calls[0][1]
|
|
|
|
|
|
def test_network_link_nodes_use_one_unified_view_query(monkeypatch) -> None:
|
|
calls = []
|
|
|
|
def fake_read_all(name, statement, params=None):
|
|
calls.append((name, statement, params))
|
|
return [
|
|
{
|
|
"id": "P-1",
|
|
"link_type": "pipe",
|
|
"start_node_id": "J-1",
|
|
"end_node_id": "J-2",
|
|
},
|
|
{
|
|
"id": "PU-1",
|
|
"link_type": "pump",
|
|
"start_node_id": "R-1",
|
|
"end_node_id": "J-1",
|
|
},
|
|
]
|
|
|
|
monkeypatch.setattr(network_views, "read_all", fake_read_all)
|
|
|
|
assert network_views.get_network_link_nodes("project_a") == [
|
|
"P-1:pipe:J-1:J-2",
|
|
"PU-1:pump:R-1:J-1",
|
|
]
|
|
assert len(calls) == 1
|
|
assert "FROM gis.network_links" in calls[0][1]
|
|
|
|
|
|
def test_topology_rows_are_loaded_in_two_batch_queries(monkeypatch) -> None:
|
|
calls = []
|
|
responses = [
|
|
[{"id": "J-1", "x": 1.0, "y": 2.0, "node_type": "junction"}],
|
|
[
|
|
{
|
|
"id": "P-1",
|
|
"start_node_id": "J-1",
|
|
"end_node_id": "J-2",
|
|
"length": 12.5,
|
|
}
|
|
],
|
|
]
|
|
|
|
def fake_read_all(name, statement, params=None):
|
|
calls.append((name, statement, params))
|
|
return responses[len(calls) - 1]
|
|
|
|
monkeypatch.setattr(network_views, "read_all", fake_read_all)
|
|
|
|
nodes, links = network_views.get_topology_rows("project_a", ["J-1", "J-2"])
|
|
|
|
assert nodes == responses[0]
|
|
assert links == responses[1]
|
|
assert len(calls) == 2
|
|
assert "FROM network.nodes" in calls[0][1]
|
|
assert "FROM network.links" in calls[1][1]
|
|
assert "LEFT JOIN network.pipes" in calls[1][1]
|
|
|
|
|
|
def test_topology_builds_adjacency_from_batch_rows(monkeypatch) -> None:
|
|
monkeypatch.setattr(
|
|
region_geometry,
|
|
"get_topology_rows",
|
|
lambda _name, _node_ids: (
|
|
[
|
|
{"id": "J-1", "x": 1.0, "y": 2.0, "node_type": "junction"},
|
|
{"id": "R-1", "x": 3.0, "y": 4.0, "node_type": "reservoir"},
|
|
],
|
|
[
|
|
{
|
|
"id": "P-1",
|
|
"start_node_id": "J-1",
|
|
"end_node_id": "R-1",
|
|
"length": 20.0,
|
|
}
|
|
],
|
|
),
|
|
)
|
|
|
|
topology = region_geometry.Topology("project_a", ["J-1", "R-1"])
|
|
|
|
assert topology.max_x_node() == "R-1"
|
|
assert topology.nodes()["J-1"] == {
|
|
"x": 1.0,
|
|
"y": 2.0,
|
|
"type": "junction",
|
|
"links": ["P-1"],
|
|
}
|
|
assert topology.links()["P-1"] == {
|
|
"node1": "J-1",
|
|
"node2": "R-1",
|
|
"length": 20.0,
|
|
}
|
|
|
|
|
|
def test_junction_demands_are_mapped_from_authoritative_table(monkeypatch) -> None:
|
|
monkeypatch.setattr(
|
|
network_views,
|
|
"read_all",
|
|
lambda _name, _statement, _params: [
|
|
{
|
|
"junction_id": "J-1",
|
|
"sequence_no": 0,
|
|
"base_demand": 3.5,
|
|
"pattern_id": "PAT-1",
|
|
"category": None,
|
|
}
|
|
],
|
|
)
|
|
|
|
assert network_views.get_junction_demands("project_a", ["J-1"]) == {
|
|
"J-1": [
|
|
{"demand": 3.5, "pattern": "PAT-1", "category": None}
|
|
]
|
|
}
|
|
|
|
|
|
def test_all_node_links_scan_the_unified_view_once(monkeypatch) -> None:
|
|
calls = []
|
|
|
|
def fake_read_all_typed(name, statement, params):
|
|
calls.append((name, statement, params))
|
|
return [
|
|
{
|
|
"id": "P-1",
|
|
"start_node_id": "J-1",
|
|
"end_node_id": "J-2",
|
|
}
|
|
]
|
|
|
|
monkeypatch.setattr(elements, "read_all_typed", fake_read_all_typed)
|
|
|
|
assert elements.get_all_node_links("project_a") == {
|
|
"J-1": ["P-1"],
|
|
"J-2": ["P-1"],
|
|
}
|
|
assert len(calls) == 1
|
|
assert "FROM gis.network_links" in calls[0][1]
|