57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
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)
|