346 lines
15 KiB
Python
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 连通性与依赖版本'
|
|
)
|