test: repair full suite — hang fix, stale-test updates, patch hygiene, timeout backstop

Suite went from 27 failures plus one permanent hang (never finished) to
1846 passed / 0 failed in ~85s, including under FORCE_COLOR.

- office_shutdown_lifecycle: construct WSHandler via the real __init__
  (helper) instead of hand-copied __new__ stubs that drift from the
  constructor (#11 added _runtime_status_sync_task and the stubs hung);
  the formerly-hanging wait now has a 5s wait_for.
- import-time patch hygiene: company_recruiter / company_reorg /
  engine_session_defaults replaced module-level permanent
  tempfile.TemporaryDirectory monkeypatching with paired
  setUpModule/tearDownModule, fixing order-dependent sqlite failures in
  transcript_pagination during full runs.
- stale tests updated to current product semantics: resume stubs use
  status="done" (failed is deliberately non-resumable), fix4 asserts the
  native review contract through build_company_work_item_contract,
  delivery fixture carries user_visible/feedback_scope=final, ownership
  doc names progress_log, session compression calls
  maybe_compact_session(force=True) explicitly, hard delete removes the
  work item row, parallel-isolation asserts delegate rebind and stubs
  _get_project_delegate, role update goes through OrgService on an
  editable custom org (plus read-only rejection case), collab_rpc patches
  the single os.name decision point instead of poisoning pathlib, codex
  no-pty builds inside the patch, identity-guard false positives reworded.
- cli_board actions rewritten against the real OfficeServiceFactory seam
  with a tempdir OPC_HOME (old direct-engine stubs were never consulted
  and the tests wrote into the real OPC home).
- cli_app assertions strip ANSI via _plain_output so a color-forcing
  shell (FORCE_COLOR) cannot break plain-text expectations.
- deleted never-runnable test_org_concurrency (pytest.mark.asyncio
  without the plugin, stdlib-only assertions) and three dead skipped
  filesystem-handoff tests.
- pyproject: dev extra (pytest, pytest-timeout) and a 300s per-test
  timeout backstop so a wedged test fails instead of stalling the suite.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
LZH-YS1998
2026-07-26 22:14:47 +08:00
parent 9977c3be57
commit 76c530a9e5
20 changed files with 424 additions and 447 deletions
+7 -2
View File
@@ -1506,7 +1506,7 @@ class ExternalAgentMonitoringTests(unittest.IsolatedAsyncioTestCase):
self.assertNotIn("## Skill: memory", worker_task.description)
self.assertIn("## Skill: memory", final_task.description)
async def test_engine_stages_uploaded_attachments_for_external_resume_prompt(self) -> None:
async def test_engine_provisions_uploaded_attachments_for_external_resume_prompt(self) -> None:
engine = OPCEngine()
with tempfile.TemporaryDirectory() as tmpdir:
@@ -2800,7 +2800,6 @@ class ExternalAgentMonitoringTests(unittest.IsolatedAsyncioTestCase):
proc = type("Proc", (), {"pid": 321, "stdin": None, "stdout": object(), "stderr": object()})()
task = Task(title="demo", description="demo")
prompt = adapter.build_task_prompt(task)
cmd, metadata = adapter.build_interactive_invocation(task, workspace_path="/repo")
tmpdir = _make_test_dir("codex-no-pty-argv-prompt")
try:
@@ -2809,6 +2808,12 @@ class ExternalAgentMonitoringTests(unittest.IsolatedAsyncioTestCase):
"opc.layer3_agent.adapters.codex_adapter.asyncio.create_subprocess_exec",
AsyncMock(return_value=proc),
) as spawn_mock:
# Build inside the no-PTY patch: build_interactive_invocation
# records stdin_policy/interactive_input_channel in metadata,
# and on a real PTY-less host build and start observe the same
# platform capability. Building outside the patch would bake in
# this host's PTY support and contradict the patched start.
cmd, metadata = adapter.build_interactive_invocation(task, workspace_path="/repo")
started = await adapter.start_process(
cmd,
tmpdir,