实现侧: - 上下文:任务范围拆分为 范围校验/范围授权;索引按可发现口径重建、索引新鲜度改对称差;依赖校验统一快照漂移说明。 - 知识方法:方法与材料读取口径统一;超限方法材料按可选省略,核对路径不再二次计费;删除无合同的读时重算。 - 任务运行:新增 context.usage/tool.denied 事件类型;连接池常驻并在装配生命周期内开关;调用结算与核对分列。 - 效果评测/审校修订/交付连载/作者经验/作品规划:凭据冻结、标定消费、导出补证、事实引文核对等收尾修复。 - 资源加载:能力正文不再夹带索引用的导航注记(该注记此前进入角色与技能的模型提示)。 - 元数据:受保护骨架与代码保护属性对齐;字段校验与内置结构口径同步。 - 基础设施:环境预检进入装配生命周期;数据库连接运行期字段不参与相等比较;索引指纹归一化 jsonb 浮点。 - 删除被替代实现:7 份旧提示词模板与空壳 资料来源 读取器。 用例侧: - 用例身份与导航元信息迁移;夹具补生命周期、同库暴露与模板封存; - 本轮定向修复:方法材料省略、事实引文、迁移回执、额度与暂停用例、慢用例超时预算等。
98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
"""榜单登记和旧登记项消费的地址边界;合成读取器,不发网络。"""
|
|
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
from fastapi import HTTPException
|
|
|
|
from muse.接入.http.路由.资料研究 import 采集快照
|
|
from muse.资料研究 import 榜单快照
|
|
from muse.资料研究.接口 import 资料服务
|
|
from muse.资料研究.模型 import 资料错误
|
|
|
|
|
|
@pytest.mark.case_id("NC-O07-B03-001")
|
|
@pytest.mark.parametrize(
|
|
"url",
|
|
[
|
|
"file:///etc/passwd",
|
|
"ftp://example.invalid",
|
|
"https:///ranking",
|
|
"example.invalid",
|
|
"https://user:secret@example.invalid/rank",
|
|
"https://@example.invalid",
|
|
"https://example.invalid@",
|
|
"https://exam ple.invalid",
|
|
"https://example.invalid\n/rank",
|
|
"https://example.invalid\\rank",
|
|
"https://example.invalid:abc",
|
|
"https://example.invalid:65536",
|
|
"https://example.invalid:0",
|
|
"https://[bad-address]",
|
|
"https://example.invalid/#section",
|
|
"https://-bad.invalid",
|
|
"https://bad..invalid",
|
|
"https://%65xample.invalid",
|
|
"https://exam\x00ple.invalid",
|
|
],
|
|
)
|
|
def test_非法榜单地址在调用存储前拒绝(url, monkeypatch):
|
|
writes = []
|
|
monkeypatch.setattr(
|
|
榜单快照,
|
|
"资料存储",
|
|
lambda conn: SimpleNamespace(登记榜单源=lambda *args: writes.append(args)),
|
|
)
|
|
with pytest.raises(资料错误, match="榜单地址"):
|
|
资料服务().登记榜单(None, "ranking", "合成榜单", url)
|
|
assert writes == []
|
|
|
|
|
|
@pytest.mark.case_id("NC-O07-B03-002")
|
|
@pytest.mark.parametrize(
|
|
"url",
|
|
[
|
|
"https://example.invalid/ranking?kind=new",
|
|
"http://localhost:8080/rank",
|
|
"https://[::1]:8443/rank",
|
|
"https://例子.测试/榜单",
|
|
"https://example.invalid./rank",
|
|
],
|
|
)
|
|
def test_合法URL原样登记不请求目标(url, monkeypatch):
|
|
writes = []
|
|
monkeypatch.setattr(
|
|
榜单快照,
|
|
"资料存储",
|
|
lambda conn: SimpleNamespace(登记榜单源=lambda *args: writes.append(args)),
|
|
)
|
|
资料服务().登记榜单(None, "ranking", "合成榜单", url)
|
|
assert writes == [("ranking", "合成榜单", url, "html")]
|
|
|
|
|
|
@pytest.mark.case_id("NC-O07-B03-003")
|
|
def test_旧非法登记不能绕过读取器调用前验证():
|
|
calls = []
|
|
cursor = SimpleNamespace(
|
|
execute=lambda *args: SimpleNamespace(
|
|
fetchone=lambda: {"url": "file:///private", "采集方式": "html"}
|
|
)
|
|
)
|
|
conn = SimpleNamespace(cursor=lambda **kwargs: cursor)
|
|
reader = SimpleNamespace(抓取=lambda *args: calls.append(args))
|
|
with pytest.raises(资料错误, match="榜单地址"):
|
|
资料服务().采集榜单快照(conn, "ranking", reader)
|
|
assert calls == []
|
|
|
|
|
|
@pytest.mark.case_id("NC-O07-B03-004")
|
|
def test_未注入真实读取器仍返回503且不建联():
|
|
def unexpected():
|
|
raise AssertionError("未注入读取器时不能请求数据库")
|
|
|
|
app = SimpleNamespace(配置=SimpleNamespace(), 要求数据库=unexpected)
|
|
request = SimpleNamespace(app=SimpleNamespace(state=SimpleNamespace(装配=app)))
|
|
with pytest.raises(HTTPException) as error:
|
|
采集快照("ranking", request, "author")
|
|
assert error.value.status_code == 503
|