实现侧: - 上下文:任务范围拆分为 范围校验/范围授权;索引按可发现口径重建、索引新鲜度改对称差;依赖校验统一快照漂移说明。 - 知识方法:方法与材料读取口径统一;超限方法材料按可选省略,核对路径不再二次计费;删除无合同的读时重算。 - 任务运行:新增 context.usage/tool.denied 事件类型;连接池常驻并在装配生命周期内开关;调用结算与核对分列。 - 效果评测/审校修订/交付连载/作者经验/作品规划:凭据冻结、标定消费、导出补证、事实引文核对等收尾修复。 - 资源加载:能力正文不再夹带索引用的导航注记(该注记此前进入角色与技能的模型提示)。 - 元数据:受保护骨架与代码保护属性对齐;字段校验与内置结构口径同步。 - 基础设施:环境预检进入装配生命周期;数据库连接运行期字段不参与相等比较;索引指纹归一化 jsonb 浮点。 - 删除被替代实现:7 份旧提示词模板与空壳 资料来源 读取器。 用例侧: - 用例身份与导航元信息迁移;夹具补生命周期、同库暴露与模板封存; - 本轮定向修复:方法材料省略、事实引文、迁移回执、额度与暂停用例、慢用例超时预算等。
69 lines
3.0 KiB
Python
69 lines
3.0 KiB
Python
"""单作者会话与错误合同;ASGI 传输不建立网络连接。"""
|
||
|
||
from pathlib import Path
|
||
|
||
import pytest
|
||
from fastapi.testclient import TestClient
|
||
|
||
from muse.接入.http.应用 import 创建应用
|
||
from muse.配置 import 应用配置, 数据库引用, 服务配置
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"NC-http-author-session",
|
||
environment="离线,ASGI真实接入与合成凭据",
|
||
given="单作者配置和合成访问口令,ASGI客户端",
|
||
when="访问健康、登录、伪造身份、错误来源写入及退出",
|
||
then=[
|
||
"进程存活与依赖不可用分别呈现",
|
||
"服务端认证并绑定作者,伪身份和错误Origin被拒,退出后会话失效",
|
||
],
|
||
contract="docs/系统架构/新版设计/接口契约/命令与作者决策.md",
|
||
)
|
||
def test_会话不能伪造作者且写入核对来源__a70001(tmp_path: Path, monkeypatch) -> None:
|
||
"""合成口令通过认证;客户端身份和错误来源无法获得写权限。"""
|
||
口令 = tmp_path / "访问口令.txt"
|
||
口令.write_text("synthetic-session-key-000000000000", encoding="utf-8")
|
||
配置 = 应用配置(
|
||
数据库引用("环境变量", "MUSE_HTTP_TEST_DB"),
|
||
"test",
|
||
HTTP=服务配置(str(口令), 公开地址="http://testserver", 允许来源=("http://testserver",)),
|
||
)
|
||
from muse.启动 import 构建默认运行
|
||
from muse.基础设施.数据库.连接 import 数据库工厂
|
||
|
||
装配 = 构建默认运行(配置)
|
||
# 认证合同不需要运行数据库;显式使用维护式直连并保留缺凭据的ready失败。
|
||
装配.数据库 = 数据库工厂(配置.数据库, 配置.运行用途)
|
||
monkeypatch.setattr("muse.接入.http.应用.构建默认运行", lambda *args, **kwargs: 装配)
|
||
with TestClient(创建应用(配置)) as 客户端:
|
||
assert 客户端.get("/health").status_code == 200
|
||
assert 客户端.get("/ready").status_code == 503
|
||
assert 客户端.get("/api/v1/session").status_code == 401
|
||
登录 = 客户端.post(
|
||
"/api/v1/session",
|
||
json={"password": "synthetic-session-key-000000000000", "decided_by": "forged"},
|
||
headers={"Origin": "http://testserver"},
|
||
)
|
||
assert 登录.status_code == 422
|
||
登录 = 客户端.post(
|
||
"/api/v1/session",
|
||
json={"password": "synthetic-session-key-000000000000"},
|
||
headers={"Origin": "http://testserver"},
|
||
)
|
||
assert 登录.status_code == 200
|
||
assert 登录.json()["author_id"] == "author-local"
|
||
assert "httponly" in 登录.headers["set-cookie"].lower()
|
||
assert (
|
||
客户端.delete(
|
||
"/api/v1/session", headers={"Origin": "https://outside.invalid"}
|
||
).status_code
|
||
== 403
|
||
)
|
||
assert 客户端.get("/api/v1/session").json()["author_id"] == "author-local"
|
||
assert (
|
||
客户端.delete("/api/v1/session", headers={"Origin": "http://testserver"}).status_code
|
||
== 200
|
||
)
|
||
assert 客户端.get("/api/v1/session").status_code == 401
|