import os import shutil import subprocess import time import socket import urllib.request import pytest def docker_available(): return shutil.which("docker") is not None def wait_for_http(url, timeout=30): end = time.time() + timeout last_exc = None while time.time() < end: try: with urllib.request.urlopen(url, timeout=3) as r: body = r.read().decode('utf-8', errors='ignore') return r.getcode(), body except Exception as e: last_exc = e time.sleep(0.5) raise RuntimeError(f"HTTP check failed after {timeout}s: {last_exc}") @pytest.mark.skipif(not docker_available(), reason="Docker is not available on this runner") @pytest.mark.integration def test_build_run_and_cleanup_docker(): image_tag = "scenar-creator:latest" container_name = "scenar-creator-test" port = int(os.environ.get('SCENAR_TEST_PORT', '8080')) # Build image subprocess.run(["docker", "build", "-t", image_tag, "."], check=True) # Ensure no leftover container subprocess.run(["docker", "rm", "-f", container_name], check=False) try: # Run container subprocess.run([ "docker", "run", "-d", "--name", container_name, "-p", f"{port}:8080", image_tag ], check=True) # Wait for HTTP and verify content code, body = wait_for_http(f"http://127.0.0.1:{port}/") assert code == 200 assert "Vytvoření Scénáře" in body or "Scenar" in body or "Vytvoření" in body finally: # Cleanup container and image subprocess.run(["docker", "rm", "-f", container_name], check=False) subprocess.run(["docker", "rmi", image_tag], check=False)