项目文件夹

文件
wehub-resource-sync 426e9eeabd
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
Chat shell gestures / Chat shell gesture + parity e2e (push) Has been cancelled
Cloud Gateway Discord / Test (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Has been cancelled
Build Agent Image / build-and-push (push) Has been cancelled
Dev Smoke / bun run dev onboarding chat (push) Has been cancelled
Dev Smoke / Vite HMR dependency-level smoke (push) Has been cancelled
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Has been cancelled
Publish @elizaos/example-code / check_npm (push) Has been cancelled
Publish @elizaos/example-code / publish_npm (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / verify_version (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / publish_npm (push) Has been cancelled
Sandbox Live Smoke / Sandbox live smoke (push) Has been cancelled
Snap Build & Test / Build Snap (amd64) (push) Has been cancelled
Snap Build & Test / Build Snap (arm64) (push) Has been cancelled
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Has been cancelled
Cloud Gateway Webhook / Test (push) Has been cancelled
Cloud Tests / lint-and-types (push) Has been cancelled
Cloud Tests / unit-tests (push) Has been cancelled
Cloud Tests / integration-tests (push) Has been cancelled
Cloud Tests / e2e-tests (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Apps Worker (Product 2) / Determine environment (push) Has been cancelled
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Has been cancelled
Deploy Eliza Provisioning Worker / Determine environment (push) Has been cancelled
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Has been cancelled
Dev Smoke / Classify changed paths (push) Has been cancelled
supply-chain / sbom (push) Has been cancelled
supply-chain / vulnerability-scan (push) Has been cancelled
Build, Push & Deploy to Phala Cloud / build-and-push (push) Has been cancelled
Test Packaging / Validate Packaging Configs (push) Has been cancelled
Test Packaging / Build & Test PyPI Package (push) Has been cancelled
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Has been cancelled
Test Packaging / Pack & Test JS Tarballs (push) Has been cancelled
UI Fixture E2E / ui-fixture-e2e (push) Has been cancelled
UI Fixture E2E / fixture-e2e (push) Has been cancelled
UI Story Gate / story-gate (push) Has been cancelled
vault-ci / test (macos-latest) (push) Has been cancelled
vault-ci / test (ubuntu-latest) (push) Has been cancelled
vault-ci / test (windows-latest) (push) Has been cancelled
vault-ci / app-core wiring tests (push) Has been cancelled
verify-patches / verify patches/CHECKSUMS.sha256 (push) Has been cancelled
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Has been cancelled
Voice Benchmark Smoke / voice bench smoke summary (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Has been cancelled
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

129 行
4.7 KiB
Python

"""Offline tests for the CodexClient skeleton (#10193/#10199).
No live model is invoked. These assert construction, health, command/env
building, round-robin account rotation, and that the client fails loudly (never
fabricates a response) when the binary or an account credential is absent.
"""
from __future__ import annotations
import pytest
from codex_adapter.accounts import CodexAccount
from codex_adapter.client import CodexClient, MessageResponse, resolve_codex_binary
def _accounts(tmp_path, *ids, authenticated=True):
root = tmp_path / "auth" / "_codex-home"
out = []
for account_id in ids:
home = root / account_id
home.mkdir(parents=True, exist_ok=True)
if authenticated:
(home / "auth.json").write_text("{}", encoding="utf-8")
out.append(CodexAccount(account_id=account_id, codex_home=home))
return out
def test_resolve_codex_binary_explicit(tmp_path):
fake = tmp_path / "codex"
fake.write_text("#!/bin/sh\n", encoding="utf-8")
assert resolve_codex_binary(str(fake)) == str(fake)
def test_resolve_codex_binary_missing(monkeypatch):
monkeypatch.delenv("CODEX_BIN", raising=False)
monkeypatch.setattr("shutil.which", lambda _: None)
with pytest.raises(FileNotFoundError, match="codex executable not found"):
resolve_codex_binary(None)
def test_client_uses_preresolved_accounts(tmp_path):
accounts = _accounts(tmp_path, "a", "b")
client = CodexClient(accounts=accounts, model="gpt-5.5")
assert [a.account_id for a in client.accounts] == ["a", "b"]
assert client.model == "gpt-5.5"
def test_health_ready(tmp_path, monkeypatch):
fake = tmp_path / "codex"
fake.write_text("#!/bin/sh\n", encoding="utf-8")
monkeypatch.setenv("CODEX_BIN", str(fake))
client = CodexClient(accounts=_accounts(tmp_path, "a"))
health = client.health()
assert health["status"] == "ready"
assert health["accounts"] == ["a"]
def test_health_reports_missing_binary(tmp_path, monkeypatch):
monkeypatch.delenv("CODEX_BIN", raising=False)
monkeypatch.setattr("shutil.which", lambda _: None)
client = CodexClient(accounts=_accounts(tmp_path, "a"))
assert client.health()["status"] == "error"
def test_health_reports_unauthenticated_account(tmp_path, monkeypatch):
fake = tmp_path / "codex"
fake.write_text("#!/bin/sh\n", encoding="utf-8")
monkeypatch.setenv("CODEX_BIN", str(fake))
client = CodexClient(accounts=_accounts(tmp_path, "a", authenticated=False))
health = client.health()
assert health["status"] == "error"
assert "not authenticated" in str(health["error"])
def test_build_command_shape(tmp_path):
fake = tmp_path / "codex"
fake.write_text("#!/bin/sh\n", encoding="utf-8")
client = CodexClient(accounts=_accounts(tmp_path, "a"), codex_bin=str(fake), model="gpt-5.5")
cmd = client.build_command()
assert cmd[0] == str(fake)
assert cmd[1] == "exec"
assert "--model" in cmd and "gpt-5.5" in cmd
def test_build_env_points_codex_home(tmp_path):
accounts = _accounts(tmp_path, "a")
client = CodexClient(accounts=accounts, codex_bin="/usr/bin/true")
env = client.build_env(accounts[0])
assert env["CODEX_HOME"] == str(accounts[0].codex_home)
def test_reset_rewinds_turn_index(tmp_path):
client = CodexClient(accounts=_accounts(tmp_path, "a", "b"), codex_bin="/usr/bin/true")
client._turn_index = 5
client.reset("task-1", "bfcl")
assert client._turn_index == 0
assert client._task_id == "task-1"
assert client._benchmark == "bfcl"
def test_account_for_current_turn_round_robins(tmp_path):
client = CodexClient(accounts=_accounts(tmp_path, "a", "b"), codex_bin="/usr/bin/true")
assert client.account_for_current_turn().account_id == "a"
client._turn_index = 1
assert client.account_for_current_turn().account_id == "b"
client._turn_index = 2
assert client.account_for_current_turn().account_id == "a"
def test_send_message_raises_on_unauthenticated(tmp_path):
accounts = _accounts(tmp_path, "a", authenticated=False)
client = CodexClient(accounts=accounts, codex_bin="/usr/bin/true")
with pytest.raises(RuntimeError, match="not authenticated"):
client.send_message("hello")
def test_send_message_surfaces_subprocess_failure(tmp_path):
# /usr/bin/false exits nonzero: the client must raise, never fabricate output.
accounts = _accounts(tmp_path, "a")
client = CodexClient(accounts=accounts, codex_bin="/usr/bin/false")
with pytest.raises(RuntimeError, match="codex exec failed"):
client.send_message("hello")
def test_message_response_defaults():
resp = MessageResponse(text="hi")
assert resp.actions == []
assert resp.params == {}