Skip to content

Commit

Permalink
Merge pull request #50 from jlmadurga/enhacement/stack_context
Browse files Browse the repository at this point in the history
State context by states
  • Loading branch information
jlmadurga committed Apr 24, 2016
2 parents d144b59 + 5f3054a commit 3a727df
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 19 deletions.
12 changes: 7 additions & 5 deletions microbot/models/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,16 @@ def update_chat_state(self, bot_service, message, chat_state, target_state, cont
if not chat_state:
logger.warning("Chat state for update chat %s not exists" %
(message.chat.id))
bot_service.create_chat_state(message, target_state, context)
bot_service.create_chat_state(message, target_state, {'_none': context})
else:
if chat_state.state != target_state:
if chat_state.state != target_state:
state_context = chat_state.ctx
state_context[chat_state.state.name.lower().replace(" ", "_")] = context
chat_state.ctx = state_context
chat_state.state = target_state
chat_state.ctx = context
chat_state.save()
logger.debug("Chat state updated:%s for message %s with %s" %
(target_state, message, context))
logger.debug("Chat state updated:%s for message %s with (%s,%s)" %
(target_state, message, chat_state.state, context))
else:
logger.debug("ChateState stays in %s" % target_state)

Expand Down
29 changes: 15 additions & 14 deletions tests/functional/test_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -504,8 +504,8 @@ def test_handler_with_state(self):
self._test_message(self.author_get)
self.assertEqual(TelegramChatState.objects.get(chat=self.chat).state, self.state_target)
state_context = TelegramChatState.objects.get(chat=self.chat).ctx
self.assertEqual(state_context['pattern'], {})
self.assertEqual(state_context['response']['data'][0], {'name': 'author1'})
self.assertEqual(state_context['state1']['pattern'], {})
self.assertEqual(state_context['state1']['response']['data'][0], {'name': 'author1'})
self.assertEqual(None, state_context.get('state_context', None))

def test_handler_with_state_no_to_target_beacuse_no_success(self):
Expand Down Expand Up @@ -568,9 +568,9 @@ def test_handler_with_state_still_no_chatstate(self):
self._test_message(self.author_get)
self.assertEqual(TelegramChatState.objects.get(chat=self.chat).state, self.state_target)
state_context = TelegramChatState.objects.get(chat=self.chat).ctx
self.assertEqual(state_context['pattern'], {})
self.assertEqual(state_context['response']['data'][0], {'name': 'author1'})
self.assertEqual(None, state_context.get('state_context', None))
self.assertEqual(state_context['_none']['pattern'], {})
self.assertEqual(state_context['_none']['response']['data'][0], {'name': 'author1'})
self.assertEqual(None, state_context['_none'].get('state_context', None))

def test_handler_with_state_still_no_chatstate_but_with_state_from_other_bot(self):
self.other_telegram_bot = factories.TelegramBotFactory(token='190880460:AAELDdTxhhfPbtPRyC59qPaVF5VBX4VGVes')
Expand Down Expand Up @@ -609,9 +609,9 @@ def test_handler_with_state_still_no_chatstate_but_with_state_from_other_bot(sel
self.assertEqual(TelegramChatState.objects.count(), 2)
self.assertEqual(TelegramChatState.objects.get(chat=self.chat, state__bot=self.bot).state, self.state_target)
state_context = TelegramChatState.objects.get(chat=self.chat, state__bot=self.bot).ctx
self.assertEqual(state_context['pattern'], {})
self.assertEqual(state_context['response']['data'][0], {'name': 'author1'})
self.assertEqual(None, state_context.get('state_context', None))
self.assertEqual(state_context['_none']['pattern'], {})
self.assertEqual(state_context['_none']['response']['data'][0], {'name': 'author1'})
self.assertEqual(None, state_context['_none'].get('state_context', None))

def test_get_request_with_more_priority(self):
Author.objects.create(name="author1")
Expand Down Expand Up @@ -646,7 +646,8 @@ def test_handler_with_state_context(self):
Author.objects.create(name="author1")
self.request = factories.RequestFactory(url_template=self.live_server_url + '/api/authors/',
method=Request.GET)
self.response = factories.ResponseFactory(text_template='{% for author in response.data %}<b>{{author.name}}</b>{{state_context.var}}{% endfor %}',
text_template = '{% for author in response.data %}<b>{{author.name}}</b>{{state_context.prev_state.var}}{% endfor %}'
self.response = factories.ResponseFactory(text_template=text_template,
keyboard_template='')
self.handler = factories.HandlerFactory(bot=self.bot,
pattern='/authors',
Expand All @@ -672,7 +673,7 @@ def test_handler_with_state_context(self):
self.chat_state = factories.TelegramChatStateFactory(chat=self.chat,
state=self.state,
user=self.user,
context='{"var":"in_context"}')
context='{"prev_state": {"var":"in_context"}}')
self.assertEqual(json.loads(self.chat_state.context), self.chat_state.ctx)
self._test_message(self.author_get_with_state_context)
self.assertEqual(TelegramChatState.objects.get(chat=self.chat).state, self.state_target)
Expand Down Expand Up @@ -751,10 +752,10 @@ def test_handler_with_state(self):
self._test_message(self.author_get_no_menu)
self.assertEqual(KikChatState.objects.get(chat=self.chat).state, self.state_target)
state_context = KikChatState.objects.get(chat=self.chat).ctx
self.assertEqual(state_context['pattern'], {})
self.assertEqual(state_context['response']['data'][0], {'name': 'author1'})
self.assertEqual(None, state_context.get('service', None))
self.assertEqual(None, state_context.get('state_context', None))
self.assertEqual(state_context['state1']['pattern'], {})
self.assertEqual(state_context['state1']['response']['data'][0], {'name': 'author1'})
self.assertEqual(None, state_context['state1'].get('service', None))
self.assertEqual(None, state_context['state1'].get('state_context', None))

def test_kik_limit_keyboard_ok(self):
keyboard = "[" + str(["menu_"+str(e) for e in range(1, 21)]) + "]"
Expand Down

0 comments on commit 3a727df

Please sign in to comment.