from types import SimpleNamespace from agent.codex_responses_adapter import _normalize_codex_response def test_normalize_codex_response_drops_transient_rs_tmp_reasoning_items(): response = SimpleNamespace( status="completed", output=[ SimpleNamespace( type="reasoning", id="rs_tmp_123", encrypted_content="opaque-transient", summary=[], ), SimpleNamespace( type="reasoning", id="rs_456", encrypted_content="opaque-stable", summary=[SimpleNamespace(text="stable summary")], ), SimpleNamespace( type="message", role="assistant", status="completed", content=[SimpleNamespace(type="output_text", text="done")], ), ], ) assistant_message, finish_reason = _normalize_codex_response(response) assert finish_reason == "stop" assert assistant_message.content == "done" assert assistant_message.codex_reasoning_items == [ { "type": "reasoning", "encrypted_content": "opaque-stable", "id": "rs_456", "summary": [{"type": "summary_text", "text": "stable summary"}], } ] def test_normalize_codex_response_treats_summary_only_reasoning_as_incomplete(): response = SimpleNamespace( status="completed", output=[ SimpleNamespace( type="reasoning", id="rs_tmp_789", encrypted_content="opaque-transient", summary=[SimpleNamespace(text="still thinking")], ) ], ) assistant_message, finish_reason = _normalize_codex_response(response) assert finish_reason == "incomplete" assert assistant_message.content == "" assert assistant_message.reasoning == "still thinking" assert assistant_message.codex_reasoning_items is None