import fs from 'fs' import path from 'path' describe('deploy-registry.ps1', () => { const script = fs.readFileSync( path.join(process.cwd(), 'deploy-registry.ps1'), 'utf8' ) it('远程部署默认包含升级前数据库、对象存储和 .env 备份', () => { expect(script).toContain('[switch]$NoRemoteDbBackup') expect(script).toContain('[switch]$NoRemoteObjectStorageBackup') expect(script).toContain('[string]$RemoteBackupHelperImage = "busybox:1.36"') expect(script).toContain('env_backup="$backup_dir/.env.before-upgrade"') expect(script).toContain("docker compose -f \"$compose_file\" exec -T postgres sh -c 'pg_dump") expect(script).toContain('test -s "$db_backup"') expect(script).toContain('backup_minio_volume()') expect(script).toContain('docker volume inspect "$minio_volume_name"') expect(script).toContain('tar -czf /backup/minio-data.tar.gz') expect(script).toContain('OBJECT_STORAGE_EXTERNAL.txt') expect(script).toContain('backup_minio_volume') }) it('远程部署失败时默认会恢复旧 APP_IMAGE 或旧容器镜像', () => { expect(script).toContain('[switch]$NoRollback') expect(script).toContain('rollback()') expect(script).toContain('trap rollback ERR') expect(script.indexOf('trap rollback ERR')).toBeLessThan(script.indexOf('upsert_env APP_IMAGE')) expect(script).toContain('rollback_image="$old_container_image"') expect(script).toContain('docker compose -f "$compose_file" up -d --no-deps --pull never --force-recreate "$compose_service" || true') expect(script).toContain('自动回滚只恢复应用镜像和 .env,不自动恢复数据库') }) it('部署后校验运行镜像、版本文件和数据库迁移状态', () => { expect(script).toContain('verify_running_image') expect(script).toContain('actual_image="$(docker inspect "$container_id" --format') expect(script).toContain('运行镜像不匹配') expect(script).toContain('运行版本不匹配') expect(script).toContain('npx prisma migrate status --schema=prisma/schema.prisma') }) it('运行时镜像同步包含对象存储备份 helper', () => { expect(script).toContain('Source = "busybox:1.36"') expect(script).toContain('Repository = "runtime/busybox"') expect(script).toContain('Tag = "1.36"') }) it('远端 shell 变量应以单引号字符串保留,避免被 PowerShell 提前展开', () => { expect(script).toContain('$lines.Add(\'docker compose -f "$compose_file" up -d --pull never\')') expect(script).toContain('$lines.Add(\'docker compose -f "$compose_file" ps\')') expect(script).not.toContain('$lines.Add("docker compose -f `"$compose_file`"') }) })