1
0
mirror of https://github.com/home-assistant/supervisor.git synced 2025-12-24 12:29:08 +00:00

Handle git dir missing in load and pull

This commit is contained in:
Mike Degatano
2025-08-07 20:42:22 +00:00
parent 0513ea0438
commit ed45651fd9
3 changed files with 143 additions and 13 deletions

View File

@@ -3,13 +3,15 @@
from __future__ import annotations
from pathlib import Path
from unittest.mock import AsyncMock, patch
from unittest.mock import AsyncMock, MagicMock, patch
from git import GitCommandError, InvalidGitRepositoryError, NoSuchPathError
import pytest
from supervisor.coresys import CoreSys
from supervisor.exceptions import StoreGitCloneError, StoreGitError
from supervisor.resolution.const import ContextType, IssueType, SuggestionType
from supervisor.resolution.data import Issue, Suggestion
from supervisor.store.git import GitRepo
REPO_URL = "https://github.com/awesome-developer/awesome-repo"
@@ -93,6 +95,70 @@ async def test_git_load(coresys: CoreSys, tmp_path: Path):
assert mock_repo.call_count == 1
@pytest.mark.usefixtures("tmp_supervisor_data", "supervisor_internet")
async def test_git_load_corrupt(coresys: CoreSys, tmp_path: Path):
"""Test git load with corrupt repo."""
coresys.hardware.disk.get_disk_free_space = lambda x: 5000
repo_dir = tmp_path / "repo"
repo = GitRepo(coresys, repo_dir, REPO_URL)
# Pretend we have a something but not .git to force a reset
repo_dir.mkdir()
marker = repo_dir / "test.txt"
marker.touch()
def mock_clone_from(url, path, *args, **kwargs):
"""Mock to just make a .git and return."""
Path(path, ".git").mkdir()
return MagicMock()
with patch("git.Repo") as mock_repo:
mock_repo.clone_from = mock_clone_from
await repo.load()
assert mock_repo.call_count == 1
assert not marker.exists()
assert (repo_dir / ".git").is_dir()
@pytest.mark.usefixtures("tmp_supervisor_data", "supervisor_internet")
async def test_git_pull_correct(coresys: CoreSys, tmp_path: Path):
"""Test git pull with corrupt repo."""
coresys.hardware.disk.get_disk_free_space = lambda x: 5000
repo_dir = tmp_path / "repo"
repo = GitRepo(coresys, repo_dir, REPO_URL)
# Set up a our fake repo
repo_dir.mkdir()
git_dir = repo_dir / ".git"
git_dir.mkdir()
(repo_dir / "test.txt").touch()
with patch("git.Repo"):
await repo.load()
# Make it corrupt
git_dir.rmdir()
# Check that we get an issue on pull
with pytest.raises(
StoreGitError,
match=f"Can't update {REPO_URL} repo because git information is missing",
):
await repo.pull()
assert (
Issue(
IssueType.CORRUPT_REPOSITORY, ContextType.STORE, reference=repo_dir.stem
)
in coresys.resolution.issues
)
assert (
Suggestion(
SuggestionType.EXECUTE_RESET, ContextType.STORE, reference=repo_dir.stem
)
in coresys.resolution.suggestions
)
@pytest.mark.parametrize(
"git_errors",
[