From 11d3b24592daa650e6ad4537495411783746bbb3 Mon Sep 17 00:00:00 2001 From: ThearchyHelios Date: Mon, 19 Oct 2026 14:06:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=9Aconftest=20=E6=8A=8A?= =?UTF-8?q?=20AGENTLAB=5FSECRET=5FKEY=E3=80=81AGENTLAB=5FSCHEDULER=20?= =?UTF-8?q?=E6=8C=AA=E5=88=B0=E4=BB=BB=E4=BD=95=20app.*=20=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E4=B9=8B=E5=89=8D=EF=BC=88PostgreSQL=20=E5=88=86?= =?UTF-8?q?=E6=94=AF=E5=85=88=E5=AF=BC=E5=85=A5=20app.db.base=20=E8=A3=85?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=B1=A0=EF=BC=8Csettings=20=E9=82=A3?= =?UTF-8?q?=E4=B8=80=E5=88=BB=E5=B0=B1=E5=AE=9A=E4=B8=8B=E6=9D=A5=E4=BA=86?= =?UTF-8?q?=EF=BC=8C=E4=BB=A5=E5=89=8D=E5=8D=95=E7=8B=AC=E8=B7=91=20test?= =?UTF-8?q?=5Fschedule=5Fevents=5Fapi.py=20=E5=9C=A8=20PostgreSQL=20?= =?UTF-8?q?=E4=B8=8A=20scheduler=5Fon=20=E6=98=AF=20True=EF=BC=89=EF=BC=9B?= =?UTF-8?q?test=5Ftrigger=5Foptions=20=E6=8C=89=E5=90=8D=E5=AD=97=EF=BC=88?= =?UTF-8?q?q=EF=BC=89=E6=9F=A5=E8=A6=81=E6=A0=B8=E5=AF=B9=E7=9A=84?= =?UTF-8?q?=E9=82=A3=E5=87=A0=E4=B8=AA=E5=AF=B9=E8=B1=A1=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E6=8C=87=E6=9C=9B=E4=B8=80=E9=A1=B5=20100=20=E4=B8=AA?= =?UTF-8?q?=E8=A3=85=E5=BE=97=E4=B8=8B=E5=90=8C=E4=B8=80=E4=B8=AA=E5=BA=93?= =?UTF-8?q?=E9=87=8C=E5=88=AB=E7=9A=84=E6=B5=8B=E8=AF=95=E5=BB=BA=E7=9A=84?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E5=92=8C=E6=95=B0=E6=8D=AE=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/tests/conftest.py | 13 ++++++++----- backend/tests/test_schedule_events_api.py | 16 +++++++++++++--- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py index 0a51b2a2..d4be71bf 100644 --- a/backend/tests/conftest.py +++ b/backend/tests/conftest.py @@ -19,11 +19,18 @@ from pathlib import Path _TMP = Path(tempfile.mkdtemp(prefix="agentlab-tests-")) os.environ["AGENTLAB_DATA_DIR"] = str(_TMP) +# 下面这几项也都要在任何 app.* 导入之前设(两种库同一个顺序):PostgreSQL 分支要先导入 app.db.base 装连接池,settings 在那一刻 +# 就按当时的环境定下来了——以前这两项写在那之后,PostgreSQL 上 AGENTLAB_SCHEDULER 没生效(scheduler_on 成了 True) +# 别把真实的 key 带进测试环境 +os.environ.setdefault("AGENTLAB_SECRET_KEY", "test-only-not-a-real-key") +# 定时任务的调度循环不在测试里起:走 lifespan 的测试不该到点替人发起运行。要测调度的直接调它 +os.environ.setdefault("AGENTLAB_SCHEDULER", "0") def _postgres_database(admin_url: str) -> str: """AGENTLAB_TEST_DATABASE_URL 给的是管理用的库:每个 xdist 进程在同一台服务器上建一个自己的空库(库名加进程号后缀, - 已有的同名库先删掉),进程退出时删掉。返回这个库的地址。scripts/test-postgres.sh 起临时容器、设好这个变量。""" + 已有的同名库先删掉),进程退出时删掉。返回这个库的地址。scripts/test-postgres.sh 起临时容器、设好这个变量。 + 这里导入的 app.db.urls 只用 SQLAlchemy 的地址解析,不碰 settings(settings 要等环境变量都设好)。""" import psycopg from sqlalchemy.engine import make_url @@ -64,10 +71,6 @@ if _TEST_PG: from tests.pgpool import install as _loop_local_pool # noqa: E402 _loop_local_pool(_app_engine) -# 别把真实的 key 带进测试环境 -os.environ.setdefault("AGENTLAB_SECRET_KEY", "test-only-not-a-real-key") -# 定时任务的调度循环不在测试里起:走 lifespan 的测试不该到点替人发起运行。要测调度的直接调它 -os.environ.setdefault("AGENTLAB_SCHEDULER", "0") import pytest # noqa: E402 diff --git a/backend/tests/test_schedule_events_api.py b/backend/tests/test_schedule_events_api.py index e07d7561..6158c206 100644 --- a/backend/tests/test_schedule_events_api.py +++ b/backend/tests/test_schedule_events_api.py @@ -356,15 +356,25 @@ async def test_trigger_options(client): table = await upload_table("门店销售") flat = await upload_table("门店名单", mode="replace") wf, wf_name = await workflow("日报") - draft, _ = await workflow("草稿", published=False) + draft, draft_name = await workflow("草稿", published=False) r = await client.get("/api/schedules/trigger-options") assert r.status_code == 200 out = r.json() events = {e["event"]: e for e in out["events"]} assert list(events) == ["table.version", "workflow.finished", "source.changed"] - tables = {o["id"]: o for o in events["table.version"]["objects"]} + + # 对象按名字排、一页 100 个:同一个库里别的测试建的工作流、数据源多了,这里建的可能排到第一页外面。按名字(q)查要的那几个 + async def objects(event: str, name: str) -> dict[str, dict]: + got = await client.get("/api/schedules/trigger-options", params={"event": event, "q": name}) + assert got.status_code == 200 + [entry] = got.json()["events"] + return {o["id"]: o for o in entry["objects"]} + + async with SessionLocal() as session: + table_name, flat_name = [(await session.get(DataSource, i)).name for i in (table, flat)] + tables = {**await objects("table.version", table_name), **await objects("table.version", flat_name)} assert tables[table]["ok"] is True and tables[flat]["ok"] is False and "按期累积" in tables[flat]["reason"] - flows = {o["id"]: o for o in events["workflow.finished"]["objects"]} + flows = {**await objects("workflow.finished", wf_name), **await objects("workflow.finished", draft_name)} assert flows[wf] == {"id": wf, "name": wf_name, "ok": True, "reason": None} assert flows[draft]["ok"] is False and "发布" in flows[draft]["reason"] assert "hook" in [o["kind"] for o in out["origins"]] and out["max_depth"] == 5