Files
wehub-resource-sync 19ce5adb69
CI / Test (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Type Check (push) Has been cancelled
CI / Docker Tests (push) Has been cancelled
CI / Build (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:46:45 +08:00

105 lines
3.6 KiB
Python

"""Tests for Docker build process.
Docker tests that verify the Dockerfile and docker-compose configuration
are valid and can build successfully.
"""
import subprocess
from pathlib import Path
import pytest
# Project root directory
PROJECT_ROOT = Path(__file__).parent.parent.parent
@pytest.mark.docker
@pytest.mark.slow
class TestDockerBuild:
"""Tests for Docker build process."""
def test_dockerfile_exists(self):
"""Test that Dockerfile exists in project root."""
dockerfile = PROJECT_ROOT / "Dockerfile"
assert dockerfile.exists(), "Dockerfile not found in project root"
def test_docker_compose_exists(self):
"""Test that docker-compose.yml exists in project root."""
compose_file = PROJECT_ROOT / "docker-compose.yml"
assert compose_file.exists(), "docker-compose.yml not found in project root"
def test_docker_compose_config_valid(self):
"""Test that docker-compose configuration is valid."""
result = subprocess.run(
["docker", "compose", "config"],
cwd=PROJECT_ROOT,
capture_output=True,
text=True,
timeout=30,
)
assert result.returncode == 0, f"docker compose config failed: {result.stderr}"
def test_dockerfile_syntax_valid(self):
"""Test that Dockerfile has valid syntax using docker build --check."""
# Use docker build with --check flag (available in recent Docker versions)
# If not available, just verify the file can be parsed
dockerfile = PROJECT_ROOT / "Dockerfile"
content = dockerfile.read_text()
# Basic syntax checks
assert "FROM" in content, "Dockerfile must have a FROM instruction"
assert "ubuntu" in content.lower(), "Expected Ubuntu base image"
def test_docker_image_builds(self):
"""Test that Docker image builds successfully.
Note: This test is slow and requires Docker to be running.
It's marked with @pytest.mark.slow for optional skipping.
"""
result = subprocess.run(
["docker", "compose", "build"],
cwd=PROJECT_ROOT,
capture_output=True,
text=True,
timeout=600, # 10 minute timeout for build
)
# Check build succeeded
assert result.returncode == 0, f"Docker build failed:\n{result.stderr}"
def test_scripts_exist(self):
"""Test that required scripts exist."""
scripts_dir = PROJECT_ROOT / "scripts"
# Check config.sh
config_script = scripts_dir / "config.sh"
assert config_script.exists(), "scripts/config.sh not found"
# Check entrypoint.sh
entrypoint_script = scripts_dir / "entrypoint.sh"
assert entrypoint_script.exists(), "scripts/entrypoint.sh not found"
def test_entrypoint_script_syntax(self):
"""Test that entrypoint.sh has valid bash syntax."""
entrypoint = PROJECT_ROOT / "scripts" / "entrypoint.sh"
result = subprocess.run(
["bash", "-n", str(entrypoint)],
capture_output=True,
text=True,
timeout=10,
)
assert result.returncode == 0, f"entrypoint.sh syntax error: {result.stderr}"
def test_config_script_syntax(self):
"""Test that config.sh has valid bash syntax."""
config_script = PROJECT_ROOT / "scripts" / "config.sh"
result = subprocess.run(
["bash", "-n", str(config_script)],
capture_output=True,
text=True,
timeout=10,
)
assert result.returncode == 0, f"config.sh syntax error: {result.stderr}"