diff --git a/codeflash/optimization/optimizer.py b/codeflash/optimization/optimizer.py index 917a413e1..4cea1e708 100644 --- a/codeflash/optimization/optimizer.py +++ b/codeflash/optimization/optimizer.py @@ -826,8 +826,8 @@ def worktree_mode(self) -> Result[bool, str]: return Success(True) # noqa: FBT003 def mirror_paths_for_worktree_mode(self, worktree_dir: Path) -> None: - original_args = copy.deepcopy(self.args) - original_test_cfg = copy.deepcopy(self.test_cfg) + original_args = copy.copy(self.args) + original_test_cfg = copy.copy(self.test_cfg) self.original_args_and_test_cfg = (original_args, original_test_cfg) original_git_root = git_root_dir() diff --git a/tests/test_worktree.py b/tests/test_worktree.py index 75de860fd..f09cfb1b0 100644 --- a/tests/test_worktree.py +++ b/tests/test_worktree.py @@ -7,7 +7,7 @@ from codeflash.optimization.optimizer import Optimizer -def test_mirror_paths_for_worktree_mode(monkeypatch: pytest.MonkeyPatch): +def test_mirror_paths_for_worktree_mode(monkeypatch: pytest.MonkeyPatch) -> None: repo_root = Path(__file__).resolve().parent.parent project_root = repo_root / "code_to_optimize" / "code_directories" / "nested_module_root" @@ -67,3 +67,103 @@ def test_mirror_paths_for_worktree_mode(monkeypatch: pytest.MonkeyPatch): assert optimizer.test_cfg.tests_root == worktree_dir / "tests" assert optimizer.test_cfg.project_root_path == worktree_dir # same as project_root assert optimizer.test_cfg.tests_project_rootdir == worktree_dir # same as test_project_root + + +def test_mirror_paths_preserves_original_args(monkeypatch: pytest.MonkeyPatch) -> None: + repo_root = Path(__file__).resolve().parent.parent + project_root = repo_root / "code_to_optimize" / "code_directories" / "nested_module_root" + + monkeypatch.setattr("codeflash.optimization.optimizer.git_root_dir", lambda: project_root) + + args = Namespace() + args.benchmark = False + args.benchmarks_root = None + args.no_pr = True + args.config_file = project_root / "pyproject.toml" + args.file = project_root / "src" / "app" / "main.py" + args.worktree = True + + new_args = process_pyproject_config(args) + optimizer = Optimizer(new_args) + + original_project_root = optimizer.args.project_root + original_module_root = optimizer.args.module_root + original_file = optimizer.args.file + original_tests_root = optimizer.args.tests_root + original_test_project_root = optimizer.args.test_project_root + + worktree_dir = repo_root / "worktree" + optimizer.mirror_paths_for_worktree_mode(worktree_dir) + + assert optimizer.original_args_and_test_cfg is not None + saved_args = optimizer.original_args_and_test_cfg[0] + assert saved_args.project_root == original_project_root + assert saved_args.module_root == original_module_root + assert saved_args.file == original_file + assert saved_args.tests_root == original_tests_root + assert saved_args.test_project_root == original_test_project_root + + +def test_mirror_paths_preserves_original_test_cfg(monkeypatch: pytest.MonkeyPatch) -> None: + repo_root = Path(__file__).resolve().parent.parent + project_root = repo_root / "code_to_optimize" / "code_directories" / "nested_module_root" + + monkeypatch.setattr("codeflash.optimization.optimizer.git_root_dir", lambda: project_root) + + args = Namespace() + args.benchmark = False + args.benchmarks_root = None + args.no_pr = True + args.config_file = project_root / "pyproject.toml" + args.file = project_root / "src" / "app" / "main.py" + args.worktree = True + + new_args = process_pyproject_config(args) + optimizer = Optimizer(new_args) + + original_tests_root = optimizer.test_cfg.tests_root + original_project_root_path = optimizer.test_cfg.project_root_path + original_tests_project_rootdir = optimizer.test_cfg.tests_project_rootdir + + worktree_dir = repo_root / "worktree" + optimizer.mirror_paths_for_worktree_mode(worktree_dir) + + assert optimizer.original_args_and_test_cfg is not None + saved_test_cfg = optimizer.original_args_and_test_cfg[1] + assert saved_test_cfg.tests_root == original_tests_root + assert saved_test_cfg.project_root_path == original_project_root_path + assert saved_test_cfg.tests_project_rootdir == original_tests_project_rootdir + + +def test_shallow_copy_independence(monkeypatch: pytest.MonkeyPatch) -> None: + repo_root = Path(__file__).resolve().parent.parent + project_root = repo_root / "code_to_optimize" / "code_directories" / "nested_module_root" + + monkeypatch.setattr("codeflash.optimization.optimizer.git_root_dir", lambda: project_root) + + args = Namespace() + args.benchmark = False + args.benchmarks_root = None + args.no_pr = True + args.config_file = project_root / "pyproject.toml" + args.file = project_root / "src" / "app" / "main.py" + args.worktree = True + + new_args = process_pyproject_config(args) + optimizer = Optimizer(new_args) + + worktree_dir = repo_root / "worktree" + optimizer.mirror_paths_for_worktree_mode(worktree_dir) + + assert optimizer.original_args_and_test_cfg is not None + saved_args = optimizer.original_args_and_test_cfg[0] + saved_test_cfg = optimizer.original_args_and_test_cfg[1] + + original_project_root = saved_args.project_root + original_tests_root = saved_test_cfg.tests_root + + optimizer.args.project_root = Path("/mutated/path") + optimizer.test_cfg.tests_root = Path("/mutated/tests") + + assert saved_args.project_root == original_project_root + assert saved_test_cfg.tests_root == original_tests_root