115 lines
5.2 KiB
Python
115 lines
5.2 KiB
Python
"""参考挑选反馈的真实落账、幂等、信号聚合与呈现分派兼容;无模型调用。"""
|
||
|
||
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 呈现挑选
|