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()