"""Prüft das fertige Image, bevor es veröffentlicht wird. Wird von der CI in den Container gepipt: docker exec -i "$CID" python - < scripts/image-pruefen.py Bewusst eine eigene Datei statt eines Here-Dokuments im Workflow: ein unindentierter Block bricht den YAML-Block auf, und als Datei lässt sich das Ganze auch lokal gegen ein gebautes Image laufen lassen. Die Untergrenzen liegen bewusst unter dem Ist-Stand, damit der Test nicht bei jeder zusätzlichen Kategorie anschlägt. """ import json import sys import urllib.error import urllib.request BASIS = "http://localhost:8000" def hole(pfad: str): with urllib.request.urlopen(BASIS + pfad) as antwort: return json.load(antwort) def main() -> None: kategorien = hole("/api/v1/categories") groessen = hole("/api/v1/sizes") print(f"Kategorien: {len(kategorien)}, Grössen: {len(groessen)}") assert len(kategorien) >= 5, "zu wenige Kategorien - Stammdaten fehlen?" assert len(groessen) >= 20, "zu wenige Grössen - Stammdaten fehlen?" with urllib.request.urlopen(BASIS + "/") as antwort: seite = antwort.read().decode() assert "Kleider-Börse" in seite, "Galerie wird nicht ausgeliefert" # Das CSS entsteht in einer eigenen Build-Stufe und würde bei einem # Fehler dort still fehlen - die Seite käme dann ohne Gestaltung. assert "/static/style.css" in seite, "kein CSS eingebunden" print("Galerie und CSS: ok") # Ohne Anmeldung darf nichts geschrieben werden. try: urllib.request.urlopen(urllib.request.Request( BASIS + "/api/v1/items", method="POST", data=b'{"size":"80"}', headers={"Content-Type": "application/json"}, )) except urllib.error.HTTPError as fehler: assert fehler.code == 401, f"ergab {fehler.code}, erwartet 401" else: sys.exit("Schreiben war ohne Anmeldung möglich!") print("Schreibschutz greift.") if __name__ == "__main__": main()