mirror of
https://github.com/zvx-echo6/central.git
synced 2026-05-21 18:14:44 +02:00
Merge pull request #49 from zvx-echo6/chore/hermetic-enrichment-cache
chore(M): make enrichment-cache path test-hermetic via conftest autouse fixture
This commit is contained in:
commit
69dddd0240
2 changed files with 51 additions and 2 deletions
|
|
@ -13,6 +13,25 @@ from unittest.mock import AsyncMock, MagicMock, patch
|
||||||
from central.bootstrap_config import Settings
|
from central.bootstrap_config import Settings
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def isolate_enrichment_cache(tmp_path, monkeypatch):
|
||||||
|
"""Redirect the supervisor's enrichment cache off the production path.
|
||||||
|
|
||||||
|
`central.supervisor.ENRICHMENT_CACHE_DB_PATH` defaults to
|
||||||
|
/var/lib/central/enrichment_cache.db. Constructing a Supervisor opens it,
|
||||||
|
so without this fixture the suite writes to (or, for any user without write
|
||||||
|
access to /var/lib/central, fails on) the live cache. Point it at a
|
||||||
|
per-test temp dir so no test ever touches the production path.
|
||||||
|
"""
|
||||||
|
import central.supervisor as supervisor_mod
|
||||||
|
|
||||||
|
monkeypatch.setattr(
|
||||||
|
supervisor_mod,
|
||||||
|
"ENRICHMENT_CACHE_DB_PATH",
|
||||||
|
tmp_path / "enrichment_cache.db",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
def event_loop():
|
def event_loop():
|
||||||
"""Create an event loop for the test session."""
|
"""Create an event loop for the test session."""
|
||||||
|
|
|
||||||
|
|
@ -139,12 +139,18 @@ class MockNWSAdapter:
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_nats():
|
def mock_nats():
|
||||||
"""Mock NATS connection."""
|
"""Mock NATS connection.
|
||||||
|
|
||||||
|
nats-py's `nc.jetstream()` is synchronous, so model it with a sync
|
||||||
|
MagicMock. (As an AsyncMock attribute, `supervisor._js = nc.jetstream()`
|
||||||
|
would assign an unawaited coroutine — the "coroutine ... was never awaited"
|
||||||
|
warning — rather than the JetStream mock.)
|
||||||
|
"""
|
||||||
mock_nc = AsyncMock()
|
mock_nc = AsyncMock()
|
||||||
mock_nc.publish = AsyncMock()
|
mock_nc.publish = AsyncMock()
|
||||||
mock_js = AsyncMock()
|
mock_js = AsyncMock()
|
||||||
mock_js.publish = AsyncMock()
|
mock_js.publish = AsyncMock()
|
||||||
mock_nc.jetstream.return_value = mock_js
|
mock_nc.jetstream = MagicMock(return_value=mock_js)
|
||||||
return mock_nc
|
return mock_nc
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -574,3 +580,27 @@ class TestEnableDisableEnableIntegration:
|
||||||
|
|
||||||
# State should be gone
|
# State should be gone
|
||||||
assert "nws" not in supervisor._adapter_states
|
assert "nws" not in supervisor._adapter_states
|
||||||
|
|
||||||
|
|
||||||
|
def test_enrichment_cache_path_is_hermetic(mock_config_store, tmp_path: Path) -> None:
|
||||||
|
"""No test may touch the production enrichment cache.
|
||||||
|
|
||||||
|
The autouse `isolate_enrichment_cache` fixture (conftest) must redirect
|
||||||
|
ENRICHMENT_CACHE_DB_PATH off /var/lib/central onto a per-test temp dir, and
|
||||||
|
constructing a Supervisor must open the cache there — not in production.
|
||||||
|
"""
|
||||||
|
import central.supervisor as supervisor_mod
|
||||||
|
|
||||||
|
patched = supervisor_mod.ENRICHMENT_CACHE_DB_PATH
|
||||||
|
assert tmp_path in patched.parents
|
||||||
|
assert "/var/lib/central" not in str(patched)
|
||||||
|
|
||||||
|
supervisor = supervisor_mod.Supervisor(
|
||||||
|
config_source=MockConfigSource(),
|
||||||
|
config_store=mock_config_store,
|
||||||
|
nats_url="nats://localhost:4222",
|
||||||
|
cloudevents_config=None,
|
||||||
|
)
|
||||||
|
# __init__ opened the cache at the temp path, leaving the db file behind.
|
||||||
|
assert patched.exists()
|
||||||
|
assert supervisor._enrichment_cache is not None
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue