from __future__ import annotations
from pathlib import Path
from unittest.mock import MagicMock
import pytest
from wolfhece._builtin_plugins.dtm_wallonia_1m.companion import DtmWallonia1mCompanion
import wolfhece.services.dtm_wallonia as dtm_wallonia
@pytest.fixture
[docs]
def companion():
viewer = MagicMock()
c = DtmWallonia1mCompanion()
c.proxy.attach(viewer)
c._dtm_service = None
c._load_count = 0
return c
[docs]
class TestDtmWallonia1mCompanionUnit:
[docs]
def test_ensure_service_caches_instance(self, monkeypatch, companion):
created = []
class FakeService:
pass
def _factory():
svc = FakeService()
created.append(svc)
return svc
monkeypatch.setattr(dtm_wallonia, 'DtmWalloniaService', _factory)
first = companion._ensure_service()
second = companion._ensure_service()
assert first is second
assert len(created) == 1
companion.proxy._viewer.set_statusbar_text.assert_called_once()
[docs]
def test_download_index_uses_service(self, companion):
fake_service = MagicMock()
fake_service.force_download_index.return_value = Path('idx.shp')
companion._dtm_service = fake_service
companion._do_download_index()
fake_service.force_download_index.assert_called_once_with()
assert companion.proxy._viewer.set_statusbar_text.call_count == 2
[docs]
def test_get_dtm_1m_delegates_to_service(self, companion):
fake_service = MagicMock()
fake_bounds = object()
fake_result = object()
fake_service.get_dtm_1m.return_value = fake_result
companion._dtm_service = fake_service
result = companion.get_dtm_1m(fake_bounds, force=True)
assert result is fake_result
fake_service.get_dtm_1m.assert_called_once_with(fake_bounds, force=True)
[docs]
def test_get_dtm_1m_xx_yy_delegates_to_service(self, companion):
fake_service = MagicMock()
fake_result = object()
fake_service.get_dtm_1m_xx_yy.return_value = fake_result
companion._dtm_service = fake_service
result = companion.get_dtm_1m_xx_yy(1.0, 5.0, 2.0, 8.0, force=True)
assert result is fake_result
fake_service.get_dtm_1m_xx_yy.assert_called_once_with(
xmin=1.0,
xmax=5.0,
ymin=2.0,
ymax=8.0,
force=True,
)
[docs]
def test_get_dtm_2m_rebins_result(self, monkeypatch, companion):
fake_bounds = object()
fake_dtm_1m = MagicMock()
fake_dtm_2m = object()
fake_dtm_1m.rebin.return_value = fake_dtm_2m
monkeypatch.setattr(companion, 'get_dtm_1m', MagicMock(return_value=fake_dtm_1m))
result = companion.get_dtm_2m(fake_bounds, force=True)
assert result is fake_dtm_2m
companion.get_dtm_1m.assert_called_once_with(fake_bounds, force=True)
fake_dtm_1m.rebin.assert_called_once_with(factor=2, operation='mean')
[docs]
def test_load_from_zoom_adds_array_layer(self, monkeypatch, companion):
fake_array = object()
companion.proxy._viewer.get_current_zoom.return_value = {
'xmin': 1.0,
'xmax': 5.0,
'ymin': 2.0,
'ymax': 8.0,
}
monkeypatch.setattr(companion, 'get_dtm_1m', MagicMock(return_value=fake_array))
companion._do_load_from_zoom(force=False)
companion.get_dtm_1m.assert_called_once()
companion.proxy._viewer.add_object.assert_called_once_with(
'array',
newobj=fake_array,
ToCheck=True,
id='DTM_Wallonia_1',
)