From 10ade55525a320dbf2f92f2550c74d24b99d8931 Mon Sep 17 00:00:00 2001 From: migatu Date: Wed, 26 Aug 2026 15:50:53 +0200 Subject: [PATCH] =?UTF-8?q?astrodemo:=20do=20obrazu=20wchodzi=20wy=C5=82?= =?UTF-8?q?=C4=85cznie=20kod=20aplikacji?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `COPY . .` wnosiło do obrazu cały katalog usługi, razem z tests/. Leży tam plik pilnujący, żeby pewne słowa nie padły — wypisujący je wprost, bo inaczej nie da się ich sprawdzić. Trafiając do obrazu, stawał się dokładnie tym wyciekiem, przed którym broni: „pełna aplikacja", „astrololo", nazwy nieobecnych funkcji. Obraz tej usługi się KOMUŚ ODDAJE, więc waży to więcej niż gdzie indziej. To samo zawężenie zrobiłem wcześniej w warstwie prezentacji; astrodemo zostało przeoczone, bo powstało przed tamtą zmianą. Test pilnuje tego na przyszłość i czyta same instrukcje, bez komentarzy — komentarz obok cytuje dawną postać, więc szukanie po całym pliku zgłaszałoby własne wyjaśnienie. Co-Authored-By: Claude Opus 5 --- services/astrodemo/Dockerfile | 6 +++++- services/astrodemo/tests/test_slownik_zakazany.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/services/astrodemo/Dockerfile b/services/astrodemo/Dockerfile index c596363..860165e 100644 --- a/services/astrodemo/Dockerfile +++ b/services/astrodemo/Dockerfile @@ -4,7 +4,11 @@ WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -COPY . . +# Do obrazu wchodzi WYŁĄCZNIE kod aplikacji. `COPY . .` wnosiło też katalog +# tests/ — a leży w nim lista słów, które w tej usłudze nie mają prawa paść, +# wypisanych wprost. Obraz tej usługi się KOMUŚ ODDAJE, więc niósłby dokładnie +# to, co ten test ma pilnować. Przy okazji obraz jest mniejszy. +COPY app ./app EXPOSE 8005 CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8005"] diff --git a/services/astrodemo/tests/test_slownik_zakazany.py b/services/astrodemo/tests/test_slownik_zakazany.py index 19cc612..1348b37 100644 --- a/services/astrodemo/tests/test_slownik_zakazany.py +++ b/services/astrodemo/tests/test_slownik_zakazany.py @@ -175,3 +175,18 @@ def test_the_protocol_constants_are_the_one_known_exception(): assert any(z in linia for z in ("x-astrololo", "vnd.astrololo", "astrololo/link/", 'getlogger("astrololo')), \ f"{f.name}: „{linia.strip()[:70]}” to nie jest stała protokołu" + + +def test_only_the_application_code_ships_in_the_image(): + """Obraz nie może wieźć tego testu. + + Ironia, którą łatwo przeoczyć: plik pilnujący, żeby pewne słowa nie padły, + sam je wypisuje — więc gdy trafi do obrazu, staje się tym wyciekiem, przed + którym broni. `COPY . .` wnosiło cały katalog usługi, razem z tests/. + """ + # Same instrukcje, bez komentarzy: komentarz obok tej linii CYTUJE dawną + # postać, więc szukanie po całym pliku zgłaszałoby własne wyjaśnienie. + instrukcje = [l for l in (APP.parent / "Dockerfile").read_text(encoding="utf-8").splitlines() + if l.strip() and not l.lstrip().startswith("#")] + assert not any(l.strip() == "COPY . ." for l in instrukcje), "obraz wnosi wszystko, w tym testy" + assert any(l.strip() == "COPY app ./app" for l in instrukcje)