"""Agent build timing must not move work out of its original task context.""" import logging from contextvars import ContextVar import pytest from deerflow.runtime.runs import worker @pytest.mark.parametrize("supports_app_config", [False, True]) def test_build_preserves_config_and_contextvars(monkeypatch, caplog, supports_app_config): clock = iter([10.0, 10.6]) monkeypatch.setattr(worker, "perf_counter", lambda: next(clock)) state = ContextVar("test_build_context", default="before") config = {"configurable": {"test": True}} app_config = object() agent = object() def modern_factory(*, config, app_config): assert config is expected_config assert app_config is expected_app_config state.set("after") return agent def legacy_factory(*, config): assert config is expected_config state.set("after") return agent expected_config, expected_app_config = config, app_config factory = modern_factory if supports_app_config else legacy_factory with caplog.at_level(logging.DEBUG): assert worker._build_agent_with_timing(factory, config, app_config, "test-run") is agent assert state.get() == "after" assert "AGENT_BUILD_TIMING run_id=test-run outcome=ok elapsed_ms=600.00" in caplog.text assert caplog.records[-1].levelno == logging.WARNING def test_build_failure_preserves_exception_and_does_not_log_content(monkeypatch, caplog): clock = iter([10.0, 10.1]) monkeypatch.setattr(worker, "perf_counter", lambda: next(clock)) failure = ValueError("private prompt must not appear in timing logs") def factory(*, config): raise failure with caplog.at_level(logging.DEBUG), pytest.raises(ValueError) as captured: worker._build_agent_with_timing(factory, {}, None, "failed-run") assert captured.value is failure assert "outcome=error elapsed_ms=100.00" in caplog.text assert "private prompt" not in caplog.text assert caplog.records[-1].levelno == logging.DEBUG def test_build_timing_handler_failure_does_not_replace_factory_error(monkeypatch): failure = ValueError("factory failed") def factory(*, config): raise failure def broken_log(*args, **kwargs): raise RuntimeError("log handler failed") monkeypatch.setattr(worker.logger, "debug", broken_log) monkeypatch.setattr(worker.logger, "warning", broken_log) with pytest.raises(ValueError) as captured: worker._build_agent_with_timing(factory, {}, None, "failed-run") assert captured.value is failure