import inspect
import unittest


class PipelineMessageCallbackTest(unittest.TestCase):
    def test_single_argument_eos_is_not_ignored(self):
        from app.multi_pipeline import _pipeline_message_callback
        from app.stream_lifecycle import RoleRunHandle
        handle = RoleRunHandle('det', 1)
        callback = _pipeline_message_callback(handle)
        self.assertEqual(1, len(inspect.signature(callback).parameters))
        callback(type('EOSMessage', (), {})())
        self.assertEqual('bus_eos', handle.failure.failure_stage)

    def test_finite_eos_and_state_message(self):
        from app.multi_pipeline import _pipeline_message_callback
        from app.stream_lifecycle import RoleRunHandle
        events = []
        handle = RoleRunHandle('det', 1, lambda *args: events.append(args))
        callback = _pipeline_message_callback(handle, finite=True)
        callback(type('EOSMessage', (), {})())
        callback(type('StateTransitionMessage', (), {})())
        self.assertIsNone(handle.failure)
        self.assertTrue(any(event[2] == 'source_stage' for event in events))
