Files
gyxx-flow/tests/test_relocated_project.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

85 lines
2.3 KiB
Python

from __future__ import annotations
import json
import os
import shutil
import subprocess
import sys
from pathlib import Path
import pytest
PROJECT_ROOT = Path(__file__).resolve().parents[1]
def _run_relocated(
relocated: Path, data_root: Path, *args: str
) -> subprocess.CompletedProcess[str]:
env = os.environ.copy()
for name in tuple(env):
if name.startswith("GYXX_LEGACY_"):
env.pop(name)
env["PYTHONPATH"] = str(relocated / "src")
env["GYXX_DATA_ROOT"] = str(data_root)
return subprocess.run(
[sys.executable, "-m", "gyxx_flow", *args],
cwd=relocated,
env=env,
text=True,
encoding="utf-8",
capture_output=True,
check=False,
timeout=60,
)
@pytest.fixture
def relocated_project(tmp_path: Path) -> Path:
relocated = tmp_path / "moved-gyxx-flow"
shutil.copytree(PROJECT_ROOT / "src", relocated / "src")
shutil.copytree(PROJECT_ROOT / "config", relocated / "config")
return relocated
def test_catalog_and_scripts_work_after_project_and_data_roots_move(
relocated_project: Path, tmp_path: Path
) -> None:
data_root = tmp_path / "independent-data"
workflows = _run_relocated(relocated_project, data_root, "list", "--json")
scripts = _run_relocated(
relocated_project, data_root, "scripts", "list", "--json"
)
assert workflows.returncode == 0, workflows.stderr
assert scripts.returncode == 0, scripts.stderr
assert len(json.loads(workflows.stdout)) == 40
commands = json.loads(scripts.stdout)
assert len(commands) == 62
assert len({row["command_id"] for row in commands}) == 62
assert all(row["legacy_script_id"].startswith(f"{row['module']}:") for row in commands)
@pytest.mark.parametrize(
"workflow_id",
(
"content.metrics.daily",
"product.daily",
"shop.metrics.weekly",
"supply.purchase_confirmation.daily",
),
)
def test_each_relocated_module_dry_runs_without_old_projects(
relocated_project: Path, tmp_path: Path, workflow_id: str
) -> None:
result = _run_relocated(
relocated_project,
tmp_path / "independent-data",
"run",
workflow_id,
"--date",
"2026-07-27",
)
assert result.returncode == 0, result.stderr