diff --git a/tests/unit/test_base/test_flow_processor.py b/tests/unit/test_base/test_flow_processor.py new file mode 100644 index 00000000..8fb5c707 --- /dev/null +++ b/tests/unit/test_base/test_flow_processor.py @@ -0,0 +1,105 @@ +""" +Unit tests for trustgraph.base.flow_processor +Starting small with a single test to verify basic functionality +""" + +import pytest +from unittest.mock import AsyncMock, MagicMock, patch +from unittest import IsolatedAsyncioTestCase + +# Import the service under test +from trustgraph.base.flow_processor import FlowProcessor + + +class TestFlowProcessorSimple(IsolatedAsyncioTestCase): + """Test FlowProcessor base class functionality""" + + @patch('trustgraph.base.async_processor.AsyncProcessor.__init__') + @patch('trustgraph.base.async_processor.AsyncProcessor.register_config_handler') + async def test_flow_processor_initialization_basic(self, mock_register_config, mock_async_init): + """Test basic FlowProcessor initialization""" + # Arrange + mock_async_init.return_value = None + mock_register_config.return_value = None + + config = { + 'id': 'test-flow-processor', + 'taskgroup': AsyncMock() + } + + # Act + processor = FlowProcessor(**config) + + # Assert + # Verify AsyncProcessor.__init__ was called + mock_async_init.assert_called_once() + + # Verify register_config_handler was called with the correct handler + mock_register_config.assert_called_once_with(processor.on_configure_flows) + + # Verify FlowProcessor-specific initialization + assert hasattr(processor, 'flows') + assert processor.flows == {} + assert hasattr(processor, 'specifications') + assert processor.specifications == [] + + @patch('trustgraph.base.async_processor.AsyncProcessor.__init__') + @patch('trustgraph.base.async_processor.AsyncProcessor.register_config_handler') + async def test_register_specification(self, mock_register_config, mock_async_init): + """Test registering a specification""" + # Arrange + mock_async_init.return_value = None + mock_register_config.return_value = None + + config = { + 'id': 'test-flow-processor', + 'taskgroup': AsyncMock() + } + + processor = FlowProcessor(**config) + mock_spec = MagicMock() + mock_spec.name = 'test-spec' + + # Act + processor.register_specification(mock_spec) + + # Assert + assert len(processor.specifications) == 1 + assert processor.specifications[0] == mock_spec + + @patch('trustgraph.base.flow_processor.Flow') + @patch('trustgraph.base.async_processor.AsyncProcessor.__init__') + @patch('trustgraph.base.async_processor.AsyncProcessor.register_config_handler') + async def test_start_flow(self, mock_register_config, mock_async_init, mock_flow_class): + """Test starting a flow""" + # Arrange + mock_async_init.return_value = None + mock_register_config.return_value = None + + config = { + 'id': 'test-flow-processor', + 'taskgroup': AsyncMock() + } + + processor = FlowProcessor(**config) + processor.id = 'test-processor' # Set id for Flow creation + + mock_flow = AsyncMock() + mock_flow_class.return_value = mock_flow + + flow_name = 'test-flow' + flow_defn = {'config': 'test-config'} + + # Act + await processor.start_flow(flow_name, flow_defn) + + # Assert + assert flow_name in processor.flows + # Verify Flow was created with correct parameters + mock_flow_class.assert_called_once_with('test-processor', flow_name, processor, flow_defn) + # Verify the flow's start method was called + mock_flow.start.assert_called_once() + + +if __name__ == '__main__': + pytest.main([__file__]) \ No newline at end of file