fix(dashboard): async git status enrichment — await get_repo()
_get_git_status_for_dashboard was sync but called async git_service.get_repo() without await. Coroutine was always truthy, so active_branch access failed silently and returned None. Made function async, added await, updated tests.
This commit is contained in:
@@ -362,62 +362,67 @@ class TestGetLastLlmTaskValidationStatusFallback:
|
||||
class TestGetGitStatusForDashboard:
|
||||
"""_get_git_status_for_dashboard — git repo status enrichment."""
|
||||
|
||||
def test_no_repo(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_no_repo(self):
|
||||
from src.services.resource_service import ResourceService
|
||||
from fastapi import HTTPException
|
||||
svc = ResourceService()
|
||||
svc.git_service = MagicMock()
|
||||
svc.git_service.get_repo.return_value = None
|
||||
result = svc._get_git_status_for_dashboard(42)
|
||||
svc.git_service.get_repo = AsyncMock(side_effect=HTTPException(status_code=404))
|
||||
result = await svc._get_git_status_for_dashboard(42)
|
||||
assert result["sync_status"] == "NO_REPO"
|
||||
assert result["has_repo"] is False
|
||||
|
||||
def test_repo_error(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_repo_error(self):
|
||||
from src.services.resource_service import ResourceService
|
||||
svc = ResourceService()
|
||||
svc.git_service = MagicMock()
|
||||
svc.git_service.get_repo.side_effect = Exception("Git error")
|
||||
result = svc._get_git_status_for_dashboard(42)
|
||||
svc.git_service.get_repo = AsyncMock(side_effect=Exception("Git error"))
|
||||
result = await svc._get_git_status_for_dashboard(42)
|
||||
assert result["sync_status"] == "NO_REPO"
|
||||
|
||||
def test_git_operations_error(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_git_operations_error(self):
|
||||
from src.services.resource_service import ResourceService
|
||||
svc = ResourceService()
|
||||
repo = MagicMock()
|
||||
repo.active_branch.name = "main"
|
||||
repo.is_dirty.side_effect = Exception("Dirty check failed")
|
||||
svc.git_service = MagicMock()
|
||||
svc.git_service.get_repo.return_value = repo
|
||||
result = svc._get_git_status_for_dashboard(42)
|
||||
svc.git_service.get_repo = AsyncMock(return_value=repo)
|
||||
result = await svc._get_git_status_for_dashboard(42)
|
||||
assert result["sync_status"] == "ERROR"
|
||||
assert result["has_repo"] is True
|
||||
|
||||
def test_clean_repo(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_clean_repo(self):
|
||||
from src.services.resource_service import ResourceService
|
||||
svc = ResourceService()
|
||||
repo = MagicMock()
|
||||
repo.active_branch.name = "main"
|
||||
repo.is_dirty.return_value = False
|
||||
svc.git_service = MagicMock()
|
||||
svc.git_service.get_repo.return_value = repo
|
||||
# Mock gitpython's iter_commits functionality
|
||||
svc.git_service.get_repo = AsyncMock(return_value=repo)
|
||||
repo.iter_commits.return_value = []
|
||||
|
||||
result = svc._get_git_status_for_dashboard(42)
|
||||
result = await svc._get_git_status_for_dashboard(42)
|
||||
assert result["sync_status"] == "OK"
|
||||
assert result["has_repo"] is True
|
||||
assert result["branch"] == "main"
|
||||
|
||||
def test_dirty_repo(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_dirty_repo(self):
|
||||
from src.services.resource_service import ResourceService
|
||||
svc = ResourceService()
|
||||
repo = MagicMock()
|
||||
repo.active_branch.name = "main"
|
||||
repo.is_dirty.return_value = True
|
||||
svc.git_service = MagicMock()
|
||||
svc.git_service.get_repo.return_value = repo
|
||||
svc.git_service.get_repo = AsyncMock(return_value=repo)
|
||||
repo.iter_commits.return_value = []
|
||||
|
||||
result = svc._get_git_status_for_dashboard(42)
|
||||
result = await svc._get_git_status_for_dashboard(42)
|
||||
assert result["sync_status"] == "DIFF"
|
||||
assert result["has_changes_for_commit"] is True
|
||||
|
||||
@@ -430,7 +435,7 @@ class TestGetDashboardsWithStatus:
|
||||
def service(self):
|
||||
from src.services.resource_service import ResourceService
|
||||
svc = ResourceService()
|
||||
svc._get_git_status_for_dashboard = MagicMock(return_value={"sync_status": "OK"})
|
||||
svc._get_git_status_for_dashboard = AsyncMock(return_value={"sync_status": "OK"})
|
||||
svc._get_last_llm_task_for_dashboard = MagicMock(return_value={"status": "PASS"})
|
||||
return svc
|
||||
|
||||
@@ -470,7 +475,7 @@ class TestGetDashboardsPageWithStatus:
|
||||
def service(self):
|
||||
from src.services.resource_service import ResourceService
|
||||
svc = ResourceService()
|
||||
svc._get_git_status_for_dashboard = MagicMock(return_value={"sync_status": "OK"})
|
||||
svc._get_git_status_for_dashboard = AsyncMock(return_value={"sync_status": "OK"})
|
||||
svc._get_last_llm_task_for_dashboard = MagicMock(return_value={"status": "PASS"})
|
||||
return svc
|
||||
|
||||
|
||||
Reference in New Issue
Block a user