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]