Files
AIGame/Tools/tests/test_scene_component_pipeline.py

55 lines
2.6 KiB
Python

"""Guard the shared scene CLI's no-service planning and reuse paths."""
import contextlib
import io
import json
from pathlib import Path
import sys
import tempfile
import unittest
from unittest import mock
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
import scene_component_pipeline as pipeline
class SceneComponentPlanningTests(unittest.TestCase):
def invoke(self, root, data, *extra):
manifest = root / 'scene.json'
manifest.write_text(json.dumps(data), encoding='utf-8')
output = io.StringIO()
with mock.patch.object(pipeline, 'ROOT', root), contextlib.redirect_stdout(output), \
mock.patch.object(pipeline.subprocess, 'run', side_effect=AssertionError('Planner called a service')):
code = pipeline.main(argv=['--manifest', str(manifest), '--part', 'tree', *extra])
return code, json.loads(output.getvalue())
def test_dry_run_works_without_highpoly_or_backend_and_does_not_create_outputs(self):
with tempfile.TemporaryDirectory() as folder:
root = Path(folder)
code, plan = self.invoke(root, {'sceneId': 'NewScene', 'components': [
{'type': 'tree', 'designImage': 'design/tree.png', 'targetTriangles': 700}]}, '--dry-run')
self.assertEqual(code, 0)
self.assertEqual(plan['highpolyCommand'][-3], '50k')
self.assertEqual(plan['steps'][1:3], ['studio_lowpoly', 'studio_uv'])
self.assertFalse((root / 'Tools').exists())
def test_reused_prefab_needs_no_design_image_or_source_model(self):
with tempfile.TemporaryDirectory() as folder:
code, result = self.invoke(Path(folder), {'sceneId': 'NewScene', 'components': [
{'type': 'tree', 'generationStatus': 'reused', 'prefab': 'Assets/Common/tree.prefab'}]})
self.assertEqual(code, 0)
self.assertEqual(result, {'part': 'tree', 'status': 'reused', 'prefab': 'Assets/Common/tree.prefab'})
def test_output_override_cannot_write_outside_production_directory(self):
with tempfile.TemporaryDirectory() as folder, contextlib.redirect_stderr(io.StringIO()):
root = Path(folder)
with self.assertRaises(SystemExit) as error:
self.invoke(root, {'sceneId': 'NewScene', 'components': [
{'id': 'tree', 'designImage': 'tree.png', 'targetTriangles': 700}]},
'--output-dir', str(root / 'Assets'), '--dry-run')
self.assertEqual(error.exception.code, 2)
self.assertFalse((root / 'Assets').exists())
if __name__ == '__main__':
unittest.main()