Skip to content

Commit 1efd330

Browse files
committed
ConversationHandler: Fix python-telegram-bot#373
1 parent af3e8c6 commit 1efd330

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

telegram/ext/conversationhandler.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,11 @@ def update_state(self, new_state, key):
215215
if new_state == self.END:
216216
if key in self.conversations:
217217
del self.conversations[key]
218+
else:
219+
pass
218220

219221
elif isinstance(new_state, Promise):
220-
self.conversations[key] = (self.conversations[key], new_state)
222+
self.conversations[key] = (self.conversations.get(key), new_state)
221223

222224
elif new_state is not None:
223225
self.conversations[key] = new_state

tests/test_conversationhandler.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
sys.path.append('.')
3737

3838
from telegram import Update, Message, TelegramError, User, Chat, Bot
39-
from telegram.ext import *
39+
from telegram.ext import Updater, ConversationHandler, CommandHandler
4040
from tests.base import BaseTest
4141
from tests.test_updater import MockBot
4242

@@ -109,6 +109,9 @@ def _get_state(self, user_id):
109109
def start(self, bot, update):
110110
return self._set_state(update, self.THIRSTY)
111111

112+
def start_end(self, bot, update):
113+
return self._set_state(update, self.END)
114+
112115
def brew(self, bot, update):
113116
return self._set_state(update, self.BREWING)
114117

@@ -161,6 +164,48 @@ def test_addConversationHandler(self):
161164
sleep(.1)
162165
self.assertRaises(KeyError, self._get_state, user_id=second_user.id)
163166

167+
def test_endOnFirstMessage(self):
168+
self._setup_updater('', messages=0)
169+
d = self.updater.dispatcher
170+
user = User(first_name="Misses Test", id=123)
171+
172+
handler = ConversationHandler(
173+
entry_points=[CommandHandler('start', self.start_end)], states={}, fallbacks=[])
174+
d.add_handler(handler)
175+
queue = self.updater.start_polling(0.01)
176+
177+
# User starts the state machine and immediately ends it.
178+
message = Message(0, user, None, None, text="/start")
179+
queue.put(Update(update_id=0, message=message))
180+
sleep(.1)
181+
self.assertEquals(len(handler.conversations), 0)
182+
183+
def test_endOnFirstMessageAsync(self):
184+
self._setup_updater('', messages=0)
185+
d = self.updater.dispatcher
186+
user = User(first_name="Misses Test", id=123)
187+
188+
start_end_async = (lambda bot, update: d.run_async(self.start_end, bot, update))
189+
190+
handler = ConversationHandler(
191+
entry_points=[CommandHandler('start', start_end_async)], states={}, fallbacks=[])
192+
d.add_handler(handler)
193+
queue = self.updater.start_polling(0.01)
194+
195+
# User starts the state machine with an async function that immediately ends the
196+
# conversation. Async results are resolved when the users state is queried next time.
197+
message = Message(0, user, None, None, text="/start")
198+
queue.put(Update(update_id=0, message=message))
199+
sleep(.1)
200+
# Assert that the Promise has been accepted as the new state
201+
self.assertEquals(len(handler.conversations), 1)
202+
203+
message = Message(0, user, None, None, text="resolve promise pls")
204+
queue.put(Update(update_id=0, message=message))
205+
sleep(.1)
206+
# Assert that the Promise has been resolved and the conversation ended.
207+
self.assertEquals(len(handler.conversations), 0)
208+
164209

165210
if __name__ == '__main__':
166211
unittest.main()

0 commit comments

Comments
 (0)