fix: add working directory safety checks to prevent test interference

Co-Authored-By: João <joao@crewai.com>
This commit is contained in:
Devin AI
2025-06-24 19:56:09 +00:00
parent cabdfafb4a
commit babcd1d712

View File

@@ -24,46 +24,65 @@ 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()
os.chdir(temp_dir) os.chdir(temp_dir)
folder_path, folder_name, class_name = create_folder_structure("hello/") try:
folder_path, folder_name, class_name = create_folder_structure("hello/")
assert folder_name == "hello" assert folder_name == "hello"
assert class_name == "Hello" assert class_name == "Hello"
assert folder_path.name == "hello" assert folder_path.name == "hello"
assert folder_path.exists() 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:
os.chdir(temp_dir) old_cwd = os.getcwd()
folder_path, folder_name, class_name = create_folder_structure("hello///") try:
os.chdir(temp_dir)
folder_path, folder_name, class_name = create_folder_structure("hello///")
assert folder_name == "hello" assert folder_name == "hello"
assert class_name == "Hello" assert class_name == "Hello"
assert folder_path.name == "hello" assert folder_path.name == "hello"
assert folder_path.exists() assert folder_path.exists()
finally:
if os.path.exists(old_cwd):
os.chdir(old_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:
os.chdir(temp_dir) old_cwd = os.getcwd()
folder_path, folder_name, class_name = create_folder_structure("my-awesome_project/") try:
os.chdir(temp_dir)
folder_path, folder_name, class_name = create_folder_structure("my-awesome_project/")
assert folder_name == "my_awesome_project" assert folder_name == "my_awesome_project"
assert class_name == "MyAwesomeProject" assert class_name == "MyAwesomeProject"
assert folder_path.name == "my_awesome_project" assert folder_path.name == "my_awesome_project"
assert folder_path.exists() assert folder_path.exists()
finally:
if os.path.exists(old_cwd):
os.chdir(old_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:
os.chdir(temp_dir) old_cwd = os.getcwd()
folder_path, folder_name, class_name = create_folder_structure("hello") try:
os.chdir(temp_dir)
folder_path, folder_name, class_name = create_folder_structure("hello")
assert folder_name == "hello" assert folder_name == "hello"
assert class_name == "Hello" assert class_name == "Hello"
assert folder_path.name == "hello" assert folder_path.name == "hello"
assert folder_path.exists() assert folder_path.exists()
finally:
if os.path.exists(old_cwd):
os.chdir(old_cwd)
@@ -71,17 +90,22 @@ 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:
os.chdir(temp_dir) old_cwd = os.getcwd()
parent_path = Path(temp_dir) / "parent" try:
parent_path.mkdir() os.chdir(temp_dir)
parent_path = Path(temp_dir) / "parent"
parent_path.mkdir()
folder_path, folder_name, class_name = create_folder_structure("child/", parent_folder=parent_path) folder_path, folder_name, class_name = create_folder_structure("child/", parent_folder=parent_path)
assert folder_name == "child" assert folder_name == "child"
assert class_name == "Child" assert class_name == "Child"
assert folder_path.name == "child" assert folder_path.name == "child"
assert folder_path.parent == parent_path assert folder_path.parent == parent_path
assert folder_path.exists() assert folder_path.exists()
finally:
if os.path.exists(old_cwd):
os.chdir(old_cwd)
@mock.patch("crewai.cli.create_crew.copy_template") @mock.patch("crewai.cli.create_crew.copy_template")
@@ -140,60 +164,75 @@ def test_create_crew_normal_name_still_works(mock_load_env, mock_write_env, mock
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:
os.chdir(temp_dir) old_cwd = os.getcwd()
folder_path, folder_name, class_name = create_folder_structure("My Cool-Project/") try:
os.chdir(temp_dir)
folder_path, folder_name, class_name = create_folder_structure("My Cool-Project/")
assert folder_name == "my_cool_project" assert folder_name == "my_cool_project"
assert class_name == "MyCoolProject" assert class_name == "MyCoolProject"
assert folder_path.name == "my_cool_project" assert folder_path.name == "my_cool_project"
assert folder_path.exists() assert folder_path.exists()
finally:
if os.path.exists(old_cwd):
os.chdir(old_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:
os.chdir(temp_dir) old_cwd = os.getcwd()
try:
os.chdir(temp_dir)
invalid_cases = [ invalid_cases = [
("123project/", "cannot start with a digit"), ("123project/", "cannot start with a digit"),
("True/", "reserved Python keyword"), ("True/", "reserved Python keyword"),
("False/", "reserved Python keyword"), ("False/", "reserved Python keyword"),
("None/", "reserved Python keyword"), ("None/", "reserved Python keyword"),
("class/", "reserved Python keyword"), ("class/", "reserved Python keyword"),
("def/", "reserved Python keyword"), ("def/", "reserved Python keyword"),
(" /", "empty or contain only whitespace"), (" /", "empty or contain only whitespace"),
("", "empty or contain only whitespace"), ("", "empty or contain only whitespace"),
("@#$/", "contains no valid characters"), ("@#$/", "contains no valid characters"),
] ]
for invalid_name, expected_error in invalid_cases: for invalid_name, expected_error in invalid_cases:
with pytest.raises(ValueError, match=expected_error): with pytest.raises(ValueError, match=expected_error):
create_folder_structure(invalid_name) create_folder_structure(invalid_name)
finally:
if os.path.exists(old_cwd):
os.chdir(old_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:
os.chdir(temp_dir) old_cwd = os.getcwd()
try:
os.chdir(temp_dir)
valid_cases = [ valid_cases = [
("hello/", "hello", "Hello"), ("hello/", "hello", "Hello"),
("my-project/", "my_project", "MyProject"), ("my-project/", "my_project", "MyProject"),
("hello_world/", "hello_world", "HelloWorld"), ("hello_world/", "hello_world", "HelloWorld"),
("valid123/", "valid123", "Valid123"), ("valid123/", "valid123", "Valid123"),
("hello.world/", "hello.world", "HelloWorld"), ("hello.world/", "hello.world", "HelloWorld"),
("hello@world/", "hello@world", "HelloWorld"), ("hello@world/", "hello@world", "HelloWorld"),
] ]
for valid_name, expected_folder, expected_class in valid_cases: for valid_name, expected_folder, expected_class in valid_cases:
folder_path, folder_name, class_name = create_folder_structure(valid_name) folder_path, folder_name, class_name = create_folder_structure(valid_name)
assert folder_name == expected_folder assert folder_name == expected_folder
assert class_name == expected_class assert class_name == expected_class
assert class_name.isidentifier() assert class_name.isidentifier()
assert not keyword.iskeyword(class_name) assert not keyword.iskeyword(class_name)
if folder_path.exists(): if folder_path.exists():
shutil.rmtree(folder_path) shutil.rmtree(folder_path)
finally:
if os.path.exists(old_cwd):
os.chdir(old_cwd)
@mock.patch("crewai.cli.create_crew.copy_template") @mock.patch("crewai.cli.create_crew.copy_template")