"""Regression test for #34192 — Dockerfile must keep the tini compat shim for orchestration templates that still reference /usr/bin/tini. This is a documentation-as-test guard: removing the shim is a real choice, but it should be done deliberately (e.g. once Hostinger's 'Hermes WebUI' catalog updates to /init) and not by accident. """ from __future__ import annotations from pathlib import Path def _dockerfile_text() -> str: return (Path(__file__).parent.parent / "Dockerfile").read_text(encoding="utf-8") def test_tini_compat_symlink_present(): """The /usr/bin/tini -> /init symlink line must exist for #34192.""" df = _dockerfile_text() assert "ln -sf /init /usr/bin/tini" in df, ( "Dockerfile must keep the tini compat symlink (#34192). " "Removing it breaks orchestration templates that still pin " "/usr/bin/tini as the entrypoint (Hostinger 'Hermes WebUI' " "catalog as of v0.14.x)." ) def test_tini_compat_comment_explains_why(): """The symlink line is comment-anchored to #34192 so a future reader knows why it exists. Removing the comment makes it look like dead code worth deleting.""" df = _dockerfile_text() assert "#34192" in df, ( "The Dockerfile tini compat shim must keep its #34192 anchor " "comment so future maintainers know why the symlink is there." ) def test_entrypoint_still_init_not_tini(): """Sanity check: the actual ENTRYPOINT is still /init (s6-overlay). The shim is for legacy external wrappers, not for the image's own runtime — that path must continue to use the canonical /init.""" df = _dockerfile_text() assert 'ENTRYPOINT [ "/init"' in df, ( "Dockerfile ENTRYPOINT must remain /init (s6-overlay). The " "tini shim is only for external wrappers that haven't been " "updated yet." )