feat(scheduler,conversations,api): cron and schedule in the gateway tz, job runs persisted
This commit is contained in:
+36
-1
@@ -21,6 +21,7 @@ from test_conversations import ScriptedClient, World
|
||||
from beaver_gateway.core.conversation_store import rewrite_messages
|
||||
from beaver_gateway.core.auth import TokenStore
|
||||
from beaver_gateway.core.registry import McpRegistry
|
||||
from beaver_gateway.core.scheduler import Job, JobRun, Scheduler
|
||||
from beaver_gateway.core.transcript import build_entries
|
||||
from beaver_gateway.frontends.admin import AdminFrontend
|
||||
from beaver_gateway.frontends.admin.frontend import build_app as build_admin
|
||||
@@ -96,7 +97,12 @@ class ToolClient(ScriptedClient):
|
||||
|
||||
|
||||
class Api:
|
||||
def __init__(self, world: World, memory_root: Path | None = None) -> None:
|
||||
def __init__(
|
||||
self,
|
||||
world: World,
|
||||
memory_root: Path | None = None,
|
||||
scheduler: Scheduler | None = None,
|
||||
) -> None:
|
||||
self.world = world
|
||||
self.store = TokenStore(world.db, bootstrap={"t": TOKEN})
|
||||
self.runtime = GatewayRuntime(
|
||||
@@ -112,6 +118,7 @@ class Api:
|
||||
conversations=world.conversations,
|
||||
bus=world.bus,
|
||||
pool=world.pool,
|
||||
scheduler=scheduler,
|
||||
)
|
||||
self.app = build_api(self.runtime, memory_root=memory_root)
|
||||
self.http = AsyncClient(
|
||||
@@ -146,6 +153,34 @@ async def seed_usage(world: World, rows: list[dict[str, Any]]) -> None:
|
||||
await session.commit()
|
||||
|
||||
|
||||
async def test_job_runs_come_from_the_db(world: World) -> None:
|
||||
async def ping(_run: JobRun) -> None:
|
||||
pass
|
||||
|
||||
scheduler = Scheduler(
|
||||
conversations=world.conversations, jobs=[Job("ping", ping)], tz="Europe/Warsaw"
|
||||
)
|
||||
api = Api(world, scheduler=scheduler)
|
||||
await scheduler.start()
|
||||
res = await api.http.post("/jobs/ping/run", headers=HEADERS)
|
||||
assert res.status_code == 202, res.text
|
||||
for _ in range(100):
|
||||
runs = (await api.get("/jobs/ping/runs", {"limit": 10}))["runs"]
|
||||
if runs:
|
||||
break
|
||||
await asyncio.sleep(0.02)
|
||||
assert [(r["trigger"], r["status"], r["payload"]) for r in runs] == [
|
||||
("manual", "done", {})
|
||||
]
|
||||
jobs = await api.get("/jobs")
|
||||
assert jobs["tz"] == "Europe/Warsaw"
|
||||
assert jobs["jobs"][0]["run"]["id"] == runs[0]["id"]
|
||||
assert jobs["jobs"][0]["run"]["finished_at"].endswith("+02:00")
|
||||
missing = await api.http.get("/jobs/nope/runs", headers=HEADERS)
|
||||
assert missing.status_code == 404
|
||||
await scheduler.stop()
|
||||
|
||||
|
||||
async def test_usage_groups_by_agent_day_and_model(world: World) -> None:
|
||||
api = Api(world)
|
||||
now = datetime.now(UTC).replace(tzinfo=None)
|
||||
|
||||
Reference in New Issue
Block a user