"""目标操作的离线前置边界:无范围不连接,非空源只证明本次记录集。""" from __future__ import annotations import json import psycopg import pytest import 切换检查 from 入口 import main from 导入新库 import 导入快照 from 建立映射 import 旧快照, 映射配置, 迁移错误 from 核对结果 import 核对迁移结果 def _快照(): return 旧快照.从载荷( { "source": { "system": "sqlite", "database": "synthetic-range", "table": "runs", "id": "1", "revision": "export-v1", }, "record": {"id": "1"}, } ) @pytest.mark.case_id( "TC-bf16cbbf63b1", environment="离线合成快照与连接替身", when="旧库分流或迁移目标检查", contract="docs/系统架构/新版设计/数据模型/旧知识记录分流.md", ) @pytest.mark.parametrize("操作", [导入快照, 核对迁移结果]) def test_目标服务空输入在读取装配与建联前拒绝__bf16cb(monkeypatch, 操作): 连接 = [] monkeypatch.setattr(psycopg, "connect", lambda *a, **k: 连接.append((a, k))) with pytest.raises(迁移错误, match="snapshot_empty"): 操作(None, None, [], 映射配置({"works": []}), 允许实例=None, 管理引用=None, 目标回执=None) assert 连接 == [] @pytest.mark.case_id( "TC-887beeb51b19", environment="离线合成快照与连接替身", when="旧库分流或迁移目标检查", contract="docs/系统架构/新版设计/数据模型/旧知识记录分流.md", ) @pytest.mark.parametrize("基线空,当前空", [(True, True), (True, False), (False, True)]) def test_切换单双空在目标连接前拒绝__887bee(monkeypatch, 基线空, 当前空): 连接 = [] monkeypatch.setattr(psycopg, "connect", lambda *a, **k: 连接.append((a, k))) with pytest.raises(迁移错误, match="snapshot_empty"): 切换检查.检查切换条件( None, None, [] if 基线空 else [_快照()], [] if 当前空 else [_快照()], 映射配置({"works": []}), 允许实例=None, 管理引用=None, 目标回执=None, ) assert 连接 == [] @pytest.mark.case_id( "TC-3d9da1b66b44", environment="离线合成快照与连接替身", when="旧库分流或迁移目标检查", contract="docs/系统架构/新版设计/数据模型/旧知识记录分流.md", ) @pytest.mark.parametrize("当前坏", [False, True]) @pytest.mark.parametrize("坏原行", [None, "[]", "{", '{"id":"another"}']) def test_无来源范围的服务输入在目标连接前拒绝__3d9da1(monkeypatch, 当前坏, 坏原行): 坏 = {} if 坏原行 is None else 旧快照(_快照().source, 坏原行) 连接 = [] monkeypatch.setattr(psycopg, "connect", lambda *a, **k: 连接.append((a, k))) with pytest.raises(迁移错误, match="snapshot_invalid|source_invalid"): 切换检查.检查切换条件( None, None, [_快照()] if 当前坏 else [坏], [坏] if 当前坏 else [_快照()], 映射配置({"works": []}), 允许实例=None, 管理引用=None, 目标回执=None, ) assert 连接 == [] @pytest.mark.case_id( "TC-4a4d097ecfd5", environment="离线合成快照与连接替身", when="旧库分流或迁移目标检查", contract="docs/系统架构/新版设计/数据模型/旧知识记录分流.md", ) @pytest.mark.parametrize( "命令,基线空,当前空", [ ("导入目标", True, False), ("核对目标", True, False), ("切换检查", True, True), ("切换检查", True, False), ("切换检查", False, True), ], ) def test_CLI空范围早于配置读取建联及输出__4a4d09( tmp_path, monkeypatch, capsys, 命令, 基线空, 当前空 ): 连接 = [] monkeypatch.setattr(psycopg, "connect", lambda *a, **k: 连接.append((a, k))) 基线, 当前 = tmp_path / "基线.json", tmp_path / "当前.json" 基线.write_text(json.dumps([] if 基线空 else [_快照().导出()]), encoding="utf-8") 当前.write_text(json.dumps([] if 当前空 else [_快照().导出()]), encoding="utf-8") 输出 = tmp_path / "报告.json" 参数 = [命令, "--快照", str(基线), "--输出", str(输出)] for 键 in ("映射", "配置", "允许实例", "管理引用", "目标回执"): 参数 += ["--" + 键, str(tmp_path / (键 + ".不存在"))] if 命令 == "切换检查": 参数 += ["--当前快照", str(当前)] assert main(参数) == 1 assert "snapshot_empty" in capsys.readouterr().err assert 连接 == [] and not 输出.exists() @pytest.mark.case_id( "TC-25b77b5582f9", environment="离线合成快照与连接替身", when="旧库分流或迁移目标检查", contract="docs/系统架构/新版设计/数据模型/旧知识记录分流.md", ) @pytest.mark.parametrize("有增量", [False, True]) def test_非空切换报告不授予生产与整包权限__25b77b(monkeypatch, 有增量): monkeypatch.setattr(切换检查, "核对迁移结果", lambda *a, **k: {"data_checks_passed": True}) 原 = _快照() 值 = 原.导出() 值["record"]["detail"] = "合成增量" 值.pop("source_hash") 当前 = 旧快照.从载荷(值) if 有增量 else 原 结果 = 切换检查.检查切换条件(None, None, [原], [当前], 映射配置({"works": []})) assert 结果["data_checks_passed"] is (not 有增量) assert 结果["source_delta"]["changed"] == ([原.source.对象键] if 有增量 else []) assert 结果["production_switch_authorized"] is False assert 结果["package_acceptance_claimed"] is False