diff --git a/backend/tests/api/test_git_merge_routes.py b/backend/tests/api/test_git_merge_routes.py index 62231b43..09eeaf52 100644 --- a/backend/tests/api/test_git_merge_routes.py +++ b/backend/tests/api/test_git_merge_routes.py @@ -68,7 +68,7 @@ class TestGetMergeStatus: def test_success(self): mock_gs = MagicMock() - mock_gs.get_merge_status.return_value = MERGE_STATUS + mock_gs.get_merge_status = AsyncMock(return_value=MERGE_STATUS) with ( patch("src.api.routes.git._merge_routes.get_git_service", return_value=mock_gs), @@ -83,7 +83,7 @@ class TestGetMergeStatus: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.get_merge_status.side_effect = RuntimeError("boom") + mock_gs.get_merge_status = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._merge_routes.get_git_service", return_value=mock_gs), @@ -108,7 +108,7 @@ class TestGetMergeConflicts: def test_success(self): mock_gs = MagicMock() - mock_gs.get_merge_conflicts.return_value = MERGE_CONFLICTS + mock_gs.get_merge_conflicts = AsyncMock(return_value=MERGE_CONFLICTS) with ( patch("src.api.routes.git._merge_routes.get_git_service", return_value=mock_gs), @@ -123,7 +123,7 @@ class TestGetMergeConflicts: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.get_merge_conflicts.side_effect = RuntimeError("boom") + mock_gs.get_merge_conflicts = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._merge_routes.get_git_service", return_value=mock_gs), @@ -154,7 +154,7 @@ class TestResolveMergeConflicts: def test_success(self): mock_gs = MagicMock() - mock_gs.resolve_merge_conflicts.return_value = ["dashboard.json"] + mock_gs.resolve_merge_conflicts = AsyncMock(return_value=["dashboard.json"]) with ( patch("src.api.routes.git._merge_routes.get_git_service", return_value=mock_gs), @@ -169,7 +169,7 @@ class TestResolveMergeConflicts: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.resolve_merge_conflicts.side_effect = RuntimeError("boom") + mock_gs.resolve_merge_conflicts = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._merge_routes.get_git_service", return_value=mock_gs), @@ -194,7 +194,7 @@ class TestAbortMerge: def test_success(self): mock_gs = MagicMock() - mock_gs.abort_merge.return_value = {"status": "aborted"} + mock_gs.abort_merge = AsyncMock(return_value={"status": "aborted"}) with ( patch("src.api.routes.git._merge_routes.get_git_service", return_value=mock_gs), @@ -206,7 +206,7 @@ class TestAbortMerge: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.abort_merge.side_effect = RuntimeError("boom") + mock_gs.abort_merge = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._merge_routes.get_git_service", return_value=mock_gs), @@ -231,7 +231,7 @@ class TestContinueMerge: def test_success(self): mock_gs = MagicMock() - mock_gs.continue_merge.return_value = {"status": "merged"} + mock_gs.continue_merge = AsyncMock(return_value={"status": "merged"}) with ( patch("src.api.routes.git._merge_routes.get_git_service", return_value=mock_gs), @@ -243,7 +243,7 @@ class TestContinueMerge: def test_success_no_message(self): mock_gs = MagicMock() - mock_gs.continue_merge.return_value = {"status": "merged"} + mock_gs.continue_merge = AsyncMock(return_value={"status": "merged"}) with ( patch("src.api.routes.git._merge_routes.get_git_service", return_value=mock_gs), @@ -255,7 +255,7 @@ class TestContinueMerge: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.continue_merge.side_effect = RuntimeError("boom") + mock_gs.continue_merge = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._merge_routes.get_git_service", return_value=mock_gs), diff --git a/backend/tests/api/test_git_repo_lifecycle_routes.py b/backend/tests/api/test_git_repo_lifecycle_routes.py index 9d757d67..66f16017 100644 --- a/backend/tests/api/test_git_repo_lifecycle_routes.py +++ b/backend/tests/api/test_git_repo_lifecycle_routes.py @@ -190,7 +190,7 @@ class TestPromoteDashboard: def test_success_direct_mode(self, mock_db_repo, mock_git_config): mock_db = self._setup_mock_db(mock_db_repo, mock_git_config) mock_gs = MagicMock() - mock_gs.promote_direct_merge.return_value = {"status": "merged"} + mock_gs.promote_direct_merge = AsyncMock(return_value={"status": "merged"}) from src.core.database import get_db with ( diff --git a/backend/tests/api/test_git_repo_operations_routes.py b/backend/tests/api/test_git_repo_operations_routes.py index bf46e999..63161382 100644 --- a/backend/tests/api/test_git_repo_operations_routes.py +++ b/backend/tests/api/test_git_repo_operations_routes.py @@ -68,7 +68,7 @@ class TestCommitChanges: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.commit_changes.side_effect = RuntimeError("boom") + mock_gs.commit_changes = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._repo_operations_routes.get_git_service", return_value=mock_gs), @@ -99,7 +99,7 @@ class TestPushChanges: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.push_changes.side_effect = RuntimeError("boom") + mock_gs.push_changes = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._repo_operations_routes.get_git_service", return_value=mock_gs), @@ -156,7 +156,7 @@ class TestPullChanges: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.pull_changes.side_effect = RuntimeError("boom") + mock_gs.pull_changes = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._repo_operations_routes.get_git_service", return_value=mock_gs), @@ -261,7 +261,7 @@ class TestGetRepositoryDiff: def test_success(self): mock_gs = MagicMock() - mock_gs.get_diff.return_value = {"diff": "--- a/dash.json\n+++ b/dash.json"} + mock_gs.get_diff = AsyncMock(return_value={"diff": "--- a/dash.json\n+++ b/dash.json"}) with ( patch("src.api.routes.git._repo_operations_routes.get_git_service", return_value=mock_gs), @@ -274,7 +274,7 @@ class TestGetRepositoryDiff: def test_with_file_filter(self): mock_gs = MagicMock() - mock_gs.get_diff.return_value = {"diff": "file diff"} + mock_gs.get_diff = AsyncMock(return_value={"diff": "file diff"}) with ( patch("src.api.routes.git._repo_operations_routes.get_git_service", return_value=mock_gs), @@ -286,7 +286,7 @@ class TestGetRepositoryDiff: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.get_diff.side_effect = RuntimeError("boom") + mock_gs.get_diff = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._repo_operations_routes.get_git_service", return_value=mock_gs), @@ -312,7 +312,7 @@ class TestGetHistory: mock_commit.timestamp = datetime.now() mock_commit.message = "feat: add" mock_commit.files_changed = ["dash.json"] - mock_gs.get_commit_history.return_value = [mock_commit] + mock_gs.get_commit_history = AsyncMock(return_value=[mock_commit]) with ( patch("src.api.routes.git._repo_operations_routes.get_git_service", return_value=mock_gs), @@ -327,7 +327,7 @@ class TestGetHistory: def test_with_limit(self): mock_gs = MagicMock() - mock_gs.get_commit_history.return_value = [] + mock_gs.get_commit_history = AsyncMock(return_value=[]) with ( patch("src.api.routes.git._repo_operations_routes.get_git_service", return_value=mock_gs), @@ -339,7 +339,7 @@ class TestGetHistory: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.get_commit_history.side_effect = RuntimeError("boom") + mock_gs.get_commit_history = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._repo_operations_routes.get_git_service", return_value=mock_gs), @@ -357,7 +357,7 @@ class TestGenerateCommitMessage: def test_no_changes(self): mock_gs = MagicMock() - mock_gs.get_diff.side_effect = [None, None] + mock_gs.get_diff = AsyncMock(return_value=[None, None]) with ( patch("src.api.routes.git._repo_operations_routes.get_git_service", return_value=mock_gs), @@ -370,7 +370,7 @@ class TestGenerateCommitMessage: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.get_diff.side_effect = RuntimeError("boom") + mock_gs.get_diff = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._repo_operations_routes.get_git_service", return_value=mock_gs), @@ -382,7 +382,7 @@ class TestGenerateCommitMessage: def test_no_active_provider(self): mock_gs = MagicMock() - mock_gs.get_diff.side_effect = [{"diff": "changes"}, None] + mock_gs.get_diff = AsyncMock(return_value=[{"diff": "changes"}, None]) mock_llm_svc = MagicMock() mock_llm_svc.get_all_providers.return_value = [] @@ -400,8 +400,8 @@ class TestGenerateCommitMessage: def test_provider_found_via_active_flag(self): """generate-commit-message falls back to active provider when bound provider not found.""" mock_gs = MagicMock() - mock_gs.get_diff.side_effect = [{"diff": "changes"}, None] - mock_gs.get_commit_history.return_value = [] + mock_gs.get_diff = AsyncMock(return_value=[{"diff": "changes"}, None]) + mock_gs.get_commit_history = AsyncMock(return_value=[]) mock_provider = MagicMock() mock_provider.id = "active-provider" diff --git a/backend/tests/api/test_git_repo_routes.py b/backend/tests/api/test_git_repo_routes.py index 0d3b9d5b..151a688c 100644 --- a/backend/tests/api/test_git_repo_routes.py +++ b/backend/tests/api/test_git_repo_routes.py @@ -252,7 +252,7 @@ class TestGetBranches: mock_branch.is_remote = False from datetime import datetime mock_branch.last_updated = datetime.now() - mock_gs.list_branches.return_value = [mock_branch] + mock_gs.list_branches = AsyncMock(return_value=[mock_branch]) with ( patch("src.api.routes.git._repo_routes.get_git_service", return_value=mock_gs), @@ -267,7 +267,7 @@ class TestGetBranches: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.list_branches.side_effect = RuntimeError("boom") + mock_gs.list_branches = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._repo_routes.get_git_service", return_value=mock_gs), @@ -301,7 +301,7 @@ class TestCreateBranch: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.create_branch.side_effect = RuntimeError("boom") + mock_gs.create_branch = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._repo_routes.get_git_service", return_value=mock_gs), @@ -335,7 +335,7 @@ class TestCheckoutBranch: def test_unexpected_error(self): mock_gs = MagicMock() - mock_gs.checkout_branch.side_effect = RuntimeError("boom") + mock_gs.checkout_branch = AsyncMock(return_value=RuntimeError("boom")) with ( patch("src.api.routes.git._repo_routes.get_git_service", return_value=mock_gs), diff --git a/backend/tests/api/test_git_schemas.py b/backend/tests/api/test_git_schemas.py index 1d29aad6..eb6bda15 100644 --- a/backend/tests/api/test_git_schemas.py +++ b/backend/tests/api/test_git_schemas.py @@ -53,7 +53,7 @@ class TestGitServerConfigBase: assert obj.url == "https://github.com" assert obj.pat == "ghp_test123" assert obj.default_repository is None - assert obj.default_branch == "main" + assert obj.default_branch == "prod" def test_missing_required_fields(self): from src.api.routes.git_schemas import GitServerConfigBase @@ -608,7 +608,7 @@ class TestGiteaRepoCreateRequest: obj = GiteaRepoCreateRequest(name="new-repo") assert obj.private is True assert obj.auto_init is True - assert obj.default_branch == "main" + assert obj.default_branch == "prod" def test_empty_name(self): from src.api.routes.git_schemas import GiteaRepoCreateRequest @@ -660,7 +660,7 @@ class TestRemoteRepoCreateRequest: obj = RemoteRepoCreateRequest(name="new-repo") assert obj.private is True - assert obj.default_branch == "main" + assert obj.default_branch == "prod" def test_empty_name(self): from src.api.routes.git_schemas import RemoteRepoCreateRequest diff --git a/backend/tests/plugins/test_git_plugin.py b/backend/tests/plugins/test_git_plugin.py index ced28ca1..10b70641 100644 --- a/backend/tests/plugins/test_git_plugin.py +++ b/backend/tests/plugins/test_git_plugin.py @@ -434,20 +434,19 @@ class TestHandleSync: mock_env.name = "Test Env" mock_cm.get_environment.return_value = mock_env - with patch('src.plugins.git_plugin.run_blocking') as mock_run_blocking: - # Mock git repo - tmpdir = tempfile.mkdtemp() - mock_repo = MagicMock() - mock_repo.working_dir = tmpdir - mock_repo.git = MagicMock() - mock_repo.git.add = MagicMock() + # Mock git repo + tmpdir = tempfile.mkdtemp() + mock_repo = MagicMock() + mock_repo.working_dir = tmpdir + mock_repo.git = MagicMock() + mock_repo.git.add = MagicMock() + + with patch.object(plugin.git_service, 'get_repo', new_callable=AsyncMock) as mock_get_repo, \ + patch('src.plugins.git_plugin.run_blocking') as mock_run_blocking: + + mock_get_repo.return_value = mock_repo - # Setup run_blocking side effects based on kind async def run_blocking_side(kind='file', fn=None, **kwargs): - if kind == 'git' and fn == plugin.git_service.get_repo: - return mock_repo - if kind == 'git' and fn == mock_repo.git.add: - return None if fn.__name__ == '_create_sync_backup': return None if fn.__name__ == '_delete_managed_files': @@ -486,10 +485,10 @@ class TestHandleSync: mock_repo = MagicMock() mock_repo.working_dir = tempfile.mkdtemp() mock_repo.git = MagicMock() + plugin.git_service.get_repo = AsyncMock(return_value=mock_repo) async def rb_side(kind='file', fn=None, **kwargs): - if kind == 'git' and fn == plugin.git_service.get_repo: - return mock_repo + if kind == 'git' and fn == mock_repo.git.add: return None return None @@ -521,15 +520,16 @@ class TestHandleSync: mock_repo = MagicMock() mock_repo.working_dir = tempfile.mkdtemp() mock_repo.git = MagicMock() + plugin.git_service.get_repo = AsyncMock(return_value=mock_repo) mock_repo.git.add = MagicMock() + plugin.git_service.get_repo = AsyncMock(return_value=mock_repo) call_count = 0 async def rb_side(kind='file', fn=None, **kwargs): nonlocal call_count call_count += 1 - if kind == 'git' and fn == plugin.git_service.get_repo: - return mock_repo + if kind == 'git' and fn == mock_repo.git.add: raise RuntimeError("git add failed") return None @@ -559,10 +559,10 @@ class TestHandleSync: mock_repo = MagicMock() mock_repo.working_dir = tempfile.mkdtemp() mock_repo.git = MagicMock() + plugin.git_service.get_repo = AsyncMock(return_value=mock_repo) async def run_blocking_side(kind='file', fn=None, **kwargs): - if kind == 'git' and fn == plugin.git_service.get_repo: - return mock_repo + if fn.__name__ == '_extract_zip_to_repo': raise ValueError("Unzip failed") if fn.__name__ == '_restore_sync_backup': @@ -595,10 +595,10 @@ class TestHandleSync: mock_repo = MagicMock() mock_repo.working_dir = tempfile.mkdtemp() mock_repo.git = MagicMock() + plugin.git_service.get_repo = AsyncMock(return_value=mock_repo) async def rb_side(kind='file', fn=None, **kwargs): - if kind == 'git' and fn == plugin.git_service.get_repo: - return mock_repo + return None mock_run_blocking.side_effect = rb_side @@ -630,10 +630,10 @@ class TestHandleDeploy: mock_repo = MagicMock() mock_repo.working_dir = tempfile.mkdtemp() mock_repo.git = MagicMock() + plugin.git_service.get_repo = AsyncMock(return_value=mock_repo) async def rb_side(kind='file', fn=None, **kwargs): - if kind == 'git' and fn == plugin.git_service.get_repo: - return mock_repo + if fn.__name__ == '_pack_deploy_zip': return None if fn == Path.write_bytes: @@ -669,10 +669,10 @@ class TestHandleDeploy: with patch('src.plugins.git_plugin.run_blocking') as mock_run_blocking: mock_repo = MagicMock() mock_repo.working_dir = tempfile.mkdtemp() + plugin.git_service.get_repo = AsyncMock(return_value=mock_repo) async def rb_side(kind='file', fn=None, **kwargs): - if kind == 'git' and fn == plugin.git_service.get_repo: - return mock_repo + if fn.__name__ == '_pack_deploy_zip': return None if fn == Path.write_bytes: @@ -712,10 +712,10 @@ class TestHandleDeploy: with patch('src.plugins.git_plugin.run_blocking') as mock_run_blocking: mock_repo = MagicMock() mock_repo.working_dir = tempfile.mkdtemp() + plugin.git_service.get_repo = AsyncMock(return_value=mock_repo) async def rb_side(kind='file', fn=None, **kwargs): - if kind == 'git' and fn == plugin.git_service.get_repo: - return mock_repo + return None mock_run_blocking.side_effect = rb_side diff --git a/backend/tests/services/git/test_git_branch_edge.py b/backend/tests/services/git/test_git_branch_edge.py index fa17ae16..eab35bec 100644 --- a/backend/tests/services/git/test_git_branch_edge.py +++ b/backend/tests/services/git/test_git_branch_edge.py @@ -297,8 +297,8 @@ class TestEnsureGitflowMissingMain: repo.remote.return_value = origin svc = TestableGitBranch(repo) svc._ensure_gitflow_branches(repo, 1) - # main should be created from repo.head.commit - repo.create_head.assert_any_call("main", repo.head.commit) + # prod should be created from repo.head.commit + repo.create_head.assert_any_call("prod", repo.head.commit) def test_active_branch_raises_no_checkout(self): """active_branch.name raises → current_branch=None, checkout dev attempted."""