Skip to content

Commit 7308409

Browse files
tests: add integration tests for get_region in grass.jupyter
1 parent fce1d2f commit 7308409

2 files changed

Lines changed: 66 additions & 0 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,7 @@ addopts = """
533533
markers = [
534534
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
535535
"needs_solo_run: marks tests that must be run without any other tests running in parallel",
536+
"integration: marks tests requiring a live compiled GRASS environment",
536537
]
537538
minversion = "8.2"
538539
python_files = """
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""Integration tests for grass.jupyter.utils.get_region()"""
2+
3+
import pytest
4+
import grass.script as gs
5+
from grass.jupyter.utils import get_region
6+
7+
REGION_KEYS = ["north", "south", "east", "west", "nsres", "ewres"]
8+
9+
10+
@pytest.mark.integration
11+
def test_get_region_returns_dict(session):
12+
"""get_region() must return a dict."""
13+
result = get_region(env=session.env)
14+
assert isinstance(result, dict), f"Expected dict, got {type(result).__name__}"
15+
16+
17+
@pytest.mark.integration
18+
def test_get_region_has_required_keys(session):
19+
"""get_region() must contain all six geographic keys."""
20+
result = get_region(env=session.env)
21+
missing = [k for k in REGION_KEYS if k not in result]
22+
assert not missing, f"Missing keys: {missing}"
23+
24+
25+
@pytest.mark.integration
26+
def test_get_region_values_are_numeric(session):
27+
"""All geographic values in the region dict must be numeric."""
28+
result = get_region(env=session.env)
29+
non_numeric = {
30+
k: result[k] for k in REGION_KEYS if not isinstance(result[k], (int, float))
31+
}
32+
assert not non_numeric, f"Non-numeric values: {non_numeric}"
33+
34+
35+
@pytest.mark.integration
36+
def test_get_region_geographic_sanity(session):
37+
"""North > South, East > West, resolutions positive."""
38+
r = get_region(env=session.env)
39+
assert r["north"] > r["south"], f"north={r['north']} is not > south={r['south']}"
40+
assert r["east"] > r["west"], f"east={r['east']} is not > west={r['west']}"
41+
assert r["nsres"] > 0, f"nsres={r['nsres']} is not positive"
42+
assert r["ewres"] > 0, f"ewres={r['ewres']} is not positive"
43+
44+
45+
@pytest.mark.integration
46+
def test_get_region_reflects_live_state(session):
47+
"""get_region() must return current region, not a cached snapshot."""
48+
gs.run_command("g.region", n=60, s=50, e=30, w=10, res=1, env=session.env)
49+
r = get_region(env=session.env)
50+
assert abs(r["north"] - 60) < 1e-6, f"Expected north=60, got {r['north']}"
51+
assert abs(r["south"] - 50) < 1e-6, f"Expected south=50, got {r['south']}"
52+
assert abs(r["east"] - 30) < 1e-6, f"Expected east=30, got {r['east']}"
53+
assert abs(r["west"] - 10) < 1e-6, f"Expected west=10, got {r['west']}"
54+
55+
56+
@pytest.mark.integration
57+
def test_get_region_is_read_only(session):
58+
"""Calling get_region() must not modify the active GRASS region."""
59+
before = gs.region(env=session.env)
60+
get_region(env=session.env)
61+
after = gs.region(env=session.env)
62+
for key in ("n", "s", "e", "w", "nsres", "ewres"):
63+
assert before[key] == after[key], (
64+
f"get_region() changed '{key}': {before[key]} -> {after[key]}"
65+
)

0 commit comments

Comments
 (0)