from __future__ import annotations import unittest from app.main import ( ReactFlowProjectPayload, build_reactflow_system_xml, pydantic_to_jsonable, ) class ReactFlowProjectMediumReferenceVersionTests(unittest.TestCase): def test_version_one_is_accepted_and_serialized(self) -> None: project = ReactFlowProjectPayload( name="versioned-medium-references", mediumReferenceVersion=1, ) self.assertEqual(project.mediumReferenceVersion, 1) self.assertEqual( pydantic_to_jsonable(project)["mediumReferenceVersion"], 1, ) def test_other_medium_reference_versions_are_rejected(self) -> None: for version in (0, 2, -1, "1"): with self.subTest(version=version): with self.assertRaises(ValueError): ReactFlowProjectPayload( name="unsupported-medium-references", mediumReferenceVersion=version, ) def test_legacy_project_without_version_remains_compatible(self) -> None: project = ReactFlowProjectPayload(name="legacy-project") self.assertIsNone(project.mediumReferenceVersion) self.assertIsNone(project.amesimParameterEncodingVersion) self.assertNotIn( "amesimParameterEncodingVersion", pydantic_to_jsonable(project), ) def test_xml_export_adds_default_property_model_to_legacy_medium_node(self) -> None: project = ReactFlowProjectPayload( name="legacy-medium-node", mediumReferenceVersion=1, nodes=[ { "id": "air_1", "position": {"x": 10, "y": 20}, "data": { "label": "Air 1", "componentType": "amesim_ideal_air_medium", "modelType": "amesim_ideal_air_medium", "ports": [], "parameters": {"gi": 1}, }, } ], ) xml = build_reactflow_system_xml(project).decode("utf-8") self.assertIn('