import pytest from app.gateway.routers.thread_runs import _record_to_response from app.gateway.routers.threads import HistoryEntry, ThreadResponse, ThreadStateResponse from deerflow.runtime.runs.manager import RunRecord from deerflow.runtime.runs.schemas import DisconnectMode, RunStatus from deerflow.runtime.secret_context import ( LegacyRunMetadataSecretError, redact_config_secrets, redact_metadata_secrets, validate_run_metadata_secrets, ) from deerflow.trace_context import DEERFLOW_TRACE_METADATA_KEY @pytest.mark.parametrize("value", ["secret", "", None, {"nested": True}]) def test_validate_run_metadata_rejects_auth_token_key_by_presence(value): with pytest.raises(LegacyRunMetadataSecretError, match=r"config\.context\.secrets"): validate_run_metadata_secrets({"auth_token": value, "token_usage": 7}) @pytest.mark.parametrize( "metadata", [None, "not-a-mapping", {"token": "keep", "nested": {"auth_token": "keep"}}], ) def test_validate_run_metadata_accepts_non_legacy_shapes(metadata): validate_run_metadata_secrets(metadata) def test_redact_metadata_secrets_removes_exact_key_without_mutating_source(): source = { "auth_token": "legacy-secret", "token_usage": 7, "nested": {"auth_token": "ordinary-nested-metadata"}, } redacted = redact_metadata_secrets(source) assert redacted == { "token_usage": 7, "nested": {"auth_token": "ordinary-nested-metadata"}, } assert source["auth_token"] == "legacy-secret" assert redacted is not source def test_redact_config_secrets_hides_legacy_config_metadata_without_mutating_source(): source = { "metadata": { "auth_token": "legacy-secret", "token_usage": 7, "nested": {"auth_token": "ordinary-nested-metadata"}, }, "context": { "secrets": {"MCP_AUTH_TOKEN": "request-secret"}, "model_name": "default", }, } redacted = redact_config_secrets(source) assert redacted == { "metadata": { "token_usage": 7, "nested": {"auth_token": "ordinary-nested-metadata"}, }, "context": {"model_name": "default"}, } assert source["metadata"]["auth_token"] == "legacy-secret" assert source["context"]["secrets"] == {"MCP_AUTH_TOKEN": "request-secret"} assert redacted is not source assert redacted["metadata"] is not source["metadata"] assert redacted["context"] is not source["context"] def test_redact_config_secrets_drops_trace_id_from_metadata_and_context(): """``body.config`` is persisted as ``runs.kwargs_json`` and echoed verbatim by the runs API. ``deerflow_trace_id`` is ignored as an input everywhere else, so echoing a caller-supplied one back would only manufacture disagreement with the response header, the logs, and the run record.""" source = { "metadata": {DEERFLOW_TRACE_METADATA_KEY: "forged-meta", "token_usage": 7}, "context": {DEERFLOW_TRACE_METADATA_KEY: "forged-ctx", "model_name": "default"}, } redacted = redact_config_secrets(source) assert redacted == { "metadata": {"token_usage": 7}, "context": {"model_name": "default"}, } assert source["metadata"][DEERFLOW_TRACE_METADATA_KEY] == "forged-meta" assert source["context"][DEERFLOW_TRACE_METADATA_KEY] == "forged-ctx" def test_run_response_hides_historical_auth_token_without_mutating_record(): legacy_metadata = {"auth_token": "legacy-secret", "token_usage": 7} record = RunRecord( run_id="legacy-run", thread_id="legacy-thread", assistant_id="lead_agent", status=RunStatus.success, on_disconnect=DisconnectMode.cancel, metadata=legacy_metadata, ) response = _record_to_response(record) assert response.metadata == {"token_usage": 7} assert record.metadata["auth_token"] == "legacy-secret" def test_run_response_hides_historical_config_metadata_without_mutating_record(): legacy_config = { "metadata": { "auth_token": "legacy-secret", "token_usage": 7, "nested": {"auth_token": "ordinary-nested-metadata"}, }, "context": { "secrets": {"MCP_AUTH_TOKEN": "request-secret"}, "model_name": "default", }, } record = RunRecord( run_id="legacy-config-run", thread_id="legacy-thread", assistant_id="lead_agent", status=RunStatus.success, on_disconnect=DisconnectMode.cancel, metadata={"token_usage": 7}, kwargs={"input": {}, "config": legacy_config}, ) response = _record_to_response(record) assert response.kwargs["config"] == { "metadata": { "token_usage": 7, "nested": {"auth_token": "ordinary-nested-metadata"}, }, "context": {"model_name": "default"}, } assert record.kwargs["config"]["metadata"]["auth_token"] == "legacy-secret" assert record.kwargs["config"]["context"]["secrets"] == {"MCP_AUTH_TOKEN": "request-secret"} @pytest.mark.parametrize( ("response_class", "required_fields"), [ (ThreadResponse, {"thread_id": "legacy-thread"}), (ThreadStateResponse, {}), (HistoryEntry, {"checkpoint_id": "legacy-checkpoint"}), ], ) def test_thread_metadata_response_models_hide_historical_auth_token( response_class, required_fields, ): source = {"auth_token": "legacy-secret", "token_usage": 7} response = response_class(**required_fields, metadata=source) assert response.metadata == {"token_usage": 7} assert source["auth_token"] == "legacy-secret"