import importlib.util from pathlib import Path from unittest.mock import patch import pytest PROJECT_ROOT = Path(__file__).resolve().parents[1] SCRIPT_PATH = PROJECT_ROOT / "tools" / "build_node.py" def load_launcher(): specification = importlib.util.spec_from_file_location( "node_asset_launcher", SCRIPT_PATH, ) module = importlib.util.module_from_spec(specification) specification.loader.exec_module(module) return module def test_blender_path_prefers_explicit_path(tmp_path): launcher = load_launcher() executable = tmp_path / "blender" executable.touch() with patch.dict("os.environ", {"BLENDER_BIN": "ignored"}): assert launcher.blender_path(executable) == executable def test_blender_path_reads_environment(tmp_path): launcher = load_launcher() executable = tmp_path / "blender" executable.touch() with patch.dict("os.environ", {"BLENDER_BIN": str(executable)}): assert launcher.blender_path() == executable def test_blender_path_reads_project_dotenv(tmp_path): launcher = load_launcher() executable = tmp_path / "Blender 4.5" / "blender.exe" executable.parent.mkdir() executable.touch() env_path = tmp_path / ".env" env_path.write_text( f'BLENDER_BIN="{executable}"\n', encoding="utf-8", ) with patch.dict("os.environ", {}, clear=True), patch.object( launcher, "PROJECT_ROOT", tmp_path, ): assert launcher.blender_path() == executable def test_blender_path_reports_missing_configuration(tmp_path): launcher = load_launcher() with patch.dict("os.environ", {}, clear=True), patch.object( launcher.shutil, "which", return_value=None, ), patch.object( launcher, "PROJECT_ROOT", tmp_path, ): with pytest.raises(RuntimeError, match="Blender not found"): launcher.blender_path()