from pathlib import Path import importlib.util import sys import geopandas as gpd from shapely.geometry import LineString, Point SCRIPTS = Path(__file__).resolve().parents[1] / "scripts" sys.path.insert(0, str(SCRIPTS)) from flow_network import FlowNetwork # noqa: E402 BUILD_SCRIPT = SCRIPTS / "07_build_flow_network.py" spec = importlib.util.spec_from_file_location("build_flow_network", BUILD_SCRIPT) build_flow_network = importlib.util.module_from_spec(spec) assert spec.loader is not None spec.loader.exec_module(build_flow_network) build_binational_edges = build_flow_network.build_binational_edges def test_cross_border_path_emerson(): net = FlowNetwork([("ca_up", "border_emerson"), ("border_emerson", "us_down")]) assert "ca_up" in net.upstream_reaches("us_down") def test_real_layers_exist_after_build(): import os if os.environ.get("RUN_NETWORK_INTEGRATION") != "1": return layers = Path(__file__).resolve().parents[1] / "layers" assert (layers / "hydro_edges.parquet").exists() or any(layers.glob("*hydro*")) def test_build_binational_edges_links_canadian_and_us_arcs_at_emerson(): canada = gpd.GeoDataFrame( {"source_reach_id": ["ca_mainstem"], "source_name": ["Red River"]}, geometry=[LineString([(-97.2, 49.2), (-97.2, 49.0)])], crs="EPSG:4326", ) united_states = gpd.GeoDataFrame( {"source_reach_id": ["us_mainstem"], "source_name": ["Red River"]}, geometry=[LineString([(-97.2, 49.0), (-97.2, 48.8)])], crs="EPSG:4326", ) edges = build_binational_edges(canada, united_states, border_point=(-97.2, 49.0)) graph = FlowNetwork(zip(edges["from_node"], edges["to_node"])) assert "ca_mainstem:start" in graph.upstream_reaches("us_mainstem:end") assert bool(edges.loc[edges["edge_id"].eq("border_emerson"), "border_crossing"].iloc[0]) def test_build_binational_edges_accepts_nhdplus_point_directions(): canada = gpd.GeoDataFrame( {"source_reach_id": ["ca_mainstem"]}, geometry=[LineString([(-97.2, 49.1), (-97.2, 49.0)])], crs="EPSG:4326", ) united_states = gpd.GeoDataFrame( {"comid": [101], "angle_direction": [180]}, geometry=[Point(-97.2, 48.99)], crs="EPSG:4326", ) edges = build_binational_edges(canada, united_states, border_point=(-97.2, 49.0)) us_edge = edges.loc[edges["source_reach_id"].eq("101")].iloc[0] assert us_edge.geometry.geom_type == "LineString" assert us_edge.from_node == "101:start"