"""隔离 PG 验证索引触发守卫与跨 owner 同事务回滚;本批未获外部执行授权。""" import psycopg import pytest import test_上下文快照与索引写入 as 方法测试 from muse.上下文 import 索引维护 from muse.共享.调用身份 import 用途 pytestmark = pytest.mark.数据库 方法环境 = 方法测试.方法环境 @pytest.mark.case_id("NC-O07-INDEX-PG-001") def test_索引所有写语句推进代次且失败事务整体回滚(方法环境): _, 作者, 服务, 来源, _, 库 = 方法环境 回执 = 服务.提出方法(作者, "guard-proposal", 方法测试._提案(source_id=str(来源.source_id))) 方法测试._确认(服务, 作者, 回执["target_ref"]) with 库[用途.维护].连接(只读=True) as 连: 初始 = 连.execute("SELECT generation FROM muse_method_index_guard").fetchone()[0] with pytest.raises(RuntimeError, match="回滚整个变更"): with 库[用途.维护].连接() as 连, 连.transaction(): 语句们 = ( "INSERT INTO muse_method_index SELECT * FROM muse_method_index WHERE false", "UPDATE muse_method_index SET 检索文本=检索文本 || ' changed'", "DELETE FROM muse_method_index WHERE false", "TRUNCATE muse_method_index", "INSERT INTO muse_method_index_version " "(索引身份,embedder,method_count,active) " "SELECT 索引身份,embedder,method_count,false " "FROM muse_method_index_version WHERE false", "UPDATE muse_method_index_version SET 索引身份=索引身份 || ' changed'", "DELETE FROM muse_method_index_version WHERE false", "TRUNCATE muse_method_index_version", ) for 次数, 语句 in enumerate(语句们, 1): 连.execute(语句) 当前 = 连.execute("SELECT generation FROM muse_method_index_guard").fetchone()[0] assert 当前 == 初始 + 次数 raise RuntimeError("回滚整个变更") with 库[用途.维护].连接(只读=True) as 连: assert 连.execute("SELECT generation FROM muse_method_index_guard").fetchone()[0] == 初始 assert 服务.核对索引(作者)["新鲜"] @pytest.mark.case_id("NC-O07-INDEX-PG-002") def test_派生索引完成后失败使正式版本条目头和代次一起回滚(方法环境, monkeypatch): _, 作者, 服务, 来源, _, 库 = 方法环境 请求 = 方法测试._提案(source_id=str(来源.source_id)) 回执 = 服务.提出方法(作者, "rollback-index", 请求) with 库[用途.维护].连接(只读=True) as 连: 初始 = 连.execute("SELECT generation FROM muse_method_index_guard").fetchone()[0] 原提交 = 索引维护.方法索引参与者.提交 def 完成后失败(self, 连, 操作): 原提交(self, 连, 操作) raise RuntimeError("派生保存后的故障") monkeypatch.setattr(索引维护.方法索引参与者, "提交", 完成后失败) with pytest.raises(RuntimeError, match="派生保存后的故障"): 方法测试._确认(服务, 作者, 回执["target_ref"]) 详情 = 服务.读取方法详情(作者, 请求.method_id) assert 详情["state"] == "proposed" and 详情["current_version"] == 0 assert 详情["versions"] == [] with 库[用途.维护].连接(只读=True) as 连: assert 连.execute("SELECT generation FROM muse_method_index_guard").fetchone()[0] == 初始 assert 连.execute("SELECT count(*) FROM muse_method_index").fetchone()[0] == 0 assert 连.execute("SELECT count(*) FROM muse_method_index_version").fetchone()[0] == 0 @pytest.mark.case_id("NC-O07-INDEX-PG-003") def test_应用角色不能直接复位索引代次(方法环境): _, _, _, _, _, 库 = 方法环境 with pytest.raises(psycopg.errors.InsufficientPrivilege): with 库[用途.生产].连接() as 连: 连.execute("UPDATE muse_method_index_guard SET generation=0")