47 lines
2.0 KiB
Python
47 lines
2.0 KiB
Python
"""R7 · R9 · R10 · R12: commands, --json and exit codes (0 fine · 1 over --max-usd · 2 error)."""
|
|
import json
|
|
|
|
import pytest
|
|
|
|
from tcost.cli import main
|
|
|
|
|
|
def run(capsys, *argv):
|
|
with pytest.raises(SystemExit) as end:
|
|
main(list(argv))
|
|
out = capsys.readouterr()
|
|
return end.value.code, out.out, out.err
|
|
|
|
|
|
def test_count_and_gate(capsys, folder):
|
|
code, out, _ = run(capsys, "count", str(folder / "prompts"), "--out", "100")
|
|
assert code == 0 and "long.prompt" in out and "gpt-5.4-nano /call" in out
|
|
code, _, err = run(capsys, "count", str(folder / "prompts" / "long.prompt"), "--out", "200", "--max-usd", "0.0002")
|
|
assert code == 1 and "more than --max-usd" in err
|
|
code, out, _ = run(capsys, "count", str(folder / "prompts" / "short.txt"), "--json", "--model", "gpt-4.1-mini")
|
|
assert code == 0 and json.loads(out)["rows"][0]["tokens"] > 0
|
|
|
|
|
|
def test_unknown_model_and_missing_file(capsys, folder):
|
|
code, _, err = run(capsys, "count", str(folder / "prompts"), "--model", "gpt-9")
|
|
assert code == 2 and "unknown model 'gpt-9'" in err
|
|
code, _, err = run(capsys, "count", str(folder / "nothing.txt"))
|
|
assert code == 2 and "no such file" in err
|
|
|
|
|
|
def test_compare_and_budget(capsys, folder):
|
|
code, out, _ = run(capsys, "compare", str(folder / "prompts" / "long.prompt"), "--model", "gpt-4.1-mini",
|
|
"--model", "gpt-5.4-nano", "--out", "100")
|
|
assert code == 0 and "cheaper than gpt-4.1-mini" in out
|
|
code, out, _ = run(capsys, "budget", "1.0", str(folder / "prompts" / "short.txt"), "--out", "100", "--json")
|
|
rows = json.loads(out)
|
|
assert code == 0 and rows["gpt-5.4-nano"]["calls"] > rows["gpt-4.1-mini"]["calls"]
|
|
|
|
|
|
def test_usage_and_workflow(capsys, folder):
|
|
code, out, _ = run(capsys, "usage", str(folder / "runs"), "--per-day", "1000")
|
|
assert code == 0 and "2 request(s)" in out and "skipped 1" in out and "month:" in out
|
|
code, out, _ = run(capsys, "workflow", str(folder / "reference"), "--json")
|
|
steps = json.loads(out)["steps"]
|
|
assert code == 0 and len(steps) == 6
|