예제 #1
0
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
예제 #2
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
예제 #3
0
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 == []
예제 #4
0
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 == []
예제 #5
0
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
예제 #6
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"]
예제 #7
0
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'")
예제 #8
0
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])
예제 #9
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])
예제 #10
0
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"
    ]