diff --git a/codeflash/cli_cmds/cmd_init.py b/codeflash/cli_cmds/cmd_init.py index d4da0ed04..f90297b51 100644 --- a/codeflash/cli_cmds/cmd_init.py +++ b/codeflash/cli_cmds/cmd_init.py @@ -43,7 +43,7 @@ from argparse import Namespace -def init_codeflash() -> None: +def init_codeflash(non_interactive: bool = False) -> None: try: welcome_panel = Panel( Text( @@ -62,7 +62,7 @@ def init_codeflash() -> None: project_language = detect_project_language() if project_language == ProjectLanguage.JAVA: - init_java_project() + init_java_project(non_interactive=non_interactive) return if project_language in (ProjectLanguage.JAVASCRIPT, ProjectLanguage.TYPESCRIPT): diff --git a/codeflash/cli_cmds/init_java.py b/codeflash/cli_cmds/init_java.py index eb01002fa..1ae213a49 100644 --- a/codeflash/cli_cmds/init_java.py +++ b/codeflash/cli_cmds/init_java.py @@ -147,7 +147,7 @@ def detect_java_test_framework(project_root: Path) -> str: return "junit5" # Default to JUnit 5 -def init_java_project() -> None: +def init_java_project(non_interactive: bool = False) -> None: """Initialize Codeflash for a Java project.""" from codeflash.cli_cmds.github_workflow import install_github_actions from codeflash.cli_cmds.init_auth import install_github_app, prompt_api_key @@ -164,17 +164,25 @@ def init_java_project() -> None: did_add_new_key = prompt_api_key() - should_modify, _config = should_modify_java_config() - - # Default git remote - git_remote = "origin" - - if should_modify: - setup_info = collect_java_setup_info() + if non_interactive: + # Use auto-detected defaults without any interactive prompts + setup_info = JavaSetupInfo() git_remote = setup_info.git_remote or "origin" configured = configure_java_project(setup_info) if not configured: apologize_and_exit() + else: + should_modify, _config = should_modify_java_config() + + # Default git remote + git_remote = "origin" + + if should_modify: + setup_info = collect_java_setup_info() + git_remote = setup_info.git_remote or "origin" + configured = configure_java_project(setup_info) + if not configured: + apologize_and_exit() install_github_app(git_remote) diff --git a/codeflash/main.py b/codeflash/main.py index da0d83db6..4dd5498e6 100644 --- a/codeflash/main.py +++ b/codeflash/main.py @@ -62,7 +62,7 @@ def main() -> None: elif args.command == "init": from codeflash.cli_cmds.cmd_init import init_codeflash - init_codeflash() + init_codeflash(non_interactive=getattr(args, "yes", False)) elif args.command == "init-actions": from codeflash.cli_cmds.github_workflow import install_github_actions diff --git a/tests/test_init_java.py b/tests/test_init_java.py new file mode 100644 index 000000000..002f53541 --- /dev/null +++ b/tests/test_init_java.py @@ -0,0 +1,73 @@ +"""Tests for Java project initialization.""" + +from __future__ import annotations + +from pathlib import Path +from unittest.mock import MagicMock, patch + + +class TestInitJavaNonInteractive: + """Test that non_interactive=True makes Java init fully non-interactive.""" + + def test_non_interactive_skips_prompts_and_uses_auto_detected(self, tmp_path: Path) -> None: + project_dir = (tmp_path / "java-project").resolve() + project_dir.mkdir() + (project_dir / "pom.xml").write_text("", encoding="utf-8") + (project_dir / "src" / "main" / "java").mkdir(parents=True) + (project_dir / "src" / "test" / "java").mkdir(parents=True) + + with ( + patch("codeflash.cli_cmds.init_java.Path.cwd", return_value=project_dir), + patch("codeflash.cli_cmds.init_auth.prompt_api_key", return_value=False), + patch("codeflash.cli_cmds.init_auth.install_github_app"), + patch("codeflash.cli_cmds.github_workflow.install_github_actions"), + patch("codeflash.cli_cmds.init_java.configure_java_project", return_value=True) as mock_configure, + patch("codeflash.cli_cmds.init_java.ph"), + patch("codeflash.cli_cmds.init_java.console"), + patch("codeflash.cli_cmds.init_java.sys") as mock_sys, + ): + mock_sys.exit = MagicMock(side_effect=SystemExit(0)) + + from codeflash.cli_cmds.init_java import JavaSetupInfo, init_java_project + + try: + init_java_project(non_interactive=True) + except SystemExit: + pass + + mock_configure.assert_called_once() + setup_info = mock_configure.call_args[0][0] + assert isinstance(setup_info, JavaSetupInfo) + assert setup_info.module_root_override is None + assert setup_info.test_root_override is None + assert setup_info.formatter_override is None + assert setup_info.git_remote == "origin" + + def test_non_interactive_skips_should_modify_check(self, tmp_path: Path) -> None: + project_dir = (tmp_path / "java-project").resolve() + project_dir.mkdir() + (project_dir / "pom.xml").write_text("", encoding="utf-8") + (project_dir / "src" / "main" / "java").mkdir(parents=True) + (project_dir / "src" / "test" / "java").mkdir(parents=True) + + with ( + patch("codeflash.cli_cmds.init_java.Path.cwd", return_value=project_dir), + patch("codeflash.cli_cmds.init_auth.prompt_api_key", return_value=False), + patch("codeflash.cli_cmds.init_auth.install_github_app"), + patch("codeflash.cli_cmds.github_workflow.install_github_actions"), + patch("codeflash.cli_cmds.init_java.configure_java_project", return_value=True), + patch("codeflash.cli_cmds.init_java.should_modify_java_config") as mock_should_modify, + patch("codeflash.cli_cmds.init_java.ph"), + patch("codeflash.cli_cmds.init_java.console"), + patch("codeflash.cli_cmds.init_java.sys") as mock_sys, + ): + mock_sys.exit = MagicMock(side_effect=SystemExit(0)) + + from codeflash.cli_cmds.init_java import init_java_project + + try: + init_java_project(non_interactive=True) + except SystemExit: + pass + + mock_should_modify.assert_not_called()