Files
hermes-web-ui/tests/server/runtime-environment.test.ts
ekko c4082ee661 fix: guide Docker users through image upgrades (#2033)
* fix(docker): guard update button in Docker with structured guidance

Docker 环境下 UI 升级按钮不可用的问题修复:

后端:
- handleUpdate 中添加 Docker 环境检测,返回结构化的 Docker 升级指引
  (docker compose pull && docker compose up -d --force-recreate)
- health 接口添加 is_docker 字段,告知前端当前运行环境
- Docker 环境下自动禁用 npm registry 版本检查,消除每 30 分钟的外网请求
  (性能优化:减少不必要的网络 I/O 和重复的版本检查)

前端:
- AppSidebar 中在 Docker 模式下隐藏原有升级按钮,改为显示 Docker 专属
  升级按钮,点击后弹出包含 docker compose 命令的指引弹窗
- VersionManagementModal 的 isDesktopShell 条件保持不变
- 添加 9 种语言的 i18n 翻译键 (dockerUpdateTitle / dockerUpdateGuide
  / dockerUpdateNote)

Co-Authored-By: AtomCode (deepseek-v4-flash) <noreply@atomgit.com>

* fix docker update guidance tests

* reuse update button for Docker guidance

* test Docker update routing

---------

Co-authored-by: suantea <suantea@users.noreply.github.com>
Co-authored-by: AtomCode (deepseek-v4-flash) <noreply@atomgit.com>
2026-07-11 10:24:39 +08:00

43 lines
1.5 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from 'vitest'
const originalContainer = process.env.container
async function loadRuntimeEnvironment(
options: { dockerEnvFile?: boolean; container?: string } = {},
) {
vi.resetModules()
if (options.container === undefined) delete process.env.container
else process.env.container = options.container
const existsSync = vi.fn((path: string) => path === '/.dockerenv' && options.dockerEnvFile === true)
vi.doMock('fs', () => ({ existsSync }))
const runtimeEnvironment = await import('../../packages/server/src/services/runtime-environment')
return { ...runtimeEnvironment, existsSync }
}
describe('runtime environment detection', () => {
afterEach(() => {
vi.doUnmock('fs')
vi.resetModules()
if (originalContainer === undefined) delete process.env.container
else process.env.container = originalContainer
})
it('does not classify a regular Web UI process as Docker', async () => {
const { isDockerContainer } = await loadRuntimeEnvironment()
expect(isDockerContainer()).toBe(false)
})
it('detects the Docker environment marker file', async () => {
const { isDockerContainer } = await loadRuntimeEnvironment({ dockerEnvFile: true })
expect(isDockerContainer()).toBe(true)
})
it('detects the Docker container environment variable', async () => {
const { isDockerContainer } = await loadRuntimeEnvironment({ container: 'docker' })
expect(isDockerContainer()).toBe(true)
})
})