mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-05-02 07:42:40 +00:00
fix: eliminate os.chdir() usage in tests to prevent working directory corruption
- Replace os.chdir() with parent_folder parameter for create_folder_structure tests - Mock create_folder_structure directly for create_crew tests to avoid directory changes - All 12 tests now pass locally without working directory corruption - Should resolve the 103 failing tests in Python 3.12 CI Co-Authored-By: João <joao@crewai.com>
This commit is contained in:
@@ -24,62 +24,46 @@ def temp_dir():
|
|||||||
|
|
||||||
def test_create_folder_structure_strips_single_trailing_slash():
|
def test_create_folder_structure_strips_single_trailing_slash():
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
original_cwd = os.getcwd()
|
folder_path, folder_name, class_name = create_folder_structure("hello/", parent_folder=temp_dir)
|
||||||
os.chdir(temp_dir)
|
|
||||||
try:
|
assert folder_name == "hello"
|
||||||
folder_path, folder_name, class_name = create_folder_structure("hello/")
|
assert class_name == "Hello"
|
||||||
|
assert folder_path.name == "hello"
|
||||||
assert folder_name == "hello"
|
assert folder_path.exists()
|
||||||
assert class_name == "Hello"
|
assert folder_path.parent == Path(temp_dir)
|
||||||
assert folder_path.name == "hello"
|
|
||||||
assert folder_path.exists()
|
|
||||||
finally:
|
|
||||||
os.chdir(original_cwd)
|
|
||||||
|
|
||||||
|
|
||||||
def test_create_folder_structure_strips_multiple_trailing_slashes():
|
def test_create_folder_structure_strips_multiple_trailing_slashes():
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
original_cwd = os.getcwd()
|
folder_path, folder_name, class_name = create_folder_structure("hello///", parent_folder=temp_dir)
|
||||||
try:
|
|
||||||
os.chdir(temp_dir)
|
assert folder_name == "hello"
|
||||||
folder_path, folder_name, class_name = create_folder_structure("hello///")
|
assert class_name == "Hello"
|
||||||
|
assert folder_path.name == "hello"
|
||||||
assert folder_name == "hello"
|
assert folder_path.exists()
|
||||||
assert class_name == "Hello"
|
assert folder_path.parent == Path(temp_dir)
|
||||||
assert folder_path.name == "hello"
|
|
||||||
assert folder_path.exists()
|
|
||||||
finally:
|
|
||||||
os.chdir(original_cwd)
|
|
||||||
|
|
||||||
|
|
||||||
def test_create_folder_structure_handles_complex_name_with_trailing_slash():
|
def test_create_folder_structure_handles_complex_name_with_trailing_slash():
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
original_cwd = os.getcwd()
|
folder_path, folder_name, class_name = create_folder_structure("my-awesome_project/", parent_folder=temp_dir)
|
||||||
try:
|
|
||||||
os.chdir(temp_dir)
|
assert folder_name == "my_awesome_project"
|
||||||
folder_path, folder_name, class_name = create_folder_structure("my-awesome_project/")
|
assert class_name == "MyAwesomeProject"
|
||||||
|
assert folder_path.name == "my_awesome_project"
|
||||||
assert folder_name == "my_awesome_project"
|
assert folder_path.exists()
|
||||||
assert class_name == "MyAwesomeProject"
|
assert folder_path.parent == Path(temp_dir)
|
||||||
assert folder_path.name == "my_awesome_project"
|
|
||||||
assert folder_path.exists()
|
|
||||||
finally:
|
|
||||||
os.chdir(original_cwd)
|
|
||||||
|
|
||||||
|
|
||||||
def test_create_folder_structure_normal_name_unchanged():
|
def test_create_folder_structure_normal_name_unchanged():
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
original_cwd = os.getcwd()
|
folder_path, folder_name, class_name = create_folder_structure("hello", parent_folder=temp_dir)
|
||||||
try:
|
|
||||||
os.chdir(temp_dir)
|
assert folder_name == "hello"
|
||||||
folder_path, folder_name, class_name = create_folder_structure("hello")
|
assert class_name == "Hello"
|
||||||
|
assert folder_path.name == "hello"
|
||||||
assert folder_name == "hello"
|
assert folder_path.exists()
|
||||||
assert class_name == "Hello"
|
assert folder_path.parent == Path(temp_dir)
|
||||||
assert folder_path.name == "hello"
|
|
||||||
assert folder_path.exists()
|
|
||||||
finally:
|
|
||||||
os.chdir(original_cwd)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -87,21 +71,16 @@ def test_create_folder_structure_normal_name_unchanged():
|
|||||||
|
|
||||||
def test_create_folder_structure_with_parent_folder():
|
def test_create_folder_structure_with_parent_folder():
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
original_cwd = os.getcwd()
|
parent_path = Path(temp_dir) / "parent"
|
||||||
try:
|
parent_path.mkdir()
|
||||||
os.chdir(temp_dir)
|
|
||||||
parent_path = Path(temp_dir) / "parent"
|
folder_path, folder_name, class_name = create_folder_structure("child/", parent_folder=parent_path)
|
||||||
parent_path.mkdir()
|
|
||||||
|
assert folder_name == "child"
|
||||||
folder_path, folder_name, class_name = create_folder_structure("child/", parent_folder=parent_path)
|
assert class_name == "Child"
|
||||||
|
assert folder_path.name == "child"
|
||||||
assert folder_name == "child"
|
assert folder_path.parent == parent_path
|
||||||
assert class_name == "Child"
|
assert folder_path.exists()
|
||||||
assert folder_path.name == "child"
|
|
||||||
assert folder_path.parent == parent_path
|
|
||||||
assert folder_path.exists()
|
|
||||||
finally:
|
|
||||||
os.chdir(original_cwd)
|
|
||||||
|
|
||||||
|
|
||||||
@mock.patch("crewai.cli.create_crew.copy_template")
|
@mock.patch("crewai.cli.create_crew.copy_template")
|
||||||
@@ -111,21 +90,21 @@ def test_create_crew_with_trailing_slash_creates_valid_project(mock_load_env, mo
|
|||||||
mock_load_env.return_value = {}
|
mock_load_env.return_value = {}
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as work_dir:
|
with tempfile.TemporaryDirectory() as work_dir:
|
||||||
os.chdir(work_dir)
|
with mock.patch("crewai.cli.create_crew.create_folder_structure") as mock_create_folder:
|
||||||
create_crew("test-project/", skip_provider=True)
|
mock_folder_path = Path(work_dir) / "test_project"
|
||||||
|
mock_create_folder.return_value = (mock_folder_path, "test_project", "TestProject")
|
||||||
project_path = Path(work_dir) / "test_project"
|
|
||||||
assert project_path.exists()
|
create_crew("test-project/", skip_provider=True)
|
||||||
assert (project_path / "src" / "test_project").exists()
|
|
||||||
|
mock_create_folder.assert_called_once_with("test-project/", None)
|
||||||
mock_copy_template.assert_called()
|
mock_copy_template.assert_called()
|
||||||
copy_calls = mock_copy_template.call_args_list
|
copy_calls = mock_copy_template.call_args_list
|
||||||
|
|
||||||
for call in copy_calls:
|
for call in copy_calls:
|
||||||
args = call[0]
|
args = call[0]
|
||||||
if len(args) >= 5:
|
if len(args) >= 5:
|
||||||
folder_name_arg = args[4]
|
folder_name_arg = args[4]
|
||||||
assert not folder_name_arg.endswith("/"), f"folder_name should not end with slash: {folder_name_arg}"
|
assert not folder_name_arg.endswith("/"), f"folder_name should not end with slash: {folder_name_arg}"
|
||||||
|
|
||||||
|
|
||||||
@mock.patch("crewai.cli.create_crew.copy_template")
|
@mock.patch("crewai.cli.create_crew.copy_template")
|
||||||
@@ -135,12 +114,13 @@ def test_create_crew_with_multiple_trailing_slashes(mock_load_env, mock_write_en
|
|||||||
mock_load_env.return_value = {}
|
mock_load_env.return_value = {}
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as work_dir:
|
with tempfile.TemporaryDirectory() as work_dir:
|
||||||
os.chdir(work_dir)
|
with mock.patch("crewai.cli.create_crew.create_folder_structure") as mock_create_folder:
|
||||||
create_crew("test-project///", skip_provider=True)
|
mock_folder_path = Path(work_dir) / "test_project"
|
||||||
|
mock_create_folder.return_value = (mock_folder_path, "test_project", "TestProject")
|
||||||
project_path = Path(work_dir) / "test_project"
|
|
||||||
assert project_path.exists()
|
create_crew("test-project///", skip_provider=True)
|
||||||
assert (project_path / "src" / "test_project").exists()
|
|
||||||
|
mock_create_folder.assert_called_once_with("test-project///", None)
|
||||||
|
|
||||||
|
|
||||||
@mock.patch("crewai.cli.create_crew.copy_template")
|
@mock.patch("crewai.cli.create_crew.copy_template")
|
||||||
@@ -150,82 +130,68 @@ def test_create_crew_normal_name_still_works(mock_load_env, mock_write_env, mock
|
|||||||
mock_load_env.return_value = {}
|
mock_load_env.return_value = {}
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as work_dir:
|
with tempfile.TemporaryDirectory() as work_dir:
|
||||||
os.chdir(work_dir)
|
with mock.patch("crewai.cli.create_crew.create_folder_structure") as mock_create_folder:
|
||||||
create_crew("normal-project", skip_provider=True)
|
mock_folder_path = Path(work_dir) / "normal_project"
|
||||||
|
mock_create_folder.return_value = (mock_folder_path, "normal_project", "NormalProject")
|
||||||
project_path = Path(work_dir) / "normal_project"
|
|
||||||
assert project_path.exists()
|
create_crew("normal-project", skip_provider=True)
|
||||||
assert (project_path / "src" / "normal_project").exists()
|
|
||||||
|
mock_create_folder.assert_called_once_with("normal-project", None)
|
||||||
|
|
||||||
|
|
||||||
def test_create_folder_structure_handles_spaces_and_dashes_with_slash():
|
def test_create_folder_structure_handles_spaces_and_dashes_with_slash():
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
original_cwd = os.getcwd()
|
folder_path, folder_name, class_name = create_folder_structure("My Cool-Project/", parent_folder=temp_dir)
|
||||||
try:
|
|
||||||
os.chdir(temp_dir)
|
assert folder_name == "my_cool_project"
|
||||||
folder_path, folder_name, class_name = create_folder_structure("My Cool-Project/")
|
assert class_name == "MyCoolProject"
|
||||||
|
assert folder_path.name == "my_cool_project"
|
||||||
assert folder_name == "my_cool_project"
|
assert folder_path.exists()
|
||||||
assert class_name == "MyCoolProject"
|
assert folder_path.parent == Path(temp_dir)
|
||||||
assert folder_path.name == "my_cool_project"
|
|
||||||
assert folder_path.exists()
|
|
||||||
finally:
|
|
||||||
os.chdir(original_cwd)
|
|
||||||
|
|
||||||
|
|
||||||
def test_create_folder_structure_raises_error_for_invalid_class_names():
|
def test_create_folder_structure_raises_error_for_invalid_class_names():
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
original_cwd = os.getcwd()
|
invalid_cases = [
|
||||||
try:
|
("123project/", "cannot start with a digit"),
|
||||||
os.chdir(temp_dir)
|
("True/", "reserved Python keyword"),
|
||||||
|
("False/", "reserved Python keyword"),
|
||||||
invalid_cases = [
|
("None/", "reserved Python keyword"),
|
||||||
("123project/", "cannot start with a digit"),
|
("class/", "reserved Python keyword"),
|
||||||
("True/", "reserved Python keyword"),
|
("def/", "reserved Python keyword"),
|
||||||
("False/", "reserved Python keyword"),
|
(" /", "empty or contain only whitespace"),
|
||||||
("None/", "reserved Python keyword"),
|
("", "empty or contain only whitespace"),
|
||||||
("class/", "reserved Python keyword"),
|
("@#$/", "contains no valid characters"),
|
||||||
("def/", "reserved Python keyword"),
|
]
|
||||||
(" /", "empty or contain only whitespace"),
|
|
||||||
("", "empty or contain only whitespace"),
|
for invalid_name, expected_error in invalid_cases:
|
||||||
("@#$/", "contains no valid characters"),
|
with pytest.raises(ValueError, match=expected_error):
|
||||||
]
|
create_folder_structure(invalid_name, parent_folder=temp_dir)
|
||||||
|
|
||||||
for invalid_name, expected_error in invalid_cases:
|
|
||||||
with pytest.raises(ValueError, match=expected_error):
|
|
||||||
create_folder_structure(invalid_name)
|
|
||||||
finally:
|
|
||||||
os.chdir(original_cwd)
|
|
||||||
|
|
||||||
|
|
||||||
def test_create_folder_structure_validates_class_names():
|
def test_create_folder_structure_validates_class_names():
|
||||||
import keyword
|
import keyword
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
original_cwd = os.getcwd()
|
valid_cases = [
|
||||||
try:
|
("hello/", "hello", "Hello"),
|
||||||
os.chdir(temp_dir)
|
("my-project/", "my_project", "MyProject"),
|
||||||
|
("hello_world/", "hello_world", "HelloWorld"),
|
||||||
|
("valid123/", "valid123", "Valid123"),
|
||||||
|
("hello.world/", "hello.world", "HelloWorld"),
|
||||||
|
("hello@world/", "hello@world", "HelloWorld"),
|
||||||
|
]
|
||||||
|
|
||||||
|
for valid_name, expected_folder, expected_class in valid_cases:
|
||||||
|
folder_path, folder_name, class_name = create_folder_structure(valid_name, parent_folder=temp_dir)
|
||||||
|
assert folder_name == expected_folder
|
||||||
|
assert class_name == expected_class
|
||||||
|
assert class_name.isidentifier()
|
||||||
|
assert not keyword.iskeyword(class_name)
|
||||||
|
assert folder_path.parent == Path(temp_dir)
|
||||||
|
|
||||||
valid_cases = [
|
if folder_path.exists():
|
||||||
("hello/", "hello", "Hello"),
|
shutil.rmtree(folder_path)
|
||||||
("my-project/", "my_project", "MyProject"),
|
|
||||||
("hello_world/", "hello_world", "HelloWorld"),
|
|
||||||
("valid123/", "valid123", "Valid123"),
|
|
||||||
("hello.world/", "hello.world", "HelloWorld"),
|
|
||||||
("hello@world/", "hello@world", "HelloWorld"),
|
|
||||||
]
|
|
||||||
|
|
||||||
for valid_name, expected_folder, expected_class in valid_cases:
|
|
||||||
folder_path, folder_name, class_name = create_folder_structure(valid_name)
|
|
||||||
assert folder_name == expected_folder
|
|
||||||
assert class_name == expected_class
|
|
||||||
assert class_name.isidentifier()
|
|
||||||
assert not keyword.iskeyword(class_name)
|
|
||||||
|
|
||||||
if folder_path.exists():
|
|
||||||
shutil.rmtree(folder_path)
|
|
||||||
finally:
|
|
||||||
os.chdir(original_cwd)
|
|
||||||
|
|
||||||
|
|
||||||
@mock.patch("crewai.cli.create_crew.copy_template")
|
@mock.patch("crewai.cli.create_crew.copy_template")
|
||||||
|
|||||||
Reference in New Issue
Block a user