from __future__ import annotations import unittest from govoplan_workflow.backend.bpmn import ( BpmnInspectionError, inspect_bpmn_xml, ) BPMN = """ """ class BpmnInspectionTests(unittest.TestCase): def test_inventory_classifies_native_and_interchange_elements(self) -> None: result = inspect_bpmn_xml(BPMN) self.assertTrue(result.valid_xml) self.assertEqual(1, result.process_count) self.assertEqual(1, result.executable_process_count) self.assertEqual(1, result.collaboration_count) self.assertEqual(3, result.element_counts["sequenceFlow"]) review = next( item for item in result.elements if item.element_id == "Review_1" ) collaboration = next( item for item in result.elements if item.element_id == "Collaboration_1" ) self.assertEqual("native_execution", review.support_level) self.assertEqual("interchange_only", collaboration.support_level) def test_dangling_references_are_reported(self) -> None: result = inspect_bpmn_xml( BPMN.replace('targetRef="End_1"', 'targetRef="Missing_1"') ) self.assertFalse(result.valid_xml) self.assertTrue( any( item.code == "dangling_bpmn_reference" for item in result.diagnostics ) ) def test_entities_are_rejected(self) -> None: unsafe = """]> &xxe;""" with self.assertRaisesRegex( BpmnInspectionError, "not safe and well formed", ): inspect_bpmn_xml(unsafe) def test_non_bpmn_root_is_rejected(self) -> None: with self.assertRaisesRegex( BpmnInspectionError, "bpmn:definitions", ): inspect_bpmn_xml("") if __name__ == "__main__": unittest.main()