Files
gyxx-flow/tests/test_server_scheduler_deployment.py
T
wangyunlong 622a609800 feat(product-commerce): 系列聚合去重与采集开关两层语义
配置来源收敛
- 系列平台编码 tm/jd/dy/jd_self 与 9 类飞书地址改为整系列并集去重后挂锚点,
  子款编码保留在 series.platform_ids 备查;多表冲突保留最高优先级并告警
- 写表脚本(当日/天猫主图/京东主图)去掉本地 JSON 回退,地址缺失或读取失败
  直接 fail closed,避免库与表地址不一致被静默掩盖
- 测试注入 records_provider 时禁用配置缓存读写,防止假数据写入生产快照

采集开关(dim_style.collect_enabled)
- 锚点为系列总开关:false 则整系列不采
- 锚点为 true 时,子款自身 false 仅把自己的 ERP 编码排除出聚合,其余子款照常
- 排除结果记录在 series.erp_excluded 并在运行时提示

聚水潭全店铺日报防错
- 列布局 fail closed、行 td 数校验、满页判定 + 总页数兜底、值域交叉校验
- 新增单日总量闸:超近 14 天中位数 8 倍拒绝落库

其他
- 新增电商费用归集配置 ad_cost_rollup.json 与积分兑换周报采集
- 店铺情报、供应链到货同步、通知路由与相关配置/文档同步更新
- 忽略本地 dsh workbench 脚手架(含 node_modules)
2026-10-30 11:49:31 +08:00

91 lines
2.9 KiB
Python

from __future__ import annotations
import json
from pathlib import Path
PROJECT_ROOT = Path(__file__).resolve().parents[1]
def test_linux_service_supervises_only_the_python_scheduler() -> None:
unit = (PROJECT_ROOT / "deploy" / "gyxx-flow.service").read_text(
encoding="utf-8"
)
folded = unit.casefold()
assert (
"ExecStart=/opt/gyxx-flow/.venv/bin/python -m gyxx_flow schedule run" in unit
)
assert "Environment=GYXX_DATA_ROOT=/var/lib/gyxx-flow" in unit
assert "Restart=on-failure" in unit
assert "OnCalendar=" not in unit
assert "schtasks" not in folded
assert "cron" not in folded
def test_legacy_windows_service_is_only_a_process_supervisor() -> None:
installer = (PROJECT_ROOT / "deploy" / "windows-service" / "install.ps1").read_text(
encoding="utf-8"
)
folded = installer.casefold()
assert "schedule run" in installer
assert "nssm" in folded
assert "schtasks" not in folded
assert "new-scheduledtask" not in folded
assert "schedule plan" not in folded
def test_deployment_documents_one_scheduler_and_external_data_root() -> None:
guide = (PROJECT_ROOT / "docs" / "deployment.md").read_text(encoding="utf-8")
payload = json.loads(
(PROJECT_ROOT / "config" / "schedules.json").read_text(encoding="utf-8")
)
assert "config/schedules.json" in guide
assert "python -m gyxx_flow schedule run" in guide
assert "deploy/gyxx-flow.service" in guide
assert "GYXX_DATA_ROOT" in guide
assert "/var/lib/gyxx-flow" in guide
assert "Windows Task Scheduler" in guide
assert len(payload["schedules"]) == 40
assert sum(item.get("enabled", True) for item in payload["schedules"]) == 28
def test_three_canonical_documents_cover_architecture_deployment_and_operations() -> None:
architecture = (PROJECT_ROOT / "docs" / "architecture.md").read_text(
encoding="utf-8"
)
deployment = (PROJECT_ROOT / "docs" / "deployment.md").read_text(
encoding="utf-8"
)
runbook = (PROJECT_ROOT / "docs" / "runbook.md").read_text(encoding="utf-8")
assert "LangGraph" in architecture
assert "systemd" in deployment
assert "故障处理" in runbook
def test_postgres_compose_exposes_only_a_loopback_local_database() -> None:
compose = (PROJECT_ROOT / "deploy" / "postgres.compose.yml").read_text(
encoding="utf-8"
)
assert '"127.0.0.1:5432:5432"' in compose
assert "POSTGRES_DB: gyxx_super_data" in compose
assert "POSTGRES_USER: gyxx_flow" in compose
assert "GYXX_POSTGRES_PASSWORD" in compose
assert "8.148.185.119" not in compose
assert compose.count("/docker-entrypoint-initdb.d/") == 5
content_schema = (
PROJECT_ROOT
/ "src"
/ "gyxx_flow"
/ "modules"
/ "content_marketing"
/ "data"
/ "tools"
/ "schema_gyxx_super_data.sql"
).read_text(encoding="utf-8")
assert "\\c " not in content_schema