class TestIncomingConnectionHandler(unittest.TestCase):

    def setUp(self):
        self.connection_handler = IncomingConnectionHandler()

    def test_sets_transport(self):
        self.connection_handler.connection_made('TRANSPORT')

        self.assertEqual(self.connection_handler.transport, 'TRANSPORT')

    @patch('pydht.incoming_connection_handler.decode', new=MagicMock(return_value={'q': 'some_query'}))
    def test_calls_attached_callback(self):
        """
        Tests that if the instance of `IncomingConnectionHandler` has an
        attached query handler, it is called
        """

        query_handler_mock = MagicMock()
        setattr(self.connection_handler, 'handle_some_query', query_handler_mock)

        self.connection_handler.datagram_received(b'some payload', ('localhost', 5000))

        query_handler_mock.assert_called_once_with({'q': 'some_query'}, ('localhost', 5000))

    @patch('pydht.incoming_connection_handler.decode', new=MagicMock(return_value={'q': 'some_query'}))
    def test_callback_does_not_exist(self):
        """
        Callback for the query does not exist and the method does not throw an exception
        """

        self.connection_handler.datagram_received(b'some payload', ('localhost', 5000))

    @patch('pydht.incoming_connection_handler.decode', new=MagicMock(return_value=10))
    def test_decoded_value_not_dictionary(self):
        """
        Handles cases where the function cannot extract the query
        """

        self.connection_handler.datagram_received(b'some payload', ('localhost', 5000))

    @patch('pydht.incoming_connection_handler.decode', side_effect=ValueError)
    def test_decode_failed(self, decode_mock):
        self.connection_handler.datagram_received(b'some payload', ('localhost', 5000))

    @patch('pydht.incoming_connection_handler.encode')
    def test_sends_response(self, encode_mock):
        encode_mock.return_value = b'some payload'

        transport_mock = MagicMock()
        self.connection_handler.transport = transport_mock

        self.connection_handler.respond({'message': 'payload'}, ('localhost', 5000))

        encode_mock.assert_called_once_with({'message': 'payload'})
        self.connection_handler.transport.sendto.assert_called_once_with(b'some payload', ('localhost', 5000))
 def setUp(self):
     self.connection_handler = IncomingConnectionHandler()