codeflash-agent/packages/blackbox/tests/test_cli.py

55 lines
1.6 KiB
Python
Raw Normal View History

Add blackbox package: session flight recorder with HTMX dashboard (#39) * feat(blackbox): add package with models, CLI, and HTMX dashboard * test(blackbox): add comprehensive test coverage for dashboard * feat(blackbox): cache session scanning via watcher invalidation * docs(blackbox): add README and use fastapi[standard] for dev server * refactor(blackbox): extract presentation logic into formatter classes * refactor(blackbox): extract classify_error helpers * feat(blackbox): wire analytics into session detail view Show token usage, tool breakdowns, and session stats in a collapsible panel when viewing a session. * feat(blackbox): add codeflash plugin detection Detect codeflash agent names, skills, and commands in transcripts. Surface language, optimization domain, and capability badges in the analytics panel. * refactor(blackbox): remove underscore prefixes from internal functions * chore: add ty python-version to root pyproject.toml * chore(blackbox): fix lint errors in test files * style(blackbox): apply ruff formatting to analytics * feat(blackbox): add Playwright E2E tests for dashboard Refactor app.py to expose create_app() factory accepting a projects_dir override, enabling tests to run against fixture data instead of the real ~/.claude/projects/ directory. Routes now read projects_dir from app.state instead of the module-level constant. Add 26 Playwright tests across 5 files covering dashboard loading, session list, session detail with filters and analytics, sidebar collapse/localStorage persistence, and SSE log streaming. All tests pass on chromium, firefox, and webkit (78 total). CI gets a new e2e-blackbox job with a browser matrix strategy running all three engines in parallel, conditional on blackbox path changes, with trace upload on failure. * fix(ci): sync only blackbox package in e2e job * fix(ci): exclude e2e tests from unit test job The test job doesn't install Playwright browsers, so e2e tests error when pytest collects them. Ignore tests/e2e/ directories in the test job — those are handled by the dedicated e2e-blackbox job.
2026-04-29 00:58:43 +00:00
from __future__ import annotations
from argparse import Namespace
import pytest
from blackbox.cli import main, parse_args, run
class TestParseArgs:
def test_serve_defaults(self) -> None:
args = parse_args(["serve"]).unwrap()
assert "serve" == args.command
assert 7100 == args.port
assert args.no_open is False
def test_serve_custom_port(self) -> None:
args = parse_args(["serve", "--port", "8080"]).unwrap()
assert 8080 == args.port
def test_serve_no_open(self) -> None:
args = parse_args(["serve", "--no-open"]).unwrap()
assert args.no_open is True
def test_no_command_errors(self) -> None:
with pytest.raises(SystemExit):
parse_args([])
class TestRun:
def test_serve_launches_uvicorn(self, monkeypatch: pytest.MonkeyPatch) -> None:
called_with: dict[str, object] = {}
def fake_uvicorn_run(app: object, **kwargs: object) -> None:
called_with["app"] = app
called_with.update(kwargs)
monkeypatch.setattr("uvicorn.run", fake_uvicorn_run)
args = parse_args(["serve", "--no-open"]).unwrap()
run(args).unwrap()
assert "127.0.0.1" == called_with["host"]
assert 7100 == called_with["port"]
def test_unknown_command(self) -> None:
args = Namespace(command="bogus")
result = run(args)
assert not result.is_ok()
class TestMain:
def test_main_serve(self, monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setattr("sys.argv", ["blackbox", "serve", "--no-open"])
monkeypatch.setattr("uvicorn.run", lambda *a, **kw: None)
main()