fix(dashboard): scope sessions and analytics to selected profile (#45598)
This commit is contained in:
@@ -520,6 +520,87 @@ class TestWebServerEndpoints:
|
||||
resp = self.client.get("/api/profiles/sessions?archived=bogus")
|
||||
assert resp.status_code == 400
|
||||
|
||||
def test_sessions_endpoint_reads_requested_profile(self):
|
||||
"""The machine dashboard's global profile switcher must retarget
|
||||
the Sessions page, not just config/skills/model pages."""
|
||||
from hermes_state import SessionDB
|
||||
from hermes_cli import profiles as profiles_mod
|
||||
|
||||
worker_home = profiles_mod.get_profile_dir("worker")
|
||||
worker_home.mkdir(parents=True)
|
||||
|
||||
default_db = SessionDB()
|
||||
try:
|
||||
default_db.create_session(session_id="default-only", source="cli")
|
||||
default_db.append_message("default-only", role="user", content="default")
|
||||
finally:
|
||||
default_db.close()
|
||||
|
||||
worker_db = SessionDB(db_path=worker_home / "state.db")
|
||||
try:
|
||||
worker_db.create_session(session_id="worker-only", source="cli")
|
||||
worker_db.append_message("worker-only", role="user", content="worker")
|
||||
finally:
|
||||
worker_db.close()
|
||||
|
||||
resp = self.client.get("/api/sessions?profile=worker&limit=20&min_messages=0")
|
||||
assert resp.status_code == 200
|
||||
data = resp.json()
|
||||
ids = {s["id"] for s in data["sessions"]}
|
||||
assert "worker-only" in ids
|
||||
assert "default-only" not in ids
|
||||
row = next(s for s in data["sessions"] if s["id"] == "worker-only")
|
||||
assert row["profile"] == "worker"
|
||||
assert row["is_default_profile"] is False
|
||||
|
||||
stats = self.client.get("/api/sessions/stats?profile=worker").json()
|
||||
assert stats["total"] == 1
|
||||
assert stats["messages"] == 1
|
||||
|
||||
messages = self.client.get("/api/sessions/worker-only/messages?profile=worker").json()
|
||||
assert [m["content"] for m in messages["messages"]] == ["worker"]
|
||||
|
||||
def test_analytics_endpoints_read_requested_profile(self):
|
||||
from hermes_state import SessionDB
|
||||
from hermes_cli import profiles as profiles_mod
|
||||
|
||||
worker_home = profiles_mod.get_profile_dir("worker")
|
||||
worker_home.mkdir(parents=True)
|
||||
|
||||
default_db = SessionDB()
|
||||
try:
|
||||
default_db.create_session(session_id="default-usage", source="cli", model="default/model")
|
||||
default_db.update_token_counts("default-usage", input_tokens=10, output_tokens=5)
|
||||
finally:
|
||||
default_db.close()
|
||||
|
||||
worker_db = SessionDB(db_path=worker_home / "state.db")
|
||||
try:
|
||||
worker_db.create_session(session_id="worker-usage", source="cli", model="worker/model")
|
||||
worker_db.update_token_counts(
|
||||
"worker-usage",
|
||||
input_tokens=123,
|
||||
output_tokens=45,
|
||||
billing_provider="worker-provider",
|
||||
)
|
||||
finally:
|
||||
worker_db.close()
|
||||
|
||||
usage = self.client.get("/api/analytics/usage?days=7&profile=worker").json()
|
||||
assert usage["totals"]["total_sessions"] == 1
|
||||
assert usage["totals"]["total_input"] == 123
|
||||
assert [m["model"] for m in usage["by_model"]] == ["worker/model"]
|
||||
|
||||
models = self.client.get("/api/analytics/models?days=7&profile=worker").json()
|
||||
assert models["totals"]["distinct_models"] == 1
|
||||
assert models["totals"]["total_input"] == 123
|
||||
assert models["models"][0]["model"] == "worker/model"
|
||||
assert models["models"][0]["provider"] == "worker-provider"
|
||||
|
||||
default_usage = self.client.get("/api/analytics/usage?days=7").json()
|
||||
assert default_usage["totals"]["total_input"] == 10
|
||||
assert default_usage["totals"]["total_output"] == 5
|
||||
|
||||
def test_get_sessions_rejects_unknown_archived_value(self):
|
||||
resp = self.client.get("/api/sessions?archived=bogus")
|
||||
assert resp.status_code == 400
|
||||
|
||||
Reference in New Issue
Block a user