|
363 | 363 | expect(result.stdout).toContain("SUBBOOST_MANAGER_URL=file://"); |
364 | 364 | }, 10_000); |
365 | 365 |
|
| 366 | + it("migrates old fixed official update sources to stable latest", () => { |
| 367 | + const script = ` |
| 368 | + set -Eeuo pipefail |
| 369 | + home="$(mktemp -d)" |
| 370 | + trap 'rm -rf "$home"' EXIT |
| 371 | + mkdir -p "$home/bin" |
| 372 | + cat > "$home/.env" <<'ENV' |
| 373 | +SUBBOOST_RELEASE_URL=https://github.com/SubBoost/subboost/releases/download/v2.4.0/release.json |
| 374 | +SUBBOOST_IMAGE=old-image |
| 375 | +POSTGRES_DB=subboost |
| 376 | +POSTGRES_USER=subboost |
| 377 | +POSTGRES_PASSWORD=password |
| 378 | +DATABASE_URL=postgresql://subboost:password@db:5432/subboost?schema=public |
| 379 | +ENCRYPTION_KEY=key |
| 380 | +JWT_SECRET=jwt |
| 381 | +CRON_SECRET=cron |
| 382 | +APP_URL=http://127.0.0.1:31000 |
| 383 | +SUBBOOST_PORT=31000 |
| 384 | +ENV |
| 385 | + : > "$home/docker-compose.yml" |
| 386 | + export SUBBOOST_SCRIPT_SOURCE_ONLY=1 |
| 387 | + export SUBBOOST_HOME="$home" |
| 388 | + export SUBBOOST_BIN="$home/bin/subboost" |
| 389 | + export SUBBOOST_DOCTOR_HEALTH_ATTEMPTS=1 |
| 390 | + export SUBBOOST_DOCTOR_HEALTH_INTERVAL_SECONDS=0 |
| 391 | + source local/scripts/subboost.sh |
| 392 | + sudo_do() { "$@"; } |
| 393 | + install_secret_file() { cp "$1" "$2"; } |
| 394 | + read_env_file() { cat "$ENV_FILE"; } |
| 395 | + download_log="$home/download-log" |
| 396 | + : > "$download_log" |
| 397 | + download_to_temp() { |
| 398 | + printf '%s\\n' "$1" >> "$download_log" |
| 399 | + case "$1" in |
| 400 | + *release.json) |
| 401 | + cat > "$2" <<'JSON' |
| 402 | +{"image":"new-image","composeUrl":"docker-compose.image.yml","managerUrl":"subboost-manager"} |
| 403 | +JSON |
| 404 | + ;; |
| 405 | + *) |
| 406 | + printf 'asset\\n' > "$2" |
| 407 | + ;; |
| 408 | + esac |
| 409 | + } |
| 410 | + docker_log="$home/docker-log" |
| 411 | + : > "$docker_log" |
| 412 | + docker() { |
| 413 | + if [ "$1" = "info" ]; then return 0; fi |
| 414 | + if [ "$1" = "compose" ]; then |
| 415 | + case "$*" in |
| 416 | + "compose version"*) return 0 ;; |
| 417 | + *" config") return 0 ;; |
| 418 | + *" pull") |
| 419 | + printf 'pull_image=%s\\n' "\${SUBBOOST_IMAGE:-}" >> "$docker_log" |
| 420 | + return 0 |
| 421 | + ;; |
| 422 | + *" up -d --remove-orphans") return 0 ;; |
| 423 | + *" up -d --no-deps --force-recreate app") return 0 ;; |
| 424 | + *" ps -q app") printf 'app-id\\n'; return 0 ;; |
| 425 | + *" ps -q db") printf 'db-id\\n'; return 0 ;; |
| 426 | + *" ps -q cron") printf 'cron-id\\n'; return 0 ;; |
| 427 | + esac |
| 428 | + fi |
| 429 | + if [ "$1" = "inspect" ]; then |
| 430 | + case "$*" in |
| 431 | + *".State.Status"*) printf 'running\\n'; return 0 ;; |
| 432 | + *".State.Health"*) printf 'healthy\\n'; return 0 ;; |
| 433 | + esac |
| 434 | + fi |
| 435 | + return 0 |
| 436 | + } |
| 437 | + curl() { return 0; } |
| 438 | + update_cmd |
| 439 | + cat "$download_log" |
| 440 | + cat "$docker_log" |
| 441 | + cat "$home/.env" |
| 442 | + `; |
| 443 | + |
| 444 | + const result = runBash(script); |
| 445 | + |
| 446 | + expect(result.status).toBe(0); |
| 447 | + expect(result.stdout).toContain("Detected old fixed release update source"); |
| 448 | + expect(result.stdout).toContain("https://github.com/SubBoost/subboost/releases/latest/download/release.json"); |
| 449 | + expect(result.stdout).toContain("pull_image=new-image"); |
| 450 | + expect(result.stdout).toContain( |
| 451 | + "SUBBOOST_RELEASE_URL=https://github.com/SubBoost/subboost/releases/latest/download/release.json" |
| 452 | + ); |
| 453 | + }, 10_000); |
| 454 | + |
366 | 455 | it("updates exact env keys without removing similarly prefixed names", () => { |
367 | 456 | const script = ` |
368 | 457 | set -Eeuo pipefail |
|
0 commit comments