Files
MoviePilot/tests/test_database_backup_docker.py
T

55 lines
2.0 KiB
Python

"""数据库备份所需 Docker 运行时工具合同。"""
import re
from pathlib import Path
def test_runtime_image_installs_postgresql_18_client_from_pgdg() -> None:
"""Bookworm 镜像必须从签名的 PGDG 源安装固定主版本客户端。"""
dockerfile = (
Path(__file__).resolve().parents[1] / "docker" / "Dockerfile"
).read_text(encoding="utf-8")
assert re.search(
r"^FROM python:[^\s]+-slim-bookworm AS base$", dockerfile, re.MULTILINE
)
assert "https://www.postgresql.org/media/keys/ACCC4CF8.asc" in dockerfile
for curl_option in (
"--connect-timeout 10",
"--max-time 30",
"--retry 3",
"--retry-all-errors",
"--retry-max-time 90",
):
assert curl_option in dockerfile
keyring = "/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc"
assert f"chmod 0644 {keyring}" in dockerfile
assert f"signed-by={keyring}" in dockerfile
assert "https://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" in dockerfile
assert re.search(r"^\s+postgresql-client-18 \\$", dockerfile, re.MULTILINE)
assert not re.search(r"^\s+postgresql-client \\$", dockerfile, re.MULTILINE)
def test_runtime_image_keeps_pgdg_setup_architecture_neutral_and_cleans_apt_cache(
) -> None:
"""PGDG 原生架构解析需同时适用于 amd64/arm64,且不得遗留 APT 索引。"""
dockerfile = (
Path(__file__).resolve().parents[1] / "docker" / "Dockerfile"
).read_text(encoding="utf-8")
pgdg_sources = [
line for line in dockerfile.splitlines() if "apt.postgresql.org/pub/repos/apt" in line
]
assert len(pgdg_sources) == 1
pgdg_source = pgdg_sources[0]
assert "arch=" not in pgdg_source
runtime_packages = dockerfile[
dockerfile.index("FROM base AS prepare_package") :
dockerfile.index("FROM base AS prepare_venv")
]
assert "/var/lib/apt/lists/*" in runtime_packages
assert runtime_packages.index("postgresql-client-18") < runtime_packages.index(
"/var/lib/apt/lists/*"
)