89 lines
2.6 KiB
Python
89 lines
2.6 KiB
Python
# tests/test_docker_build.py
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
import time
|
|
|
|
import pytest
|
|
import requests
|
|
|
|
|
|
IMAGE_NAME = "manual_slop:test"
|
|
CONTAINER_NAME = "manual_slop_test_container"
|
|
WEB_PORT = 18080
|
|
HOOK_PORT = 18999
|
|
|
|
|
|
@pytest.mark.docker
|
|
def test_docker_image_builds(tmp_path):
|
|
"""Build the Docker image. Slow; opt-in."""
|
|
if os.environ.get("RUN_DOCKER_TEST") != "1":
|
|
pytest.skip("Set RUN_DOCKER_TEST=1 to enable")
|
|
if not _docker_available():
|
|
pytest.skip("Docker not available in this environment")
|
|
|
|
repo_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
result = subprocess.run(
|
|
["docker", "build", "-t", IMAGE_NAME, "."],
|
|
cwd=repo_root,
|
|
capture_output=True, text=True, timeout=600,
|
|
)
|
|
assert result.returncode == 0, f"Docker build failed: {result.stderr}"
|
|
|
|
|
|
@pytest.mark.docker
|
|
def test_docker_container_starts_and_responds():
|
|
"""Run the container, verify web and hook endpoints respond."""
|
|
if os.environ.get("RUN_DOCKER_TEST") != "1":
|
|
pytest.skip("Set RUN_DOCKER_TEST=1 to enable")
|
|
if not _docker_available():
|
|
pytest.skip("Docker not available in this environment")
|
|
|
|
_cleanup_container()
|
|
|
|
repo_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
result = subprocess.run(
|
|
[
|
|
"docker", "run", "-d",
|
|
"--name", CONTAINER_NAME,
|
|
"-p", f"{WEB_PORT}:8080",
|
|
"-p", f"{HOOK_PORT}:8999",
|
|
IMAGE_NAME,
|
|
],
|
|
cwd=repo_root,
|
|
capture_output=True, text=True, timeout=30,
|
|
)
|
|
assert result.returncode == 0, f"Docker run failed: {result.stderr}"
|
|
|
|
try:
|
|
start = time.time()
|
|
ready = False
|
|
while time.time() - start < 90:
|
|
try:
|
|
r = requests.get(f"http://127.0.0.1:{HOOK_PORT}/status", timeout=1)
|
|
if r.status_code == 200:
|
|
ready = True
|
|
break
|
|
except (requests.ConnectionError, requests.Timeout):
|
|
pass
|
|
time.sleep(1)
|
|
assert ready, "Container hook API did not respond within 90s"
|
|
|
|
r = requests.get(f"http://127.0.0.1:{WEB_PORT}/", timeout=5)
|
|
assert r.status_code == 200
|
|
body = r.content.lower()
|
|
assert b"<html" in body or b"<!doctype" in body, "Web endpoint did not return HTML"
|
|
|
|
finally:
|
|
_cleanup_container()
|
|
|
|
|
|
def _docker_available() -> bool:
|
|
return shutil.which("docker") is not None
|
|
|
|
|
|
def _cleanup_container() -> None:
|
|
subprocess.run(
|
|
["docker", "rm", "-f", CONTAINER_NAME],
|
|
capture_output=True,
|
|
) |