Explorer
/opt/struktur/worker-watcher/tests/integration/test_isolation.py
← Zurück ↓ Download
from unittest.mock import patch

from worker_watcher.config import AppConfig, CollectorConfig, WatcherConfig
from worker_watcher.db.repositories import WatcherRepository
from worker_watcher.watcher import Watcher


def test_failed_collector_does_not_stop_next_collector(tmp_path) -> None:
    config = AppConfig(WatcherConfig(database_path=tmp_path / "isolation.sqlite"),
                       (CollectorConfig("broken", "not-a-real-collector"), CollectorConfig("generic", "generic_worker")))
    watcher = Watcher(config, tmp_path)
    try:
        result = watcher.run_once()
        assert result.collectors_total == 2
        assert result.collectors_failed == 1
        assert result.observations_created == 0
        assert watcher.repository.collector_rows(2)[0]["success"] in (0, 1)
        assert watcher.connection.execute("SELECT event_type FROM watcher_events").fetchone()[0] == "collector_failed"
    finally:
        watcher.close()


def test_health_reflects_job_failure_even_when_collectors_succeed(tmp_path) -> None:
    config = AppConfig(WatcherConfig(database_path=tmp_path / "health.sqlite"),
                       (CollectorConfig("generic", "generic_worker"),))
    watcher = Watcher(config, tmp_path)
    try:
        summary = {"jobs_total": 1, "jobs_healthy": 0, "jobs_degraded": 0, "jobs_failed": 1,
                   "jobs_stale": 0, "jobs_unknown": 0}
        with patch.object(WatcherRepository, "summary", return_value=summary):
            assert watcher.health()["watcher_status"] == "degraded"
    finally:
        watcher.close()