"""参考挑选反馈的真实落账、幂等、信号聚合与呈现分派兼容;无模型调用。""" import pytest import test_作者偏好与反馈 as 偏好测试 from muse.作者经验.接口 import 参考挑选反馈请求, 挑选候选 from muse.共享.错误 import Muse错误 pytestmark = pytest.mark.数据库 候选环境 = 偏好测试.候选环境 环境 = 偏好测试.环境 def _请求(domain, selected, rejected, *, query="机甲近距格斗"): return 参考挑选反馈请求( query=query, domain=domain, candidates=( 挑选候选("mv-a", 1, 0.031), 挑选候选("mv-b", 2, 0.028), 挑选候选("mv-c", 3, 0.024), ), selected=selected, rejected=rejected, index_generation=7, ) @pytest.mark.case_id( "NC-w32-a10005", environment="隔离PG;实际S01/B05/B09/S02与合成HTTP,不证明文学效果", given="真实作者身份与固定参考挑选请求", when="经服务保存参考挑选反馈并重放同一命令", then=["反馈只追加落账且幂等;同命令不同内容拒绝"], contract="docs/系统架构/新版设计/模块设计/B07-作者经验.md#偏好双轨关系", ) def test_参考挑选落账幂等且同命令改内容拒绝__a10005(环境): service, author, _, _ = 环境 saved = service.记录参考挑选反馈(author, "ref-sel-1", _请求("combat", ("mv-a",), ("mv-c",))) assert saved["payload"]["种类"] == "参考挑选" assert saved["payload"]["selected"] == ["mv-a"] replay = service.记录参考挑选反馈(author, "ref-sel-1", _请求("combat", ("mv-a",), ("mv-c",))) assert replay["feedback_id"] == saved["feedback_id"] with pytest.raises(Muse错误) as 冲突: service.记录参考挑选反馈(author, "ref-sel-1", _请求("combat", ("mv-b",), ("mv-c",))) assert "IDEMPOTENCY_CONFLICT" in str(冲突.value) or "已保存不同内容" in str(冲突.value) @pytest.mark.case_id( "NC-w32-a10006", environment="隔离PG;实际S01/B05/B09/S02与合成HTTP,不证明文学效果", given="跨领域的多条真实参考挑选反馈", when="按全部领域与指定领域读取挑选信号", then=["选用与拒绝分列计数;位次保留样本;领域过滤生效"], contract="docs/系统架构/新版设计/模块设计/B07-作者经验.md#偏好双轨关系", ) def test_挑选信号分列计数与领域过滤__a10006(环境): service, author, _, _ = 环境 service.记录参考挑选反馈(author, "sig-1", _请求("combat", ("mv-a", "mv-b"), ("mv-c",))) service.记录参考挑选反馈( author, "sig-2", 参考挑选反馈请求( query="机甲近距格斗", domain="combat", candidates=(挑选候选("mv-b", 1, 0.03), 挑选候选("mv-a", 2, 0.02)), selected=("mv-b",), index_generation=7, ), ) service.记录参考挑选反馈(author, "sig-3", _请求("emotion", (), ("mv-a",), query="情感克制")) 信号 = {条["method_version_id"]: 条 for 条 in service.读取参考挑选信号(author)} assert 信号["mv-a"]["选用次数"] == 1 assert 信号["mv-a"]["拒绝次数"] == 1 assert 信号["mv-a"]["选中位次"] == [1] assert 信号["mv-b"]["选用次数"] == 2 assert 信号["mv-b"]["拒绝次数"] == 0 assert 信号["mv-b"]["选中位次"] == [1, 2] assert 信号["mv-c"]["选用次数"] == 0 assert 信号["mv-c"]["拒绝次数"] == 1 assert 信号["mv-c"]["选中位次"] == [] combat = {条["method_version_id"]: 条 for 条 in service.读取参考挑选信号(author, 领域="combat")} assert combat["mv-a"]["拒绝次数"] == 0 # 拒绝发生在 emotion 领域,不串算 assert combat["mv-a"]["选用次数"] == 1 assert combat["mv-c"]["拒绝次数"] == 1 信号情感 = service.读取参考挑选信号(author, 领域="emotion") emotion = {条["method_version_id"]: 条 for 条 in 信号情感} assert emotion["mv-a"]["选用次数"] == 0 assert emotion["mv-a"]["拒绝次数"] == 1 assert "mv-b" not in emotion @pytest.mark.case_id( "NC-w32-a10007", environment="隔离PG;实际S01/B05/B09/S02与合成HTTP,不证明文学效果", given="同一作者的改写对照反馈与参考挑选反馈", when="经统一呈现入口读取两类反馈", then=["按payload种类分派;存量改写对照合同不变"], contract="docs/系统架构/新版设计/模块设计/B07-作者经验.md#偏好双轨关系", ) def test_呈现反馈按种类分派且改写对照兼容__a10007(环境): service, author, _, 改写请求 = 环境 对照 = service.记录反馈(author, "cmp-compat", 改写请求) assert "种类" not in 对照["payload"] 呈现对照 = service.读取反馈(author, str(对照["feedback_id"])) assert 呈现对照["before_text"] and 呈现对照["after_text"] 挑选 = service.记录参考挑选反馈(author, "sel-compat", _请求("combat", ("mv-a",), ())) 呈现挑选 = service.读取反馈(author, str(挑选["feedback_id"])) assert 呈现挑选["请求"]["种类"] == "参考挑选" assert 呈现挑选["请求"]["selected"] == ("mv-a",) assert "before_text" not in 呈现挑选