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, ) # 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)
async def test_reminder_cancelled_all( default_channel: CollectingOutputChannel, default_processor: MessageProcessor, tracker_with_six_scheduled_reminders: DialogueStateTracker, ): tracker = tracker_with_six_scheduled_reminders await default_processor._schedule_reminders(tracker.events, tracker, default_channel) # cancel all reminders await cancel_reminder_and_check(tracker, default_processor, ReminderCancelled(), 6, 0)
async def test_reminder_cancelled_by_intent( default_channel: CollectingOutputChannel, default_processor: MessageProcessor, tracker_with_six_scheduled_reminders: DialogueStateTracker, ): tracker = tracker_with_six_scheduled_reminders await default_processor._schedule_reminders(tracker.events, tracker, default_channel) # cancel the third, fifth, and sixth reminder await cancel_reminder_and_check(tracker, default_processor, ReminderCancelled(intent="default"), 6, 3)
async def test_reminder_cancelled_by_name( default_channel: CollectingOutputChannel, default_processor: MessageProcessor, tracker_with_six_scheduled_reminders: DialogueStateTracker, ): tracker = tracker_with_six_scheduled_reminders await default_processor._schedule_reminders(tracker.events, tracker, default_channel, default_processor.nlg) # cancel the sixth reminder await cancel_reminder_and_check(tracker, default_processor, ReminderCancelled("special"), 6, 5)
async def test_reminder_cancelled_cancels_job_with_name( default_channel: CollectingOutputChannel, default_processor: MessageProcessor): sender_id = "][]][xy,,=+2f'[:/;>] <0d]A[e_,02" reminder = ReminderScheduled(intent="greet", trigger_date_time=datetime.datetime.now()) job_name = reminder.scheduled_job_name(sender_id) reminder_cancelled = ReminderCancelled() assert reminder_cancelled.cancels_job_with_name(job_name, sender_id) assert not reminder_cancelled.cancels_job_with_name( job_name.upper(), sender_id)
async def test_reminder_cancelled_cancels_job_with_name_special_name( default_channel: CollectingOutputChannel, default_processor: MessageProcessor ): sender_id = "][]][xy,,=+2f'[:/; >]<0d]A[e_,02" name = "wkjbgr,34(,*&%^^&*(OP#LKMN V#NF# # #R" reminder = ReminderScheduled( intent="greet", trigger_date_time=datetime.datetime.now(), name=name ) job_name = reminder.scheduled_job_name(sender_id) reminder_cancelled = ReminderCancelled(name) assert reminder_cancelled.cancels_job_with_name(job_name, sender_id) assert not reminder_cancelled.cancels_job_with_name(job_name.upper(), sender_id)
async def test_reminder_cancelled_by_entities( default_channel: CollectingOutputChannel, default_processor: MessageProcessor, tracker_with_six_scheduled_reminders: DialogueStateTracker, ): tracker = tracker_with_six_scheduled_reminders await default_processor._schedule_reminders( tracker.events, tracker, default_channel ) # cancel the fourth reminder await cancel_reminder_and_check( tracker, default_processor, ReminderCancelled(entities=[{"entity": "name", "value": "Bruce Wayne"}]), 6, 5, )
def test_json_parse_reminder_cancelled(): evt = { "event": "cancel_reminder", "name": "my_reminder", "intent": "my_intent", "entities": [ {"entity": "entity1", "value": "value1"}, {"entity": "entity2", "value": "value2"}, ], "date_time": "2018-09-03T11:41:10.128172", } assert Event.from_parameters(evt) == ReminderCancelled( name="my_reminder", intent="my_intent", entities=[ {"entity": "entity1", "value": "value1"}, {"entity": "entity2", "value": "value2"}, ], timestamp=parser.parse("2018-09-03T11:41:10.128172"), )
"entity": "city", "value": "London", "role": "destination", "group": "test", }, { "entity": "count", "value": 1 }, ], timestamp=None, ), DefinePrevUserUtteredFeaturization(use_text_for_featurization=False, timestamp=None, metadata=None), ReminderCancelled(timestamp=1621590172.3872123), ReminderScheduled(timestamp=None, trigger_date_time=datetime.now(), intent="greet"), ActionExecutionRejected(action_name="my_action"), LegacyFormValidation(validate=True, timestamp=None), LoopInterrupted(timestamp=None, is_interrupted=False), ActiveLoop(name="loop"), LegacyForm(name="my_form"), AllSlotsReset(), SlotSet(key="my_slot", value={}), SlotSet(key="my slot", value=[]), SlotSet(key="test", value=1), SlotSet(key="test", value="text"), ConversationResumed(), ConversationPaused(),