tests/ (Python backend tests, .mjs frontend rule tests) is no longer ignored. tools/run_tests.mjs runs the structure check, every tests/*.mjs and the Python tests with $PYTHON, the portable python_embeded or python. docs/guides/testing.md says how to run and write them; README links it. Developer notes no longer point at 18 test files that were removed earlier (AGENTS.md table, backend, frontend and update-guide notes). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
61 lines
2.8 KiB
Python
61 lines
2.8 KiB
Python
import json
|
|
from pathlib import Path
|
|
import sys
|
|
import tempfile
|
|
from types import SimpleNamespace
|
|
import unittest
|
|
from unittest import mock
|
|
|
|
PLUGIN = Path(__file__).resolve().parents[1]
|
|
sys.path[:0] = [str(PLUGIN), str(PLUGIN.parents[1])]
|
|
from api import materials, node_material
|
|
|
|
|
|
class NodeMaterialTests(unittest.IsolatedAsyncioTestCase):
|
|
def setUp(self):
|
|
temporary = tempfile.TemporaryDirectory()
|
|
self.addCleanup(temporary.cleanup)
|
|
self.root = Path(temporary.name)
|
|
patcher = mock.patch.object(materials, 'get_materials_dir', return_value=str(self.root))
|
|
patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
self.node = {'type': 'KSampler', 'title': 'Sampler', 'widgets_values': [123, 'fixed', 30, 5.5, 'euler', 'karras', 1]}
|
|
|
|
async def save(self, **body):
|
|
request = SimpleNamespace(json=mock.AsyncMock(return_value={'node': self.node, **body}))
|
|
response = await node_material.api_save_node_material(request)
|
|
return response.status, json.loads(response.body)
|
|
|
|
async def test_saved_node_reads_back_as_a_parameter_block(self):
|
|
status, data = await self.save(name='Slow and sharp')
|
|
self.assertEqual(status, 200)
|
|
self.assertEqual(data['material']['kind'], 'node_parameter_selection')
|
|
self.assertEqual(data['material']['node_types'], ['KSampler'])
|
|
result = materials._query_materials(str(self.root), {'category': 'params'})
|
|
self.assertEqual([item['name'] for item in result['materials']], ['Slow and sharp'])
|
|
record = materials._read_material(self.root / data['filename'])
|
|
blocks = materials._material_node_blocks(record, include_values=True)
|
|
self.assertEqual([(block['type'], block['widgets_values']) for block in blocks],
|
|
[('KSampler', self.node['widgets_values'])])
|
|
|
|
async def test_same_values_are_saved_once(self):
|
|
self.assertEqual((await self.save())[0], 200)
|
|
status, data = await self.save(name='Another name')
|
|
self.assertEqual(status, 409)
|
|
self.assertEqual(data['name'], 'Sampler') # the title is the default name
|
|
self.node = {**self.node, 'widgets_values': [123, 'fixed', 31, 5.5, 'euler', 'karras', 1]}
|
|
self.assertEqual((await self.save())[0], 200)
|
|
|
|
async def test_bad_input_saves_nothing(self):
|
|
for node in [None, {'type': '', 'widgets_values': [1]}, {'type': 'KSampler', 'widgets_values': []},
|
|
{'type': 'KSampler', 'widgets_values': 'x'}, {'type': 'K' * 201, 'widgets_values': [1]}]:
|
|
self.node = node
|
|
self.assertEqual((await self.save())[0], 400)
|
|
self.node = {'type': 'KSampler', 'widgets_values': [float('nan')]}
|
|
self.assertEqual((await self.save())[0], 400)
|
|
self.assertEqual(list(self.root.iterdir()), [])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|