def test_not_in_imports(input_path: Text, tmpdir_factory: TempdirFactory): root = tmpdir_factory.mktemp("Parent Bot") config_path = str(root / "config.yml") utils.dump_obj_as_yaml_to_file(root / "config.yml", {"imports": ["A/A/A", "A/B/A"]}) importer = MultiProjectImporter(config_path, project_directory=os.getcwd()) assert not importer.is_imported(input_path)
def test_not_in_imports(input_path: Text, tmp_path: Path): config_path = str(tmp_path / "config.yml") utils.dump_obj_as_yaml_to_file( tmp_path / "config.yml", {"imports": ["A/A/A", "A/B/A"]} ) importer = MultiProjectImporter(config_path, project_directory=os.getcwd()) assert not importer.is_imported(input_path)
def test_single_additional_file(tmpdir_factory): root = tmpdir_factory.mktemp("Parent Bot") config_path = str(root / "config.yml") empty_config = {} utils.dump_obj_as_yaml_to_file(config_path, empty_config) additional_file = root / "directory" / "file.yml" additional_file.write({}, ensure=True) selector = MultiProjectImporter(config_path, training_data_paths=str(additional_file)) assert selector.is_imported(str(additional_file))
def test_single_additional_file(tmp_path: Path): config_path = str(tmp_path / "config.yml") empty_config = {} utils.dump_obj_as_yaml_to_file(config_path, empty_config) additional_file = tmp_path / "directory" / "file.yml" additional_file.parent.mkdir() rasa.shared.utils.io.write_yaml({}, additional_file) selector = MultiProjectImporter( config_path, training_data_paths=str(additional_file) ) assert selector.is_imported(str(additional_file))
def test_load_if_subproject_is_more_specific_than_parent(tmp_path: Path,): config_path = str(tmp_path / "config.yml") utils.dump_obj_as_yaml_to_file(tmp_path / "config.yml", {}) project_a_directory = tmp_path / "Project A" project_a_directory.mkdir() project_a_imports = {"imports": ["Project B"]} utils.dump_obj_as_yaml_to_file( project_a_directory / "config.yml", project_a_imports ) actual = MultiProjectImporter(config_path) assert actual.is_imported(str(project_a_directory))
def test_load_if_subproject_is_more_specific_than_parent( tmpdir_factory: TempdirFactory): root = tmpdir_factory.mktemp("Parent Bot") config_path = str(root / "config.yml") utils.dump_obj_as_yaml_to_file(root / "config.yml", {}) project_a_directory = root / "Project A" project_a_directory.mkdir() project_a_imports = {"imports": ["Project B"]} utils.dump_obj_as_yaml_to_file(project_a_directory / "config.yml", project_a_imports) actual = MultiProjectImporter(config_path) assert actual.is_imported(str(project_a_directory))
def test_load_imports_without_imports(tmp_path: Path): empty_config = {} utils.dump_obj_as_yaml_to_file(tmp_path / "config.yml", empty_config) project_a_directory = tmp_path / "Project A" project_a_directory.mkdir() utils.dump_obj_as_yaml_to_file(project_a_directory / "config.yml", empty_config) project_b_directory = tmp_path / "Project B" project_b_directory.mkdir() utils.dump_obj_as_yaml_to_file(project_b_directory / "config.yml", empty_config) actual = MultiProjectImporter(str(tmp_path / "config.yml")) assert actual.is_imported(str(tmp_path / "Project C"))
def test_not_importing_e2e_conversation_tests_in_project( tmpdir_factory: TempdirFactory, ): root = tmpdir_factory.mktemp("Parent Bot") config = {"imports": ["bots/Bot A"]} config_path = str(root / "config.yml") utils.dump_obj_as_yaml_to_file(config_path, config) story_file = root / "bots" / "Bot A" / "data" / "stories.md" story_file.write("""## story""", ensure=True) e2e_story_test_file = ( root / "bots" / "Bot A" / DEFAULT_E2E_TESTS_PATH / "conversation_tests.md" ) e2e_story_test_file.write( """## story test""", ensure=True, ) selector = MultiProjectImporter(config_path) # Conversation tests should not be included in story paths expected = { "story_paths": [str(story_file)], "e2e_story_paths": [str(e2e_story_test_file)], } actual = { "story_paths": selector._story_paths, "e2e_story_paths": selector._e2e_story_paths, } assert expected == actual
def test_load_from_none(input_dict: Dict, tmp_path: Path): config_path = tmp_path / "config.yml" utils.dump_obj_as_yaml_to_file(tmp_path / "config.yml", input_dict) actual = MultiProjectImporter(str(config_path)) assert actual._imports == list()
def test_load_imports_without_imports(tmpdir_factory: TempdirFactory): empty_config = {} root = tmpdir_factory.mktemp("Parent Bot") utils.dump_obj_as_yaml_to_file(root / "config.yml", empty_config) project_a_directory = root / "Project A" project_a_directory.mkdir() utils.dump_obj_as_yaml_to_file(project_a_directory / "config.yml", empty_config) project_b_directory = root / "Project B" project_b_directory.mkdir() utils.dump_obj_as_yaml_to_file(project_b_directory / "config.yml", empty_config) actual = MultiProjectImporter(str(root / "config.yml")) assert actual.is_imported(str(root / "Project C"))
def test_importing_additional_files(tmpdir_factory): root = tmpdir_factory.mktemp("Parent Bot") config = {"imports": ["bots/Bot A"]} config_path = str(root / "config.yml") utils.dump_obj_as_yaml_to_file(config_path, config) additional_file = root / "directory" / "file.md" # create intermediate directories and fake files additional_file.write("""## story""", ensure=True) selector = MultiProjectImporter( config_path, training_data_paths=[str(root / "directory"), str(additional_file)] ) assert selector.is_imported(str(additional_file)) assert str(additional_file) in selector._story_paths
def test_importing_additional_files(tmp_path: Path): config = {"imports": ["bots/Bot A"]} config_path = str(tmp_path / "config.yml") utils.dump_obj_as_yaml_to_file(config_path, config) additional_file = tmp_path / "directory" / "file.md" additional_file.parent.mkdir() # create intermediate directories and fake files rasa.shared.utils.io.write_text_file("""## story""", additional_file) selector = MultiProjectImporter( config_path, training_data_paths=[str(tmp_path / "directory"), str(additional_file)], ) assert selector.is_imported(str(additional_file)) assert str(additional_file) in selector._story_paths
def test_load_from_none(input_dict: Dict, tmpdir_factory: TempdirFactory): root = tmpdir_factory.mktemp("Parent Bot") config_path = root / "config.yml" utils.dump_obj_as_yaml_to_file(root / "config.yml", input_dict) actual = MultiProjectImporter(str(config_path)) assert actual._imports == list()
def test_not_importing_not_relevant_additional_files(tmpdir_factory): root = tmpdir_factory.mktemp("Parent Bot") config = {"imports": ["bots/Bot A"]} config_path = str(root / "config.yml") utils.dump_obj_as_yaml_to_file(config_path, config) additional_file = root / "directory" / "file.yml" selector = MultiProjectImporter( config_path, training_data_paths=[str(root / "data"), str(additional_file)] ) not_relevant_file1 = root / "data" / "another directory" / "file.yml" not_relevant_file1.write({}, ensure=True) not_relevant_file2 = root / "directory" / "another_file.yml" not_relevant_file2.write({}, ensure=True) assert not selector.is_imported(str(not_relevant_file1)) assert not selector.is_imported(str(not_relevant_file2))
def test_not_importing_not_relevant_additional_files(tmp_path: Path): config = {"imports": ["bots/Bot A"]} config_path = str(tmp_path / "config.yml") utils.dump_obj_as_yaml_to_file(config_path, config) additional_file = tmp_path / "directory" / "file.yml" additional_file.parent.mkdir() selector = MultiProjectImporter( config_path, training_data_paths=[str(tmp_path / "data"), str(additional_file)] ) not_relevant_file1 = tmp_path / "data" / "another directory" / "file.yml" not_relevant_file1.parent.mkdir(parents=True) rasa.shared.utils.io.write_text_file("", not_relevant_file1) not_relevant_file2 = tmp_path / "directory" / "another_file.yml" rasa.shared.utils.io.write_text_file("", not_relevant_file2) assert not selector.is_imported(str(not_relevant_file1)) assert not selector.is_imported(str(not_relevant_file2))
async def test_only_getting_e2e_conversation_tests_if_e2e_enabled( tmpdir_factory: TempdirFactory, ): from rasa.core.interpreter import RegexInterpreter from rasa.core.training.structures import StoryGraph import rasa.core.training.loading as core_loading root = tmpdir_factory.mktemp("Parent Bot") config = {"imports": ["bots/Bot A"]} config_path = str(root / "config.yml") utils.dump_obj_as_yaml_to_file(config_path, config) story_file = root / "bots" / "Bot A" / "data" / "stories.md" story_file.write( """ ## story * greet - utter_greet """, ensure=True, ) e2e_story_test_file = ( root / "bots" / "Bot A" / DEFAULT_E2E_TESTS_PATH / "conversation_tests.md" ) e2e_story_test_file.write( """ ## story test * greet : "hello" - utter_greet """, ensure=True, ) selector = MultiProjectImporter(config_path) story_steps = await core_loading.load_data_from_resource( resource=str(e2e_story_test_file), domain=Domain.empty(), interpreter=RegexInterpreter(), template_variables=None, use_e2e=True, exclusion_percentage=None, ) expected = StoryGraph(story_steps) actual = await selector.get_stories(use_e2e=True) assert expected.as_story_string() == actual.as_story_string()
async def test_only_getting_e2e_conversation_tests_if_e2e_enabled( tmp_path: Path, test_stories_filename: Text, test_story: Text ): from rasa.core.training.structures import StoryGraph import rasa.core.training.loading as core_loading config = {"imports": ["bots/Bot A"]} config_path = str(tmp_path / "config.yml") utils.dump_obj_as_yaml_to_file(config_path, config) story_file = tmp_path / "bots" / "Bot A" / "data" / "stories.md" story_file.parent.mkdir(parents=True) rasa.shared.utils.io.write_text_file( """ ## story * greet - utter_greet """, story_file, ) story_test_file = ( tmp_path / "bots" / "Bot A" / DEFAULT_E2E_TESTS_PATH / test_stories_filename ) story_test_file.parent.mkdir(parents=True) rasa.shared.utils.io.write_text_file(test_story, story_test_file) selector = MultiProjectImporter(config_path) story_steps = await core_loading.load_data_from_resource( resource=str(story_test_file), domain=Domain.empty(), template_variables=None, use_e2e=True, exclusion_percentage=None, ) expected = StoryGraph(story_steps) actual = await selector.get_stories(use_e2e=True) assert expected.as_story_string() == actual.as_story_string()
def test_not_importing_e2e_conversation_tests_in_project(tmp_path: Path,): config = {"imports": ["bots/Bot A"]} config_path = str(tmp_path / "config.yml") utils.dump_obj_as_yaml_to_file(config_path, config) story_file = tmp_path / "bots" / "Bot A" / "data" / "stories.md" story_file.parent.mkdir(parents=True) rasa.shared.utils.io.write_text_file("""## story""", story_file) story_test_file = ( tmp_path / "bots" / "Bot A" / DEFAULT_E2E_TESTS_PATH / "test_stories.yml" ) story_test_file.parent.mkdir(parents=True) rasa.shared.utils.io.write_text_file("""stories:""", story_test_file) selector = MultiProjectImporter(config_path) # Conversation tests should not be included in story paths assert [str(story_file)] == selector._story_paths assert [str(story_test_file)] == selector._e2e_story_paths
def test_import_outside_project_directory(tmp_path: Path): project_imports = {"imports": ["Project A"]} utils.dump_obj_as_yaml_to_file(tmp_path / "config.yml", project_imports) project_a_directory = tmp_path / "Project A" project_a_directory.mkdir() project_a_imports = {"imports": ["../Project B"]} utils.dump_obj_as_yaml_to_file( project_a_directory / "config.yml", project_a_imports ) project_b_directory = tmp_path / "Project B" project_b_directory.mkdir() project_b_imports = {"imports": ["../Project C"]} utils.dump_obj_as_yaml_to_file( project_b_directory / "config.yml", project_b_imports ) actual = MultiProjectImporter(str(project_a_directory / "config.yml")) assert actual._imports == [str(project_b_directory), str(tmp_path / "Project C")]
def test_load_imports_from_directory_tree(tmpdir_factory: TempdirFactory): root = tmpdir_factory.mktemp("Parent Bot") root_imports = {"imports": ["Project A"]} utils.dump_obj_as_yaml_to_file(root / "config.yml", root_imports) project_a_directory = root / "Project A" project_a_directory.mkdir() project_a_imports = {"imports": ["../Project B"]} utils.dump_obj_as_yaml_to_file( project_a_directory / "config.yml", project_a_imports ) project_b_directory = root / "Project B" project_b_directory.mkdir() project_b_imports = {"some other": ["../Project C"]} utils.dump_obj_as_yaml_to_file( project_b_directory / "config.yml", project_b_imports ) project_b_subproject_directory = project_b_directory / "Project B-1" project_b_subproject_directory.mkdir() project_b_1_imports = {"imports": ["../../Project A"]} # Check if loading from `.yaml` also works utils.dump_obj_as_yaml_to_file( project_b_subproject_directory / "config.yaml", project_b_1_imports ) # should not be imported subdirectory_3 = root / "Project C" subdirectory_3.mkdir() expected = [ os.path.join(str(project_a_directory)), os.path.join(str(project_b_directory)), ] actual = MultiProjectImporter(str(root / "config.yml")) assert actual._imports == expected
def test_import_outside_project_directory(tmpdir_factory): root = tmpdir_factory.mktemp("Parent Bot") project_imports = {"imports": ["Project A"]} utils.dump_obj_as_yaml_to_file(root / "config.yml", project_imports) project_a_directory = root / "Project A" project_a_directory.mkdir() project_a_imports = {"imports": ["../Project B"]} utils.dump_obj_as_yaml_to_file( project_a_directory / "config.yml", project_a_imports ) project_b_directory = root / "Project B" project_b_directory.mkdir() project_b_imports = {"imports": ["../Project C"]} utils.dump_obj_as_yaml_to_file( project_b_directory / "config.yml", project_b_imports ) actual = MultiProjectImporter(str(project_a_directory / "config.yml")) assert actual._imports == [str(project_b_directory), str(root / "Project C")]