Make geo lookups non-blocking with bulk DB writes and background tasks
This commit is contained in:
@@ -472,6 +472,83 @@ class TestGetActiveBans:
|
||||
assert result.total == 1
|
||||
assert result.bans[0].jail == "sshd"
|
||||
|
||||
async def test_http_session_triggers_lookup_batch(self) -> None:
|
||||
"""When http_session is provided, geo_service.lookup_batch is used."""
|
||||
from app.services.geo_service import GeoInfo
|
||||
|
||||
responses = {
|
||||
"status": _make_global_status("sshd"),
|
||||
"get|sshd|banip|--with-time": (
|
||||
0,
|
||||
["1.2.3.4 \t2025-01-01 12:00:00 + 3600 = 2025-01-01 13:00:00"],
|
||||
),
|
||||
}
|
||||
mock_geo = {"1.2.3.4": GeoInfo(country_code="DE", country_name="Germany", asn="AS1", org="ISP")}
|
||||
|
||||
with (
|
||||
_patch_client(responses),
|
||||
patch(
|
||||
"app.services.geo_service.lookup_batch",
|
||||
new=AsyncMock(return_value=mock_geo),
|
||||
) as mock_batch,
|
||||
):
|
||||
mock_session = AsyncMock()
|
||||
result = await jail_service.get_active_bans(
|
||||
_SOCKET, http_session=mock_session
|
||||
)
|
||||
|
||||
mock_batch.assert_awaited_once()
|
||||
assert result.total == 1
|
||||
assert result.bans[0].country == "DE"
|
||||
|
||||
async def test_http_session_batch_failure_graceful(self) -> None:
|
||||
"""When lookup_batch raises, get_active_bans returns bans without geo."""
|
||||
responses = {
|
||||
"status": _make_global_status("sshd"),
|
||||
"get|sshd|banip|--with-time": (
|
||||
0,
|
||||
["1.2.3.4 \t2025-01-01 12:00:00 + 3600 = 2025-01-01 13:00:00"],
|
||||
),
|
||||
}
|
||||
|
||||
with (
|
||||
_patch_client(responses),
|
||||
patch(
|
||||
"app.services.geo_service.lookup_batch",
|
||||
new=AsyncMock(side_effect=RuntimeError("geo down")),
|
||||
),
|
||||
):
|
||||
mock_session = AsyncMock()
|
||||
result = await jail_service.get_active_bans(
|
||||
_SOCKET, http_session=mock_session
|
||||
)
|
||||
|
||||
assert result.total == 1
|
||||
assert result.bans[0].country is None
|
||||
|
||||
async def test_geo_enricher_still_used_without_http_session(self) -> None:
|
||||
"""Legacy geo_enricher is still called when http_session is not provided."""
|
||||
from app.services.geo_service import GeoInfo
|
||||
|
||||
responses = {
|
||||
"status": _make_global_status("sshd"),
|
||||
"get|sshd|banip|--with-time": (
|
||||
0,
|
||||
["1.2.3.4 \t2025-01-01 12:00:00 + 3600 = 2025-01-01 13:00:00"],
|
||||
),
|
||||
}
|
||||
|
||||
async def _enricher(ip: str) -> GeoInfo | None:
|
||||
return GeoInfo(country_code="JP", country_name="Japan", asn=None, org=None)
|
||||
|
||||
with _patch_client(responses):
|
||||
result = await jail_service.get_active_bans(
|
||||
_SOCKET, geo_enricher=_enricher
|
||||
)
|
||||
|
||||
assert result.total == 1
|
||||
assert result.bans[0].country == "JP"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Ignore list
|
||||
|
||||
Reference in New Issue
Block a user