async def test_restart_triggers_session_start( default_channel: CollectingOutputChannel, default_processor: MessageProcessor, monkeypatch: MonkeyPatch, ): # The rule policy is trained and used so as to allow the default action ActionRestart to be predicted rule_policy = RulePolicy() rule_policy.train([], default_processor.domain, RegexInterpreter()) monkeypatch.setattr( default_processor.policy_ensemble, "policies", [rule_policy, *default_processor.policy_ensemble.policies], ) sender_id = uuid.uuid4().hex entity = "name" slot_1 = {entity: "name1"} await default_processor.handle_message( UserMessage(f"/greet{json.dumps(slot_1)}", default_channel, sender_id) ) assert default_channel.latest_output() == { "recipient_id": sender_id, "text": "hey there name1!", } # This restarts the chat await default_processor.handle_message( UserMessage("/restart", default_channel, sender_id) ) tracker = default_processor.tracker_store.get_or_create_tracker(sender_id) expected = [ ActionExecuted(ACTION_SESSION_START_NAME), SessionStarted(), ActionExecuted(ACTION_LISTEN_NAME), UserUttered( f"/greet{json.dumps(slot_1)}", {INTENT_NAME_KEY: "greet", "confidence": 1.0}, [{"entity": entity, "start": 6, "end": 23, "value": "name1"}], ), SlotSet(entity, slot_1[entity]), DefinePrevUserUtteredFeaturization(use_text_for_featurization=False), ActionExecuted("utter_greet"), BotUttered("hey there name1!", metadata={"template_name": "utter_greet"}), ActionExecuted(ACTION_LISTEN_NAME), UserUttered("/restart", {INTENT_NAME_KEY: "restart", "confidence": 1.0}), DefinePrevUserUtteredFeaturization(use_text_for_featurization=False), ActionExecuted(ACTION_RESTART_NAME), Restarted(), ActionExecuted(ACTION_SESSION_START_NAME), SessionStarted(), # No previous slot is set due to restart. ActionExecuted(ACTION_LISTEN_NAME), ] for actual, expected in zip(tracker.events, expected): assert actual == expected
async def test_message_processor(default_channel: CollectingOutputChannel, default_processor: MessageProcessor): await default_processor.handle_message( UserMessage('/greet{"name":"Core"}', default_channel)) assert default_channel.latest_output() == { "recipient_id": "default", "text": "hey there Core!", }
async def test_handle_message_with_session_start( default_channel: CollectingOutputChannel, default_processor: MessageProcessor, monkeypatch: MonkeyPatch, ): sender_id = uuid.uuid4().hex entity = "name" slot_1 = {entity: "Core"} await default_processor.handle_message( UserMessage(f"/greet{json.dumps(slot_1)}", default_channel, sender_id)) assert default_channel.latest_output() == { "recipient_id": sender_id, "text": "hey there Core!", } # patch processor so a session start is triggered monkeypatch.setattr(default_processor, "_has_session_expired", lambda _: True) slot_2 = {entity: "post-session start hello"} # handle a new message await default_processor.handle_message( UserMessage(f"/greet{json.dumps(slot_2)}", default_channel, sender_id)) tracker = default_processor.tracker_store.get_or_create_tracker(sender_id) # make sure the sequence of events is as expected expected = [ ActionExecuted(ACTION_SESSION_START_NAME), SessionStarted(), ActionExecuted(ACTION_LISTEN_NAME), UserUttered( f"/greet{json.dumps(slot_1)}", { INTENT_NAME_KEY: "greet", "confidence": 1.0 }, [{ "entity": entity, "start": 6, "end": 22, "value": "Core" }], ), SlotSet(entity, slot_1[entity]), ActionExecuted("utter_greet"), BotUttered("hey there Core!", metadata={"template_name": "utter_greet"}), ActionExecuted(ACTION_LISTEN_NAME), ActionExecuted(ACTION_SESSION_START_NAME), SessionStarted(), # the initial SlotSet is reapplied after the SessionStarted sequence SlotSet(entity, slot_1[entity]), ActionExecuted(ACTION_LISTEN_NAME), UserUttered( f"/greet{json.dumps(slot_2)}", { INTENT_NAME_KEY: "greet", "confidence": 1.0 }, [{ "entity": entity, "start": 6, "end": 42, "value": "post-session start hello", }], ), SlotSet(entity, slot_2[entity]), ActionExecuted("utter_greet"), BotUttered( "hey there post-session start hello!", metadata={"template_name": "utter_greet"}, ), ActionExecuted(ACTION_LISTEN_NAME), ] assert list(tracker.events) == expected