Files
forge/apps/api/tests/test_version_retention.py
nihalashetty ae67bff5a3 feat: deep-agent canvas, live observability, and multi-environment tooling
Self-hosted platform for building, testing, and shipping LangChain/LangGraph agents. Deep-agent sub-agents on the canvas, a live tracing/observability timeline, auto-provisioned built-in tools with import/export, per-environment tool variables, streamed evaluations, and per-user auth token forwarding.
2026-07-28 01:49:19 +05:30

53 lines
2.0 KiB
Python

"""Version-history retention resolution (item 11).
The console Settings > Versioning panel writes `version_history_limit` into project.config;
snapshot()/prune must honor it, with precedence project.config > tenant.settings > global.
"""
from __future__ import annotations
import uuid
from forge.config import settings
from forge.db.base import SessionLocal
from forge.models import Project, Workflow
from forge.services.versions import VersionService, _limit_for
def test_limit_precedence():
g = int(settings.version_history_limit)
# project.config wins over tenant + global
assert _limit_for({"version_history_limit": 7}, {"version_history_limit": 3}) == 3
# tenant override used when the project sets none
assert _limit_for({"version_history_limit": 7}, {}) == 7
assert _limit_for({"version_history_limit": 7}, None) == 7
# global default when neither is set
assert _limit_for(None, None) == g
# a non-integer value falls through to the next source
assert _limit_for(None, {"version_history_limit": "nope"}) == g
async def test_project_config_limit_prunes_snapshots():
t = f"t_{uuid.uuid4().hex[:8]}"
async with SessionLocal() as s:
proj = Project(tenant_id=t, name="P", slug=f"p{uuid.uuid4().hex[:6]}", config={"version_history_limit": 2})
s.add(proj)
await s.flush()
wf = Workflow(tenant_id=t, project_id=proj.id, name="w", executable={}, status="draft")
s.add(wf)
await s.commit()
pid, wid = proj.id, wf.id
async with SessionLocal() as s:
for i in range(5):
await VersionService.snapshot(
s, tenant_id=t, entity_type="workflow", entity_id=wid,
data={"name": f"v{i}"}, project_id=pid,
)
await s.commit()
async with SessionLocal() as s:
rows = await VersionService.list(s, t, "workflow", wid)
# project.config limit=2 -> only the two newest snapshots survive
assert [r.version_no for r in rows] == [5, 4], [r.version_no for r in rows]