async def test_reminder_scheduled(default_channel: CollectingOutputChannel, default_processor: MessageProcessor): sender_id = uuid.uuid4().hex reminder = ReminderScheduled("remind", datetime.datetime.now()) tracker = default_processor.tracker_store.get_or_create_tracker(sender_id) tracker.update(UserUttered("test")) tracker.update(ActionExecuted("action_schedule_reminder")) tracker.update(reminder) default_processor.tracker_store.save(tracker) await default_processor.handle_reminder(reminder, sender_id, default_channel, default_processor.nlg) # retrieve the updated tracker t = default_processor.tracker_store.retrieve(sender_id) assert t.events[-5] == UserUttered("test") assert t.events[-4] == ActionExecuted("action_schedule_reminder") assert isinstance(t.events[-3], ReminderScheduled) assert t.events[-2] == UserUttered(f"{EXTERNAL_MESSAGE_PREFIX}remind", intent={ "name": "remind", IS_EXTERNAL: True }) assert t.events[-1] == ActionExecuted("action_listen")
async def test_reminder_scheduled(default_channel: CollectingOutputChannel, default_processor: MessageProcessor): sender_id = uuid.uuid4().hex reminder = ReminderScheduled("utter_greet", datetime.datetime.now()) tracker = default_processor.tracker_store.get_or_create_tracker(sender_id) tracker.update(UserUttered("test")) tracker.update(ActionExecuted("action_reminder_reminder")) tracker.update(reminder) default_processor.tracker_store.save(tracker) await default_processor.handle_reminder(reminder, sender_id, default_channel, default_processor.nlg) # retrieve the updated tracker t = default_processor.tracker_store.retrieve(sender_id) assert t.events[-4] == UserUttered(None) assert t.events[-3] == ActionExecuted("utter_greet") assert t.events[-2] == BotUttered( "hey there None!", { "elements": None, "buttons": None, "quick_replies": None, "attachment": None, "image": None, "custom": None, }, ) assert t.events[-1] == ActionExecuted("action_listen")
async def test_reminder_scheduled(default_processor): out = CollectingOutputChannel() sender_id = uuid.uuid4().hex d = Dispatcher(sender_id, out, default_processor.nlg) r = ReminderScheduled("utter_greet", datetime.datetime.now()) t = default_processor.tracker_store.get_or_create_tracker(sender_id) t.update(UserUttered("test")) t.update(ActionExecuted("action_reminder_reminder")) t.update(r) default_processor.tracker_store.save(t) await default_processor.handle_reminder(r, d) # retrieve the updated tracker t = default_processor.tracker_store.retrieve(sender_id) assert t.events[-4] == UserUttered(None) assert t.events[-3] == ActionExecuted("utter_greet") assert t.events[-2] == BotUttered("hey there None!", { 'elements': None, 'buttons': None, 'attachment': None }) assert t.events[-1] == ActionExecuted("action_listen")
async def test_reminder_cancelled_multi_user( default_channel: CollectingOutputChannel, default_processor: MessageProcessor ): sender_ids = [uuid.uuid4().hex, uuid.uuid4().hex] trackers = [] for sender_id in sender_ids: tracker = default_processor.tracker_store.get_or_create_tracker(sender_id) tracker.update(UserUttered("test")) tracker.update(ActionExecuted("action_reminder_reminder")) tracker.update( ReminderScheduled( "greet", datetime.datetime.now(), kill_on_user_message=True ) ) trackers.append(tracker) # cancel all reminders (one) for the first user trackers[0].update(ReminderCancelled()) for tracker in trackers: default_processor.tracker_store.save(tracker) await default_processor._schedule_reminders( tracker.events, tracker, default_channel, default_processor.nlg ) # check that the jobs were added assert len((await jobs.scheduler()).get_jobs()) == 2 for tracker in trackers: await default_processor._cancel_reminders(tracker.events, tracker) # check that only one job was removed assert len((await jobs.scheduler()).get_jobs()) == 1 # execute the jobs await wait_until_all_jobs_were_executed(timeout_after_seconds=5.0) tracker_0 = default_processor.tracker_store.retrieve(sender_ids[0]) # there should be no utter_greet action assert ( UserUttered( f"{EXTERNAL_MESSAGE_PREFIX}greet", intent={INTENT_NAME_KEY: "greet", IS_EXTERNAL: True}, ) not in tracker_0.events ) tracker_1 = default_processor.tracker_store.retrieve(sender_ids[1]) # there should be utter_greet action assert ( UserUttered( f"{EXTERNAL_MESSAGE_PREFIX}greet", intent={INTENT_NAME_KEY: "greet", IS_EXTERNAL: True}, ) in tracker_1.events )
def test_json_parse_reminder(): evt = { "event": "reminder", "intent": "my_intent", "entities": {"entity1": "value1", "entity2": "value2"}, "date_time": "2018-09-03T11:41:10.128172", "name": "my_reminder", "kill_on_user_msg": True, } assert Event.from_parameters(evt) == ReminderScheduled( "my_intent", parser.parse("2018-09-03T11:41:10.128172"), name="my_reminder", kill_on_user_message=True, )
def test_json_parse_reminder(): # DOCS MARKER ReminderScheduled evt = { "event": "reminder", "action": "my_action", "date_time": "2018-09-03T11:41:10.128172", "name": "my_reminder", "kill_on_user_msg": True, } # DOCS END assert Event.from_parameters(evt) == ReminderScheduled( "my_action", parser.parse("2018-09-03T11:41:10.128172"), name="my_reminder", kill_on_user_message=True, )
def test_json_parse_reminder(): # DOCS MARKER ReminderScheduled evt = \ { 'event': 'reminder', 'action': 'my_action', 'date_time': '2018-09-03T11:41:10.128172', 'name': 'my_reminder', 'kill_on_user_msg': True } # DOCS END assert Event.from_parameters(evt) == ReminderScheduled( "my_action", parser.parse('2018-09-03T11:41:10.128172'), name='my_reminder', kill_on_user_message=True)
def tracker_with_six_scheduled_reminders( default_processor: MessageProcessor, ) -> DialogueStateTracker: reminders = [ ReminderScheduled("greet", datetime.now(), kill_on_user_message=False), ReminderScheduled( intent="greet", entities=[{ "entity": "name", "value": "Jane Doe" }], trigger_date_time=datetime.now(), kill_on_user_message=False, ), ReminderScheduled( intent="default", entities=[{ "entity": "name", "value": "Jane Doe" }], trigger_date_time=datetime.now(), kill_on_user_message=False, ), ReminderScheduled( intent="greet", entities=[{ "entity": "name", "value": "Bruce Wayne" }], trigger_date_time=datetime.now(), kill_on_user_message=False, ), ReminderScheduled("default", datetime.now(), kill_on_user_message=False), ReminderScheduled( "default", datetime.now(), kill_on_user_message=False, name="special", ), ] sender_id = uuid.uuid4().hex tracker = default_processor.tracker_store.get_or_create_tracker(sender_id) for reminder in reminders: tracker.update(UserUttered("test")) tracker.update(ActionExecuted("action_reminder_reminder")) tracker.update(reminder) default_processor.tracker_store.save(tracker) return tracker
async def test_reminder_aborted(default_processor): out = CollectingOutputChannel() sender_id = uuid.uuid4().hex d = Dispatcher(sender_id, out, default_processor.nlg) r = ReminderScheduled("utter_greet", datetime.datetime.now(), kill_on_user_message=True) t = default_processor.tracker_store.get_or_create_tracker(sender_id) t.update(r) t.update(UserUttered("test")) # cancels the reminder default_processor.tracker_store.save(t) await default_processor.handle_reminder(r, d) # retrieve the updated tracker t = default_processor.tracker_store.retrieve(sender_id) assert len(t.events) == 3 # nothing should have been executed
async def test_reminder_cancelled( default_channel: CollectingOutputChannel, default_processor: MessageProcessor ): sender_ids = [uuid.uuid4().hex, uuid.uuid4().hex] trackers = [] for sender_id in sender_ids: tracker = default_processor.tracker_store.get_or_create_tracker(sender_id) tracker.update(UserUttered("test")) tracker.update(ActionExecuted("action_reminder_reminder")) tracker.update( ReminderScheduled( "utter_greet", datetime.datetime.now(), kill_on_user_message=True ) ) trackers.append(tracker) # cancel reminder for the first user trackers[0].update(ReminderCancelled("utter_greet")) for tracker in trackers: default_processor.tracker_store.save(tracker) await default_processor._schedule_reminders( tracker.events, tracker, default_channel, default_processor.nlg ) # check that the jobs were added assert len((await jobs.scheduler()).get_jobs()) == 2 for tracker in trackers: await default_processor._cancel_reminders(tracker.events, tracker) # check that only one job was removed assert len((await jobs.scheduler()).get_jobs()) == 1 # execute the jobs await asyncio.sleep(5) tracker_0 = default_processor.tracker_store.retrieve(sender_ids[0]) # there should be no utter_greet action assert ActionExecuted("utter_greet") not in tracker_0.events tracker_1 = default_processor.tracker_store.retrieve(sender_ids[1]) # there should be utter_greet action assert ActionExecuted("utter_greet") in tracker_1.events
async def test_reminder_restart(default_channel: CollectingOutputChannel, default_processor: MessageProcessor): sender_id = uuid.uuid4().hex reminder = ReminderScheduled("utter_greet", datetime.datetime.now(), kill_on_user_message=False) tracker = default_processor.tracker_store.get_or_create_tracker(sender_id) tracker.update(reminder) tracker.update(Restarted()) # cancels the reminder tracker.update(UserUttered("test")) default_processor.tracker_store.save(tracker) await default_processor.handle_reminder(reminder, sender_id, default_channel, default_processor.nlg) # retrieve the updated tracker t = default_processor.tracker_store.retrieve(sender_id) assert len(t.events) == 4 # nothing should have been executed
(ConversationResumed(), None), (StoryExported(), None), (ActionReverted(), None), (UserUtteranceReverted(), None), (ActionExecuted("my_action"), ActionExecuted("my_other_action")), (FollowupAction("my_action"), FollowupAction("my_other_action")), ( BotUttered("my_text", {"my_data": 1}), BotUttered("my_other_test", {"my_other_data": 1}), ), ( AgentUttered("my_text", "my_data"), AgentUttered("my_other_test", "my_other_data"), ), ( ReminderScheduled("my_action", datetime.now()), ReminderScheduled("my_other_action", datetime.now()), ), ], ) def test_event_has_proper_implementation(one_event, another_event): # equals tests assert (one_event != another_event ), "Same events with different values need to be different" assert one_event == copy.deepcopy( one_event), "Event copies need to be the same" assert one_event != 42, "Events aren't equal to 42!" # hash test assert hash(one_event) == hash( copy.deepcopy(one_event)), "Same events should have the same hash"