Files
Text-Texture-Generator-for-…/tests/e2e/test_version_upgrade_detection.py
2025-10-12 10:45:29 +02:00

168 lines
5.5 KiB
Python

"""
E2E tests for version differentiation between free and pro builds.
These tests verify that Blender can recognize pro as an upgrade over free
by checking that built packages have different version tuples and edition indicators.
Tests informed by DEBUG investigation:
- Root cause: Both versions have identical bl_info["version"] tuples: (1, 0, 0)
- Both use same folder name: text_texture_generator/
- No edition indicator in bl_info["name"]
- Result: Blender sees them as identical, not as an upgrade
"""
import ast
import subprocess
import tempfile
import zipfile
from pathlib import Path
import pytest
@pytest.fixture
def build_artifacts(tmp_path):
"""Build both free and pro packages and return their paths."""
project_root = Path(__file__).parent.parent.parent
# Run build script to create both packages
result = subprocess.run(
["python", "scripts/build_addon.py", "--type", "all"],
cwd=project_root,
capture_output=True,
text=True,
timeout=30
)
if result.returncode != 0:
pytest.fail(f"Build script failed: {result.stderr}")
# Find the generated ZIP files in dist/
dist_dir = project_root / "dist"
# Get version from git or default to 1.0.0
free_zip = None
pro_zip = None
for zip_file in dist_dir.glob("text_texture_generator_v*.zip"):
if "_free.zip" in zip_file.name:
free_zip = zip_file
else:
pro_zip = zip_file
if not free_zip or not free_zip.exists():
pytest.fail(f"Free build not found in {dist_dir}")
if not pro_zip or not pro_zip.exists():
pytest.fail(f"Pro build not found in {dist_dir}")
yield {
"free_zip": free_zip,
"pro_zip": pro_zip,
"extract_dir": tmp_path / "extracted"
}
# Note: Build artifacts are in dist/ - not cleaned up here
# They may be needed for other tests or deployment
def extract_bl_info(zip_path: Path, extract_dir: Path) -> dict:
"""Extract bl_info dictionary from addon package using ast.literal_eval()."""
edition = "free" if "_free" in zip_path.name else "pro"
extract_path = extract_dir / edition
extract_path.mkdir(parents=True, exist_ok=True)
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
zip_ref.extractall(extract_path)
# Find __init__.py in the extracted addon
init_file = extract_path / "text_texture_generator" / "__init__.py"
if not init_file.exists():
pytest.fail(f"__init__.py not found in {zip_path.name}")
# Parse bl_info using ast.literal_eval() (Blender's method)
content = init_file.read_text()
# Extract bl_info dictionary exactly as Blender does
tree = ast.parse(content)
for node in ast.walk(tree):
if isinstance(node, ast.Assign):
for target in node.targets:
if isinstance(target, ast.Name) and target.id == "bl_info":
return ast.literal_eval(node.value)
pytest.fail(f"bl_info not found in {init_file}")
def test_built_packages_have_different_version_tuples(build_artifacts):
"""
Test that free and pro builds have different version tuples.
Blender identifies addons by (name, version) tuple. If both free and pro
have the same version, Blender won't recognize pro as an upgrade.
This test is informed by DEBUG investigation showing both versions have
identical version tuples: (1, 0, 0), causing Blender to see them as the
same addon rather than an upgrade path.
Expected to FAIL because currently both are (1, 0, 0).
"""
free_bl_info = extract_bl_info(
build_artifacts["free_zip"],
build_artifacts["extract_dir"]
)
pro_bl_info = extract_bl_info(
build_artifacts["pro_zip"],
build_artifacts["extract_dir"]
)
free_version = free_bl_info["version"]
pro_version = pro_bl_info["version"]
assert free_version != pro_version, (
f"Free and Pro versions must have different version tuples for Blender "
f"to recognize upgrade. Expected different, got both: {free_version}"
)
def test_bl_info_name_includes_edition_indicator(build_artifacts):
"""
Test that bl_info names include edition indicators (Free/Pro).
Users need to clearly see which edition they have installed in Blender's
addon preferences. The bl_info["name"] should include "Free" or "Pro".
This test is informed by DEBUG investigation showing both versions use the
same name "Text Texture Generator" with no edition indicator, making it
impossible for users to distinguish them in Blender's UI.
Expected to FAIL because currently both just say "Text Texture Generator".
"""
free_bl_info = extract_bl_info(
build_artifacts["free_zip"],
build_artifacts["extract_dir"]
)
pro_bl_info = extract_bl_info(
build_artifacts["pro_zip"],
build_artifacts["extract_dir"]
)
free_name = free_bl_info["name"]
pro_name = pro_bl_info["name"]
# Assert Free version has edition indicator
assert "Free" in free_name, (
f"bl_info name must indicate Free edition. "
f"Expected 'Free' in name, got: '{free_name}'"
)
# Assert Pro version has edition indicator
assert "Pro" in pro_name, (
f"bl_info name must indicate Pro edition. "
f"Expected 'Pro' in name, got: '{pro_name}'"
)
# Assert they are different
assert free_name != pro_name, (
f"bl_info name must indicate edition. "
f"Free: '{free_name}', Pro: '{pro_name}'"
)