ShiErFeng/shierfeng-fastapi-backend/tests/cli/tui/adapters/test_app_ops_snapshots.py
2026-07-24 09:43:10 +08:00

346 lines
15 KiB
Python

from types import ModuleType, SimpleNamespace
from pytest import MonkeyPatch
def test_collect_app_page_snapshot_builds_env_config_and_route_sections(
monkeypatch: MonkeyPatch,
app_adapter: ModuleType,
) -> None:
def fake_run_nested_cli_command(*arguments: str, parse_json: bool = False) -> SimpleNamespace:
del parse_json
if arguments[0:2] == ('app', 'env'):
return SimpleNamespace(
payload={
'ok': True,
'runtime': {
'cliEnv': 'dev',
'configEnv': 'dev',
'appEnv': 'dev',
'envFile': '.env.dev',
'envFileExists': True,
'backendDir': '/srv/backend',
'pythonExecutable': '/opt/conda/envs/shierfeng-fastapi/bin/python',
},
}
)
if arguments[0:2] == ('app', 'config'):
return SimpleNamespace(
payload={
'ok': True,
'config': {
'name': 'ShiErFeng',
'host': '127.0.0.1',
'port': 8000,
'rootPath': '/',
'workers': 2,
'reload': True,
'disableSwagger': False,
'disableRedoc': True,
'logLevel': 'INFO',
'dbType': 'mysql',
'dbHost': '127.0.0.1',
'dbPort': 3306,
'dbDatabase': 'shierfeng',
'redisHost': '127.0.0.1',
'redisPort': 6379,
'transportCryptoEnabled': True,
'transportCryptoMode': 'strict',
},
}
)
if arguments[0:2] == ('app', 'routes'):
return SimpleNamespace(
payload={
'ok': True,
'count': 3,
'routes': [],
'groupedRoutes': {'system': [{}, {}], 'monitor': [{}]},
}
)
if arguments[0:2] == ('app', 'doctor'):
return SimpleNamespace(
payload={
'ok': True,
'env': 'dev',
'database': {'ok': True, 'message': '数据库连接成功'},
'redis': {'ok': True, 'message': 'Redis连接成功'},
'crypto': {'ok': True, 'message': '传输加密配置有效'},
}
)
if arguments[0:2] == ('completion', 'doctor'):
return SimpleNamespace(
payload={
'ok': True,
'message': 'completion 诊断信息已生成',
'activeShell': 'bash',
'projectDir': '/srv/backend',
'envChoices': ['dev', 'prod'],
'completeEnvVar': '_SHIERFENG_COMPLETE',
'recommendedInstallCommand': 'shierfeng completion install --shell=bash --activate',
'shells': {
'bash': {
'supported': True,
'detected': True,
'targetFile': '/tmp/shierfeng.bash',
'targetFileExists': True,
'rcFile': '/Users/demo/.bashrc',
'rcFileExists': True,
'autoDiscovery': False,
'sourceCommand': 'source /tmp/shierfeng.bash',
'recommendedInstallCommand': 'shierfeng completion install --shell=bash --activate',
},
'zsh': {'supported': True, 'detected': False, 'autoDiscovery': False},
'fish': {'supported': True, 'detected': False, 'autoDiscovery': True},
'powershell': {
'supported': True,
'detected': False,
'autoDiscovery': False,
'sourceCommand': '. "/tmp/shierfeng.ps1"',
'recommendedInstallCommand': 'shierfeng completion install --shell=powershell --activate',
},
},
}
)
if arguments[0:2] == ('completion', 'show'):
return SimpleNamespace(
returncode=0,
stdout='_SHIERFENG_COMPLETE=bash_complete\n_shierfeng_completion() {\n COMPREPLY=()\n}\n',
stderr='',
)
return SimpleNamespace(
payload={
'ok': True,
'count': 3,
'routes': [
{
'path': '/system/user/list',
'methods': ['GET'],
'summary': '查询用户列表',
}
],
'groupedRoutes': {
'system': [{}, {}],
'monitor': [{}],
},
}
)
monkeypatch.setattr(app_adapter.NESTED_CLI_SUPPORT, 'run', fake_run_nested_cli_command)
snapshot = app_adapter.APP_DETAIL_ADAPTER.collect_snapshot('dev')
assert snapshot.title == '应用'
assert (
snapshot.subtitle
== '聚焦:环境映射 / 配置摘要 / 启动前检查 | 当前已加载 3 条注册路由,可继续查看环境映射、配置摘要、启动前检查、补全诊断与路由状态'
)
assert [section.title for section in snapshot.sections] == [
'总览判断',
'环境解析',
'应用配置',
'依赖配置',
'启动前检查',
'补全诊断',
'补全脚本预览',
'补全安装入口',
'路由摘要',
'启动入口',
]
assert snapshot.search is not None
assert snapshot.search.placeholder == '按分区或内容搜索'
assert any('CLI 环境: dev' in line for line in snapshot.sections[0].lines)
assert any('CLI 目标环境: dev' in line for line in snapshot.sections[1].lines)
assert any('监听地址: 127.0.0.1:8000' in line for line in snapshot.sections[2].lines)
assert any('传输加密: 开启' in line for line in snapshot.sections[3].lines)
assert any('数据库: 正常' in line for line in snapshot.sections[4].lines)
assert any('活动 Shell: bash' in line for line in snapshot.sections[5].lines)
assert any('source /tmp/shierfeng.bash' in line for line in snapshot.sections[5].lines)
assert any('Shell: bash' in line for line in snapshot.sections[6].lines)
assert any('_SHIERFENG_COMPLETE=bash_complete' in line for line in snapshot.sections[6].lines)
assert any('completion install --activate --output=text' in line for line in snapshot.sections[7].lines)
assert any('system · 2 条' in line for line in snapshot.sections[8].lines)
assert any('app run --env=dev' in line for line in snapshot.sections[9].lines)
def test_collect_app_page_snapshot_applies_query_filter(
monkeypatch: MonkeyPatch,
app_adapter: ModuleType,
) -> None:
def fake_run_nested_cli_command(*arguments: str, parse_json: bool = False) -> SimpleNamespace:
del parse_json
if arguments[0:2] == ('app', 'env'):
return SimpleNamespace(payload={'ok': True, 'runtime': {'cliEnv': 'dev', 'configEnv': 'dev'}})
if arguments[0:2] == ('app', 'config'):
return SimpleNamespace(
payload={
'ok': True,
'config': {
'name': 'ShiErFeng',
'host': '127.0.0.1',
'port': 8000,
'rootPath': '/',
'workers': 2,
'reload': True,
'disableSwagger': False,
'disableRedoc': True,
'logLevel': 'INFO',
'dbType': 'mysql',
'dbHost': '127.0.0.1',
'dbPort': 3306,
'dbDatabase': 'shierfeng',
'redisHost': '127.0.0.1',
'redisPort': 6379,
'transportCryptoEnabled': True,
'transportCryptoMode': 'strict',
},
}
)
if arguments[0:2] == ('completion', 'doctor'):
return SimpleNamespace(
payload={
'ok': True,
'message': 'completion 诊断信息已生成',
'activeShell': 'bash',
'projectDir': '/srv/backend',
'envChoices': ['dev'],
'completeEnvVar': '_SHIERFENG_COMPLETE',
'recommendedInstallCommand': 'shierfeng completion install --shell=bash --activate',
'shells': {'bash': {'supported': True, 'detected': True, 'autoDiscovery': False}},
}
)
return SimpleNamespace(payload={'ok': True, 'count': 1, 'routes': [], 'groupedRoutes': {}})
monkeypatch.setattr(app_adapter.NESTED_CLI_SUPPORT, 'run', fake_run_nested_cli_command)
snapshot = app_adapter.APP_DETAIL_ADAPTER.collect_snapshot('dev', query='路由')
assert [section.title for section in snapshot.sections] == ['总览判断', '路由摘要']
assert snapshot.search is not None
assert snapshot.search.query == '路由'
def test_collect_ops_page_snapshot_builds_health_dependency_and_server_sections(
monkeypatch: MonkeyPatch,
ops_adapter: ModuleType,
) -> None:
def fake_run_nested_cli_command(*arguments: str, parse_json: bool = False) -> SimpleNamespace:
del parse_json
if arguments[0:2] == ('ops', 'health'):
return SimpleNamespace(
payload={
'ok': True,
'env': 'dev',
'database': {'ok': True, 'message': '数据库连接成功'},
'redis': {'ok': True, 'message': 'Redis连接成功'},
}
)
if arguments[0:2] == ('ops', 'ping-db'):
return SimpleNamespace(payload={'ok': True, 'message': '数据库连接成功'})
if arguments[0:2] == ('ops', 'ping-redis'):
return SimpleNamespace(payload={'ok': True, 'message': 'Redis连接成功'})
if arguments[0:2] == ('ops', 'deps'):
return SimpleNamespace(
payload={
'ok': True,
'message': '核心运行依赖已安装',
'missingRequired': [],
'packages': {
'python': {'installed': True, 'version': '3.10.0'},
'fastapi': {'installed': True, 'version': '0.111.0'},
'sqlalchemy': {'installed': True, 'version': '2.0.0'},
'redis': {'installed': True, 'version': '5.0.0'},
'typer': {'installed': True, 'version': '0.12.0'},
'alembic': {'installed': True, 'version': '1.13.0'},
},
}
)
return SimpleNamespace(
payload={
'ok': True,
'server': {
'sys': {
'computerName': 'shierfeng-node',
'computerIp': '10.0.0.8',
'osName': 'Linux',
'osArch': 'x86_64',
},
'cpu': {'cpuNum': 8, 'used': 21.5},
'mem': {'total': '16 GB', 'usage': 48.2},
'py': {'version': '3.10.0', 'runTime': '2天4小时', 'used': '256 MB', 'total': '1 GB'},
'sysFiles': [
{
'dirName': '/',
'used': '120 GB',
'total': '256 GB',
'usage': '46%',
'free': '136 GB',
}
],
},
}
)
monkeypatch.setattr(ops_adapter.NESTED_CLI_SUPPORT, 'run', fake_run_nested_cli_command)
snapshot = ops_adapter.OPS_DETAIL_ADAPTER.collect_snapshot('dev')
assert snapshot.title == '运维'
assert (
snapshot.subtitle
== '聚焦:数据库连通性 / Redis 连通性 / 依赖版本 | 基础探活和依赖状态正常,可继续查看服务器资源与磁盘样本'
)
assert [section.title for section in snapshot.sections] == [
'总览判断',
'健康检查',
'数据库探活',
'Redis 探活',
'依赖版本',
'服务器摘要',
'磁盘样本',
'生产巡检入口',
]
assert any('探活状态: 正常' in line for line in snapshot.sections[0].lines)
assert any('数据库: 正常' in line for line in snapshot.sections[1].lines)
assert any('数据库连接: 正常' in line for line in snapshot.sections[2].lines)
assert any('Redis 连接: 正常' in line for line in snapshot.sections[3].lines)
assert any('fastapi · 已安装' in line for line in snapshot.sections[4].lines)
assert any('主机名: shierfeng-node' in line for line in snapshot.sections[5].lines)
assert any('使用率 46%' in line for line in snapshot.sections[6].lines)
assert any('wizard prod-check' in line for line in snapshot.sections[7].lines)
assert snapshot.search is not None
assert snapshot.search.placeholder == '按分区或内容搜索'
def test_collect_ops_page_snapshot_surfaces_health_risk_subtitle(
monkeypatch: MonkeyPatch,
ops_adapter: ModuleType,
) -> None:
def fake_run_nested_cli_command(*arguments: str, parse_json: bool = False) -> SimpleNamespace:
del parse_json
if arguments[0:2] == ('ops', 'health'):
return SimpleNamespace(
payload={
'ok': False,
'env': 'dev',
'database': {'ok': False, 'message': '数据库连接失败'},
'redis': {'ok': True, 'message': 'Redis连接成功'},
}
)
if arguments[0:2] == ('ops', 'ping-db'):
return SimpleNamespace(payload={'ok': False, 'message': '数据库连接失败'})
if arguments[0:2] == ('ops', 'ping-redis'):
return SimpleNamespace(payload={'ok': True, 'message': 'Redis连接成功'})
if arguments[0:2] == ('ops', 'deps'):
return SimpleNamespace(payload={'ok': True, 'missingRequired': [], 'packages': {}, 'message': '依赖正常'})
return SimpleNamespace(payload={'ok': True, 'server': {'sys': {}, 'cpu': {}, 'mem': {}, 'py': {}}})
monkeypatch.setattr(ops_adapter.NESTED_CLI_SUPPORT, 'run', fake_run_nested_cli_command)
snapshot = ops_adapter.OPS_DETAIL_ADAPTER.collect_snapshot('dev')
assert (
snapshot.subtitle
== '聚焦:数据库连通性 / Redis 连通性 / 依赖版本 | 运维探活存在异常,优先核对数据库/Redis 连通性与依赖版本'
)