92 lines
2.7 KiB
Python
92 lines
2.7 KiB
Python
import os
|
|
import subprocess
|
|
import tomllib
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
SCRIPT = ROOT / "scripts" / "configure-codex.sh"
|
|
|
|
|
|
def run_configure(codex_home: Path, *args: str) -> subprocess.CompletedProcess[str]:
|
|
env = os.environ.copy()
|
|
env["CODEX_HOME"] = str(codex_home)
|
|
return subprocess.run(
|
|
[str(SCRIPT), *args],
|
|
cwd=ROOT,
|
|
env=env,
|
|
text=True,
|
|
capture_output=True,
|
|
check=True,
|
|
)
|
|
|
|
|
|
def test_configure_codex_creates_network_setting(tmp_path: Path) -> None:
|
|
codex_home = tmp_path / ".codex"
|
|
|
|
run_configure(codex_home, "--skip-verify", "--skip-mcp")
|
|
|
|
config = tomllib.loads((codex_home / "config.toml").read_text())
|
|
assert config["sandbox_workspace_write"]["network_access"] is True
|
|
|
|
|
|
def test_configure_codex_preserves_existing_settings_and_is_idempotent(
|
|
tmp_path: Path,
|
|
) -> None:
|
|
codex_home = tmp_path / ".codex"
|
|
codex_home.mkdir()
|
|
config_path = codex_home / "config.toml"
|
|
config_path.write_text(
|
|
'model = "gpt-test"\n\n'
|
|
"[sandbox_workspace_write]\n"
|
|
"network_access = false\n"
|
|
'writable_roots = ["/tmp/example"]\n'
|
|
)
|
|
|
|
run_configure(codex_home, "--skip-verify", "--skip-mcp")
|
|
first = config_path.read_text()
|
|
run_configure(codex_home, "--skip-verify", "--skip-mcp")
|
|
|
|
assert config_path.read_text() == first
|
|
config = tomllib.loads(first)
|
|
assert config["model"] == "gpt-test"
|
|
assert config["sandbox_workspace_write"] == {
|
|
"network_access": True,
|
|
"writable_roots": ["/tmp/example"],
|
|
}
|
|
|
|
|
|
def test_configure_codex_dry_run_does_not_write(tmp_path: Path) -> None:
|
|
codex_home = tmp_path / ".codex"
|
|
|
|
result = run_configure(codex_home, "--dry-run", "--skip-mcp")
|
|
|
|
assert "DRY-RUN" in result.stdout
|
|
assert not (codex_home / "config.toml").exists()
|
|
|
|
|
|
def test_configure_codex_removes_dev_hub_registration_by_default(
|
|
tmp_path: Path,
|
|
) -> None:
|
|
codex_home = tmp_path / ".codex"
|
|
codex_home.mkdir()
|
|
config_path = codex_home / "config.toml"
|
|
config_path.write_text(
|
|
'[mcp_servers.dev-hub]\ncommand = "/tmp/dev-hub"\n'
|
|
)
|
|
|
|
result = run_configure(codex_home, "--skip-verify")
|
|
|
|
assert "removed Codex MCP server dev-hub" in result.stdout
|
|
config = tomllib.loads(config_path.read_text())
|
|
assert "dev-hub" not in config.get("mcp_servers", {})
|
|
|
|
|
|
def test_configure_codex_mcp_is_explicit_opt_in(tmp_path: Path) -> None:
|
|
codex_home = tmp_path / ".codex"
|
|
|
|
run_configure(codex_home, "--skip-verify", "--with-mcp")
|
|
|
|
config = tomllib.loads((codex_home / "config.toml").read_text())
|
|
command = config["mcp_servers"]["dev-hub"]["command"]
|
|
assert command.endswith("/scripts/codex-state-hub-mcp.sh")
|