class TestService(unittest.TestCase):
    
    def setUp(self):
        self.caller = mock.MagicMock()
        from listenclosely_telegram.service import TelegramMessageServiceBackend
        self.service = TelegramMessageServiceBackend(self.caller)
        
    def _queue_thread(self, fn, *args, **kwargs):
        while not self.service.bot.listening:
            pass
        if fn:
            fn(*args, **kwargs)
        
    def _listen(self, asyn_action, timeout=0.3):
        self.input_thread = threading.Thread(target=self._queue_thread, args=(asyn_action,))
        self.input_thread.daemon = True
        self.input_thread.start()
        self.service.listen()
        self.assertFalse(self.service.bot.listening)
        
    def _disconnect(self):
        self.assertTrue(self.service.bot.listening)
        self.service.disconnect()
        
    def test_caller_assigned(self):       
        self.assertEqual(self.service.caller, self.caller)
        
    def test_disconnect(self):
        self.updates = [UpdateFactory()]
        with mock.patch('twx.botapi.TelegramBot.get_updates', callable=mock.MagicMock()) as mock_get_updates:
            mock_get_updates.return_value.wait = mock.MagicMock(return_value=self.updates)
            self._listen(self._disconnect)
            
    def test_offset(self):
        self.updates = [UpdateFactory()]
        with mock.patch('twx.botapi.TelegramBot.get_updates', callable=mock.MagicMock()) as mock_get_updates:
            mock_get_updates.return_value.wait = mock.MagicMock(return_value=self.updates)
            self._listen(self._disconnect)
            self.assertEqual(self.service.bot.offset-1, self.updates[0].update_id)
 def setUp(self):
     self.caller = mock.MagicMock()
     from listenclosely_telegram.service import TelegramMessageServiceBackend
     self.service = TelegramMessageServiceBackend(self.caller)