Files
rfcp/backend/tests/test_integration/test_engine.py
mytec defa3ad440 @mytec: feat: Phase 3.0 Architecture Refactor
Major refactoring of RFCP backend:
- Modular propagation models (8 models)
- SharedMemoryManager for terrain data
- ProcessPoolExecutor parallel processing
- WebSocket progress streaming
- Building filtering pipeline (351k → 15k)
- 82 unit tests

Performance: Standard preset 38s → 5s (7.6x speedup)

Known issue: Detailed preset timeout (fix in 3.1.0)
2026-02-01 23:12:26 +02:00

116 lines
3.9 KiB
Python

"""
Integration tests for the CoverageEngine orchestrator.
Tests model selection, available models API, and the
engine's coordination logic (without running actual
coverage calculations, which require terrain data).
"""
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
from app.core.engine import CoverageEngine, BandType, PresetType, CoverageSettings
class TestEngineModelSelection:
def test_lte_urban_uses_cost231(self):
engine = CoverageEngine()
model = engine.select_model(BandType.LTE, "urban")
assert model.name == "COST-231-Hata"
def test_lte_suburban_uses_okumura(self):
engine = CoverageEngine()
model = engine.select_model(BandType.LTE, "suburban")
assert model.name == "Okumura-Hata"
def test_lte_open_uses_fspl(self):
engine = CoverageEngine()
model = engine.select_model(BandType.LTE, "open")
assert model.name == "Free-Space"
def test_uhf_urban_uses_okumura(self):
engine = CoverageEngine()
model = engine.select_model(BandType.UHF, "urban")
assert model.name == "Okumura-Hata"
def test_uhf_rural_uses_longley_rice(self):
engine = CoverageEngine()
model = engine.select_model(BandType.UHF, "rural")
assert model.name == "Longley-Rice"
def test_vhf_urban_uses_p1546(self):
engine = CoverageEngine()
model = engine.select_model(BandType.VHF, "urban")
assert model.name == "ITU-R-P.1546"
def test_vhf_rural_uses_longley_rice(self):
engine = CoverageEngine()
model = engine.select_model(BandType.VHF, "rural")
assert model.name == "Longley-Rice"
def test_unknown_band_falls_back(self):
engine = CoverageEngine()
model = engine.select_model(BandType.CUSTOM, "desert")
assert model is not None # Should not crash
class TestEngineModelsAPI:
def test_returns_dict(self):
engine = CoverageEngine()
models = engine.get_available_models()
assert isinstance(models, dict)
assert len(models) >= 5
def test_model_info_structure(self):
engine = CoverageEngine()
models = engine.get_available_models()
for name, info in models.items():
assert "frequency_range" in info
assert "distance_range" in info
assert "bands" in info
assert len(info["bands"]) > 0
def test_all_expected_models_present(self):
engine = CoverageEngine()
models = engine.get_available_models()
expected = {"COST-231-Hata", "Okumura-Hata", "Free-Space", "Longley-Rice", "ITU-R-P.1546"}
assert expected.issubset(set(models.keys()))
class TestCoverageSettings:
def test_default_settings(self):
s = CoverageSettings()
assert s.radius == 10000
assert s.resolution == 200
assert s.preset == PresetType.STANDARD
assert s.band_type == BandType.LTE
def test_preset_values(self):
assert PresetType.FAST.value == "fast"
assert PresetType.STANDARD.value == "standard"
assert PresetType.DETAILED.value == "detailed"
assert PresetType.FULL.value == "full"
def test_band_type_values(self):
assert BandType.LTE.value == "lte"
assert BandType.UHF.value == "uhf"
assert BandType.VHF.value == "vhf"
if __name__ == "__main__":
for cls_name, cls in [
("ModelSelection", TestEngineModelSelection),
("ModelsAPI", TestEngineModelsAPI),
("CoverageSettings", TestCoverageSettings),
]:
instance = cls()
for method_name in [m for m in dir(instance) if m.startswith("test_")]:
try:
getattr(instance, method_name)()
print(f" PASS {cls_name}.{method_name}")
except Exception as e:
print(f" FAIL {cls_name}.{method_name}: {e}")
print("\nAll tests completed.")