Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions codeflash/cli_cmds/cmd_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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):
Expand Down
24 changes: 16 additions & 8 deletions codeflash/cli_cmds/init_java.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion codeflash/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
73 changes: 73 additions & 0 deletions tests/test_init_java.py
Original file line number Diff line number Diff line change
@@ -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("<project/>", 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("<project/>", 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()
Loading