def test_get_or_create(): slot_key = 'location' slot_val = 'Easter Island' store = InMemoryTrackerStore(domain) tracker = store.get_or_create_tracker(UserMessage.DEFAULT_SENDER_ID) ev = SlotSet(slot_key, slot_val) tracker.update(ev) assert tracker.get_slot(slot_key) == slot_val store.save(tracker) again = store.get_or_create_tracker(UserMessage.DEFAULT_SENDER_ID) assert again.get_slot(slot_key) == slot_val
def test_restaurant_form(): domain = TemplateDomain.load("data/test_domains/restaurant_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-restaurant" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance tracker.update(UserUttered("", intent={"name": "inform"})) events = ActionSearchRestaurants().run(dispatcher, tracker, domain) assert len(events) == 1 assert isinstance(events[0], SlotSet) assert events[0].key == "requested_slot" assert events[0].value == "cuisine" tracker.update(events[0]) # second user utterance entities = [{"entity": "cuisine", "value": "chinese"}] tracker.update( UserUttered("", intent={"name": "inform"}, entities=entities)) events = ActionSearchRestaurants().run(dispatcher, tracker, domain) assert len(events) == 2 assert isinstance(events[0], SlotSet) assert isinstance(events[1], SlotSet) assert events[0].key == "cuisine" assert events[0].value == "chinese" assert events[1].key == "requested_slot" assert events[1].value == "people"
def test_restaurant_form_unhappy_1(): domain = TemplateDomain.load("data/test_domains/restaurant_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-restaurant" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance tracker.update(UserUttered("", intent={"name": "inform"})) events = ActionSearchRestaurants().run(dispatcher, tracker, domain) assert len(events) == 1 assert isinstance(events[0], SlotSet) assert events[0].key == "requested_slot" assert events[0].value == "cuisine" tracker.update(events[0]) # second user utterance does not provide what's asked tracker.update( UserUttered("", intent={"name": "inform"})) events = ActionSearchRestaurants().run(dispatcher, tracker, domain) print([(e.key, e.value) for e in events]) assert len(events) == 1 assert isinstance(events[0], SlotSet) # same slot requested again assert events[0].key == "requested_slot" assert events[0].value == "cuisine"
def test_restaurant_form_unhappy_1(): domain = TemplateDomain.load("data/test_domains/restaurant_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-restaurant" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance tracker.update(UserUttered("", intent={"name": "inform"})) events = ActionSearchRestaurants().run(dispatcher, tracker, domain) assert len(events) == 1 assert isinstance(events[0], SlotSet) assert events[0].key == "requested_slot" assert events[0].value == "cuisine" tracker.update(events[0]) # second user utterance does not provide what's asked tracker.update(UserUttered("", intent={"name": "inform"})) events = ActionSearchRestaurants().run(dispatcher, tracker, domain) print([(e.key, e.value) for e in events]) assert len(events) == 1 assert isinstance(events[0], SlotSet) # same slot requested again assert events[0].key == "requested_slot" assert events[0].value == "cuisine"
def test_travel_form(): domain = TemplateDomain.load("data/test_domains/travel_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-travel" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance tracker.update(UserUttered("", intent={"name": "inform"})) events = ActionSearchTravel().run(dispatcher, tracker, domain) assert len(events) == 1 assert isinstance(events[0], SlotSet) assert events[0].key == "requested_slot" assert events[0].value == "GPE_origin" tracker.update(events[0]) # second user utterance entities = [{"entity": "GPE", "value": "Berlin"}] tracker.update( UserUttered("", intent={"name": "inform"}, entities=entities)) events = ActionSearchTravel().run(dispatcher, tracker, domain) for e in events: print(e.as_story_string()) assert len(events) == 2 assert isinstance(events[0], SlotSet) assert events[0].key == "GPE_origin" assert events[0].value == "Berlin" assert events[1].key == "requested_slot" assert events[1].value == "GPE_destination"
def test_query_form_set_username_in_form(): domain = TemplateDomain.load("data/test_domains/query_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-form" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance tracker.update(UserUttered("", intent={"name": "inform"})) events = ActionSearchQuery().run(dispatcher, tracker, domain) last_message = dispatcher.latest_bot_messages[-1] assert len(events) == 1 assert isinstance(events[0], SlotSet) assert events[0].key == "requested_slot" assert events[0].value == "username" assert last_message.text == 'what is your name?' tracker.update(events[0]) # second user utterance username = '******' tracker.update(UserUttered(username, intent={"name": "inform"})) events = ActionSearchQuery().run(dispatcher, tracker, domain) last_message = dispatcher.latest_bot_messages[-1] assert len(events) == 2 assert isinstance(events[0], SlotSet) assert events[0].key == "username" assert events[0].value == username assert events[1].key == "requested_slot" assert events[1].value == "query" assert username in last_message.text
def test_restaurant_form_skipahead(): domain = TemplateDomain.load("data/test_domains/restaurant_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-restaurant" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance entities = [{ "entity": "cuisine", "value": "chinese" }, { "entity": "number", "value": 8 }] tracker.update( UserUttered("", intent={"name": "inform"}, entities=entities)) events = ActionSearchRestaurants().run(dispatcher, tracker, domain) s = events[0].as_story_string() print(events[0].as_story_string()) print(events[1].as_story_string()) assert len(events) == 3 assert events[2].key == "requested_slot" assert events[2].value == "vegetarian"
def test_people_form(): domain = TemplateDomain.load("data/test_domains/people_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-people" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance tracker.update(UserUttered("", intent={"name": "inform"})) events = ActionSearchPeople().run(dispatcher, tracker, domain) assert len(events) == 1 assert isinstance(events[0], SlotSet) assert events[0].key == "requested_slot" assert events[0].value == "person_name" tracker.update(events[0]) # second user utterance name = "Rasa Due" tracker.update(UserUttered(name, intent={"name": "inform"})) events = ActionSearchPeople().run(dispatcher, tracker, domain) assert len(events) == 1 assert isinstance(events[0], SlotSet) assert events[0].key == "person_name" assert events[0].value == name
def test_travel_form(): domain = TemplateDomain.load("data/test_domains/travel_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-travel" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance tracker.update(UserUttered("", intent={"name": "inform"})) events = ActionSearchTravel().run(dispatcher, tracker, domain) assert len(events) == 1 assert isinstance(events[0], SlotSet) assert events[0].key == "requested_slot" assert events[0].value == "GPE_origin" tracker.update(events[0]) # second user utterance entities = [{"entity": "GPE", "value": "Berlin"}] tracker.update(UserUttered("", intent={"name": "inform"}, entities=entities)) events = ActionSearchTravel().run(dispatcher, tracker, domain) for e in events: print(e.as_story_string()) assert len(events) == 2 assert isinstance(events[0], SlotSet) assert events[0].key == "GPE_origin" assert events[0].value == "Berlin" assert events[1].key == "requested_slot" assert events[1].value == "GPE_destination"
def test_people_form(): domain = TemplateDomain.load("data/test_domains/people_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-people" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance tracker.update(UserUttered("", intent={"name": "inform"})) events = ActionSearchPeople().run(dispatcher, tracker, domain) assert len(events) == 1 assert isinstance(events[0], SlotSet) assert events[0].key == "requested_slot" assert events[0].value == "person_name" tracker.update(events[0]) # second user utterance name = "Rasa Due" tracker.update( UserUttered(name, intent={"name": "inform"})) events = ActionSearchPeople().run(dispatcher, tracker, domain) assert len(events) == 1 assert isinstance(events[0], SlotSet) assert events[0].key == "person_name" assert events[0].value == name
def test_tracker_store_remembers_max_history(default_domain): store = InMemoryTrackerStore(default_domain) tr = store.get_or_create_tracker("myuser", max_event_history=42) tr.update(Restarted()) store.save(tr) tr2 = store.retrieve("myuser") assert tr._max_event_history == tr2._max_event_history == 42
def test_restart_after_retrieval_from_tracker_store(default_domain): store = InMemoryTrackerStore(default_domain) tr = store.get_or_create_tracker("myuser") synth = [ActionExecuted("action_listen") for _ in range(4)] for e in synth: tr.update(e) tr.update(Restarted()) latest_restart = tr.idx_after_latest_restart() store.save(tr) tr2 = store.retrieve("myuser") latest_restart_after_loading = tr2.idx_after_latest_restart() assert latest_restart == latest_restart_after_loading
def test_restaurant_form_unhappy_2(): domain = TemplateDomain.load("data/test_domains/restaurant_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-restaurant" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance entities = [{ "entity": "cuisine", "value": "chinese" }, { "entity": "number", "value": 8 }] tracker.update( UserUttered("", intent={"name": "inform"}, entities=entities)) # store all entities as slots events = ActionSearchRestaurants().run(dispatcher, tracker, domain) for e in events: tracker.update(e) cuisine = tracker.get_slot("cuisine") people = tracker.get_slot("people") assert cuisine == "chinese" assert people == 8 events = ActionSearchRestaurants().run(dispatcher, tracker, domain) assert len(events) == 3 assert isinstance(events[0], SlotSet) assert events[2].key == "requested_slot" assert events[2].value == "vegetarian" tracker.update(events[2]) # second user utterance does not provide what's asked tracker.update(UserUttered("", intent={"name": "random"})) events = ActionSearchRestaurants().run(dispatcher, tracker, domain) s = events[0].as_story_string() assert len(events) == 1 assert events[0].key == "requested_slot" assert events[0].value == "vegetarian"
def test_restaurant_form_unhappy_2(): domain = TemplateDomain.load("data/test_domains/restaurant_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-restaurant" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance entities = [ {"entity": "cuisine", "value": "chinese"}, {"entity": "number", "value": 8}] tracker.update( UserUttered("", intent={"name": "inform"}, entities=entities)) # store all entities as slots events = ActionSearchRestaurants().run(dispatcher, tracker, domain) for e in events: tracker.update(e) cuisine = tracker.get_slot("cuisine") people = tracker.get_slot("people") assert cuisine == "chinese" assert people == 8 events = ActionSearchRestaurants().run(dispatcher, tracker, domain) assert len(events) == 3 assert isinstance(events[0], SlotSet) assert events[2].key == "requested_slot" assert events[2].value == "vegetarian" tracker.update(events[2]) # second user utterance does not provide what's asked tracker.update( UserUttered("", intent={"name": "random"})) events = ActionSearchRestaurants().run(dispatcher, tracker, domain) s = events[0].as_story_string() assert len(events) == 1 assert events[0].key == "requested_slot" assert events[0].value == "vegetarian"
def test_query_form_set_username_directly(): domain = TemplateDomain.load("data/test_domains/query_form.yml") tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-form" dispatcher = Dispatcher(sender_id, out, domain) tracker = tracker_store.get_or_create_tracker(sender_id) # pre-fill username slot username = "******" tracker.update(SlotSet('username', username)) # first user utterance tracker.update(UserUttered("", intent={"name": "inform"})) events = ActionSearchQuery().run(dispatcher, tracker, domain) last_message = dispatcher.latest_bot_messages[-1] assert len(events) == 1 assert isinstance(events[0], SlotSet) assert events[0].key == "requested_slot" assert events[0].value == "query" assert username in last_message.text
def test_restaurant_form_skipahead(): domain = TemplateDomain.load("data/test_domains/restaurant_form.yml") nlg = TemplatedNaturalLanguageGenerator(domain.templates) tracker_store = InMemoryTrackerStore(domain) out = CollectingOutputChannel() sender_id = "test-restaurant" dispatcher = Dispatcher(sender_id, out, nlg) tracker = tracker_store.get_or_create_tracker(sender_id) # first user utterance entities = [{"entity": "cuisine", "value": "chinese"}, {"entity": "number", "value": 8}] tracker.update(UserUttered("", intent={"name": "inform"}, entities=entities)) events = ActionSearchRestaurants().run(dispatcher, tracker, domain) s = events[0].as_story_string() print(events[0].as_story_string()) print(events[1].as_story_string()) assert len(events) == 3 assert events[2].key == "requested_slot" assert events[2].value == "vegetarian"