async def test_find_conflicts_in_short_history(): trackers, domain = await _setup_trackers_for_testing( "data/test_domains/default.yml", "data/test_stories/stories_conflicting_1.md" ) # `max_history = 3` is too small, so a conflict must arise conflicts = find_story_conflicts(trackers, domain, 3) assert len(conflicts) == 1 # With `max_history = 4` the conflict should disappear conflicts = find_story_conflicts(trackers, domain, 4) assert len(conflicts) == 0
def verify_story_structure(self, raise_exception: bool = True, max_history: Optional[int] = None): """ Validates whether the bot behaviour in stories is deterministic. @param raise_exception: Set this flag to false to prevent raising exceptions. @param max_history: @return: """ self.component_count['stories'] = 0 self.component_count['rules'] = 0 for steps in self.story_graph.story_steps: if isinstance(steps, RuleStep): self.component_count['rules'] += 1 elif isinstance(steps, StoryStep): self.component_count['stories'] += 1 trackers = TrainingDataGenerator( self.story_graph, domain=self.domain, remove_duplicates=False, augmentation_factor=0, ).generate_story_trackers() conflicts = find_story_conflicts( trackers, self.domain, max_history ) if conflicts: conflict_msg = [] for conflict in conflicts: conflict_msg.append(str(conflict)) if raise_exception: raise AppException(str(conflict)) self.summary['stories'] = conflict_msg
async def test_find_no_conflicts(domain_path: Text, stories_path: Text): trackers, domain = _setup_trackers_for_testing(domain_path, stories_path) # Create a list of `StoryConflict` objects conflicts = find_story_conflicts(trackers, domain, 5) assert conflicts == []
async def test_find_no_conflicts(): trackers, domain = await _setup_trackers_for_testing( DEFAULT_DOMAIN_PATH_WITH_SLOTS, DEFAULT_STORIES_FILE) # Create a list of `StoryConflict` objects conflicts = find_story_conflicts(trackers, domain, 5) assert conflicts == []
async def test_find_conflicts_slots_that_dont_break(): trackers, domain = await _setup_trackers_for_testing( "data/test_domains/default.yml", "data/test_stories/stories_conflicting_5.md" ) # Create a list of `StoryConflict` objects conflicts = find_story_conflicts(trackers, domain, 5) assert len(conflicts) == 0
async def test_find_conflicts_slots_that_break(): trackers, domain = await _setup_trackers_for_testing( "data/test_domains/default.yml", "data/test_stories/stories_conflicting_4.md" ) # Create a list of `StoryConflict` objects conflicts = find_story_conflicts(trackers, domain, 5) assert len(conflicts) == 1 assert conflicts[0].conflicting_actions == ["utter_default", "utter_greet"]
async def test_check_conflict_description(): trackers, domain = await _setup_trackers_for_testing( "data/test_domains/default.yml", "data/test_stories/stories_conflicting_1.md" ) # `max_history = 3` is too small, so a conflict must arise conflicts = find_story_conflicts(trackers, domain, 3) assert len(conflicts) == 1 assert str(conflicts[0]).startswith("Story structure conflict after intent 'greet'")
async def test_find_conflicts_multiple_stories(): trackers, domain = await _setup_trackers_for_testing( "data/test_domains/default.yml", "data/test_stories/stories_conflicting_6.md" ) # Create a list of `StoryConflict` objects conflicts = find_story_conflicts(trackers, domain, 5) assert len(conflicts) == 1 assert "and 2 other trackers" in str(conflicts[0])
async def test_find_unlearnable_actions(): trackers, domain = _setup_trackers_for_testing( "data/test_domains/default.yml", "data/test_yaml_stories/stories_unexpected_intent_unlearnable.yml", ) # Create a list of `StoryConflict` objects conflicts = find_story_conflicts(trackers, domain) assert len(conflicts) == 2 assert ACTION_UNLIKELY_INTENT_NAME in str(conflicts[0]) assert ACTION_UNLIKELY_INTENT_NAME in str(conflicts[1])
async def test_find_conflicts_or(): trackers, domain = await _setup_trackers_for_testing( "data/test_domains/default.yml", "data/test_yaml_stories/stories_conflicting_3.yml", ) # Create a list of `StoryConflict` objects conflicts = find_story_conflicts(trackers, domain, 5) assert len(conflicts) == 1 assert conflicts[0].conflicting_actions == [ "utter_default", "utter_goodbye" ]