Files
Text-Texture-Generator-for-…/tests/e2e/test_addon_real_blender.py
2025-10-10 11:28:22 +02:00

150 lines
4.8 KiB
Python

"""
E2E test: Real Blender addon testing in Docker with ZERO mocks.
This test validates the entire addon workflow in an actual Blender instance:
1. Package addon as zip
2. Install in real Blender (in Docker container)
3. Enable the addon
4. Execute texture generation with real text (including umlauts)
5. Verify texture is created successfully
NO MOCKS:
- Real bpy (Blender Python API)
- Real PIL (bundled with addon)
- Real addon code (generate_texture_image)
- Real Docker container with actual Blender
"""
import pytest
from pathlib import Path
import tarfile
import io
def test_shader_creation_with_texture_generates_successfully(
blender_container,
addon_package,
tmp_path
):
"""
E2E test: Install addon in real Blender and create texture shader.
This test uses ZERO mocks - everything runs in real Blender in Docker.
Test scenario (the exact bug case):
- Text: "böhm Kabel" + "NYY" (German umlauts)
- Dimensions: 4096x512
- Expected: Texture generated successfully with actual text rendering
- Bug symptom: "Failed to generate texture image" error OR PIL import error
Asserts:
- No "Failed to generate texture image" error
- No PIL import errors (addon dependencies must work)
- Texture exists in bpy.data.images
- Texture has correct dimensions (4096x512)
- Shader nodes created and connected
"""
# Copy test script to container using tar archive
test_script = Path(__file__).parent / "scripts" / "test_texture_generation.py"
# Create tar archive with test script
tar_stream = io.BytesIO()
with tarfile.open(fileobj=tar_stream, mode='w') as tar:
# Add test script
script_info = tarfile.TarInfo(name='test_script.py')
script_info.size = test_script.stat().st_size
with open(test_script, 'rb') as f:
tar.addfile(script_info, f)
tar_stream.seek(0)
blender_container.put_archive('/addon-test', tar_stream)
# Copy addon package to container
addon_tar_stream = io.BytesIO()
with tarfile.open(fileobj=addon_tar_stream, mode='w') as tar:
addon_info = tarfile.TarInfo(name='text_texture_generator.zip')
addon_info.size = addon_package.stat().st_size
with open(addon_package, 'rb') as f:
tar.addfile(addon_info, f)
addon_tar_stream.seek(0)
blender_container.put_archive('/addon-test', addon_tar_stream)
container_script_path = "/addon-test/test_script.py"
container_addon_path = "/addon-test/text_texture_generator.zip"
# Install addon in Blender
install_cmd = [
"/usr/local/bin/run_blender.sh",
"--background",
"--python-expr",
(
"import bpy; "
f"bpy.ops.preferences.addon_install(filepath='{container_addon_path}'); "
"bpy.ops.preferences.addon_enable(module='text_texture_generator'); "
"bpy.ops.wm.save_userpref()"
)
]
install_result = blender_container.exec_run(
install_cmd,
workdir="/addon-test"
)
# Check installation succeeded
assert install_result.exit_code == 0, (
f"Addon installation failed with exit code {install_result.exit_code}\n"
f"Output: {install_result.output.decode('utf-8', errors='replace')}"
)
# Run the test script in Blender
test_cmd = [
"/usr/local/bin/run_blender.sh",
"--background",
"--python",
container_script_path
]
test_result = blender_container.exec_run(
test_cmd,
workdir="/addon-test"
)
output = test_result.output.decode('utf-8', errors='replace')
# Parse output for results
print("\n=== Blender Test Output ===")
print(output)
print("=== End Output ===\n")
# Assert: Script must exit with success code
assert test_result.exit_code == 0, (
f"Test script failed with exit code {test_result.exit_code}\n"
f"Output: {output}"
)
# Assert: Must see SUCCESS marker in output
assert "SUCCESS" in output, (
f"Expected SUCCESS marker in output, got:\n{output}"
)
# Assert: Must NOT see failure to generate texture
assert "Failed to generate texture image" not in output, (
f"Texture generation failed - bug still present!\n{output}"
)
# Assert: PIL must be available (no dependency errors allowed)
assert "ERROR: PIL dependency not available" not in output, (
f"PIL dependency not properly installed by Blender!\n{output}"
)
# Assert: Texture was created with correct dimensions
assert "created with size 4096x512" in output, (
f"Texture not created with expected dimensions\n{output}"
)
# Assert: Shader nodes were created and connected
assert "Shader nodes created and connected" in output, (
f"Shader nodes not properly set up\n{output}"
)