aa30fe0ce6
- ToolAgentOutput 移除 result_summary 和 ui_hints,统一使用 result 字段 - 日历/用户查找工具移除 ui_hints 输出,改为机器可读的结构化结果 - Agent History 移除 tool 消息的 ui_hints 处理逻辑 - App 版本检查改为 manifest.json 方式,支持多渠道发布 - 更新 settings 配置和测试用例适配新结构
120 lines
3.4 KiB
Python
120 lines
3.4 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
import pytest
|
|
|
|
from v1.app import router
|
|
|
|
|
|
def _write_manifest(tmp_path, data: dict):
|
|
manifest_file = tmp_path / "manifest.json"
|
|
manifest_file.write_text(json.dumps(data), encoding="utf-8")
|
|
return manifest_file
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_check_updates_returns_none_when_manifest_missing(monkeypatch) -> None:
|
|
monkeypatch.setattr(
|
|
router, "_manifest_file_path", lambda: router.PROJECT_ROOT / "missing.json"
|
|
)
|
|
|
|
result = await router.check_updates(
|
|
current_version_code=2,
|
|
current_version_name="0.1.1",
|
|
platform="android",
|
|
channel="release",
|
|
)
|
|
|
|
assert result.has_update is False
|
|
assert result.update_type == "none"
|
|
assert result.latest_version_name == "0.1.1"
|
|
assert result.latest_version_code == 2
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_check_updates_returns_optional_update(monkeypatch, tmp_path) -> None:
|
|
manifest_file = _write_manifest(
|
|
tmp_path,
|
|
{
|
|
"releases": [
|
|
{
|
|
"platform": "android",
|
|
"channel": "release",
|
|
"version_name": "0.1.2",
|
|
"version_code": 3,
|
|
"min_supported_version_code": 2,
|
|
"file_name": "social-app-android-v0.1.2+3-release.apk",
|
|
"release_notes": "优化体验",
|
|
}
|
|
]
|
|
},
|
|
)
|
|
monkeypatch.setattr(router, "_manifest_file_path", lambda: manifest_file)
|
|
monkeypatch.setattr(
|
|
router.config.app_version,
|
|
"download_base_url",
|
|
"https://download.example.com",
|
|
raising=False,
|
|
)
|
|
monkeypatch.setattr(
|
|
router.config.app_version,
|
|
"release_path_prefix",
|
|
"releases",
|
|
raising=False,
|
|
)
|
|
|
|
result = await router.check_updates(
|
|
current_version_code=2,
|
|
current_version_name="0.1.1",
|
|
platform="android",
|
|
channel="release",
|
|
)
|
|
|
|
assert result.has_update is True
|
|
assert result.update_type == "optional"
|
|
assert result.latest_version_name == "0.1.2"
|
|
assert result.latest_version_code == 3
|
|
assert result.min_supported_version_code == 2
|
|
assert (
|
|
result.download_url
|
|
== "https://download.example.com/releases/social-app-android-v0.1.2+3-release.apk"
|
|
)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_check_updates_returns_required_update(monkeypatch, tmp_path) -> None:
|
|
manifest_file = _write_manifest(
|
|
tmp_path,
|
|
{
|
|
"releases": [
|
|
{
|
|
"platform": "android",
|
|
"channel": "release",
|
|
"version_name": "0.1.3",
|
|
"version_code": 5,
|
|
"min_supported_version_code": 4,
|
|
"file_name": "social-app-android-v0.1.3+5-release.apk",
|
|
}
|
|
]
|
|
},
|
|
)
|
|
monkeypatch.setattr(router, "_manifest_file_path", lambda: manifest_file)
|
|
monkeypatch.setattr(
|
|
router.config.app_version,
|
|
"download_base_url",
|
|
"https://download.example.com",
|
|
raising=False,
|
|
)
|
|
|
|
result = await router.check_updates(
|
|
current_version_code=3,
|
|
current_version_name="0.1.1",
|
|
platform="android",
|
|
channel="release",
|
|
)
|
|
|
|
assert result.has_update is True
|
|
assert result.update_type == "required"
|
|
assert result.min_supported_version_code == 4
|