mirror of
https://github.com/codeflash-ai/codeflash-agent.git
synced 2026-05-04 18:25:19 +00:00
* 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.
41 lines
1.5 KiB
Python
41 lines
1.5 KiB
Python
"""Tests for SSE log streaming in the session detail view."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
import pytest
|
|
from playwright.sync_api import expect
|
|
|
|
if TYPE_CHECKING:
|
|
from playwright.sync_api import Page
|
|
|
|
pytestmark = pytest.mark.e2e
|
|
|
|
|
|
class TestSSEStreaming:
|
|
"""SSE log events render log entries in the DOM."""
|
|
|
|
def _load_session(self, dashboard: Page) -> None:
|
|
"""Click the rich session to trigger SSE streaming."""
|
|
dashboard.get_by_text("work/myapp").first.click()
|
|
dashboard.locator("#log-container").wait_for(state="attached", timeout=10_000)
|
|
|
|
def test_log_entries_appear(self, dashboard: Page) -> None:
|
|
"""Log entries are inserted into the log container via SSE."""
|
|
self._load_session(dashboard)
|
|
container = dashboard.locator("#log-container")
|
|
expect(container).not_to_be_empty(timeout=15_000)
|
|
|
|
def test_log_container_has_children(self, dashboard: Page) -> None:
|
|
"""Log container receives child elements from SSE events."""
|
|
self._load_session(dashboard)
|
|
dashboard.locator("#log-container > *").first.wait_for(state="visible", timeout=15_000)
|
|
assert dashboard.locator("#log-container > *").count() >= 1
|
|
|
|
def test_sse_connection_established(self, dashboard: Page) -> None:
|
|
"""The SSE URL is set on the log container's data attribute."""
|
|
self._load_session(dashboard)
|
|
url = dashboard.locator("#log-container").get_attribute("data-sse-url")
|
|
assert url is not None
|
|
assert "/logs" in url
|