from pathlib import Path
from typer.testing import CliRunner
from tjwater_agent_cli import core
from tjwater_agent_cli.main import app, main
runner = CliRunner()
class DummyResponse:
def __init__(self, *, status_code=200, json_data=None, text="", headers=None, content=None):
self.status_code = status_code
self._json_data = json_data
self.text = text
self.headers = headers or {"content-type": "application/json"}
self.content = content if content is not None else text.encode("utf-8")
@property
def ok(self):
return 200 <= self.status_code < 300
def json(self):
if self._json_data is None:
raise ValueError("no json")
return self._json_data
def test_load_auth_context_supports_aliases(tmp_path: Path):
auth_path = tmp_path / "auth.json"
auth_path.write_text(
'{"base_url":"http://server","token":"abc","projectId":"p1","userId":"u1","username":"tester","projectCode":"net1"}',
encoding="utf-8",
)
auth = core.load_auth_context(auth_path)
assert auth.server == "http://server"
assert auth.access_token == "abc"
assert auth.project_id == "p1"
assert auth.user_id == "u1"
assert auth.username == "tester"
assert auth.network == "net1"
def test_build_runtime_context_uses_default_server(monkeypatch):
monkeypatch.delenv("TJWATER_SERVER", raising=False)
monkeypatch.delenv("TJWATER_ACCESS_TOKEN", raising=False)
monkeypatch.delenv("TJWATER_PROJECT_ID", raising=False)
monkeypatch.delenv("TJWATER_USER_ID", raising=False)
monkeypatch.delenv("TJWATER_USERNAME", raising=False)
monkeypatch.delenv("TJWATER_NETWORK", raising=False)
monkeypatch.delenv("TJWATER_EXTRA_HEADERS", raising=False)
runtime = core.build_runtime_context(
server=None,
auth_context_path=None,
scheme=None,
timeout=core.DEFAULT_TIMEOUT,
request_id="req-1",
)
assert runtime.server == core.DEFAULT_SERVER
def test_help_json_lists_commands():
result = runner.invoke(app, ["help", "--json"])
assert result.exit_code == 0
assert '"schema_version": "tjwater-cli/v1"' in result.stdout
assert '"command": "project"' in result.stdout
assert '"command": "analysis"' in result.stdout
assert '"menu_level": 1' in result.stdout
assert '"command": "project list"' not in result.stdout
def test_help_defaults_to_text():
result = runner.invoke(app, ["help"])
assert result.exit_code == 0
assert "Commands:" in result.stdout
assert "project: 项目与项目级元数据相关命令。" in result.stdout
assert "analysis: 分析计算与诊断相关命令。" in result.stdout
assert "Use `tjwater