111 lines
3.4 KiB
Python
111 lines
3.4 KiB
Python
import subprocess
|
|
from dataclasses import replace
|
|
from pathlib import Path
|
|
from unittest.mock import Mock
|
|
|
|
import pytest
|
|
|
|
from lai_automation.git import GitWorkspace
|
|
from lai_automation.models import ChangeSummary
|
|
|
|
|
|
def test_normalize_changed_whitespace_cleans_new_text_file(
|
|
settings,
|
|
tmp_path: Path,
|
|
) -> None:
|
|
workspace = GitWorkspace(replace(settings, workspace_root=tmp_path), 1)
|
|
workspace.path.mkdir(parents=True)
|
|
changed = workspace.path / "new.php"
|
|
changed.write_bytes(b"<?php \r\nreturn true;\t")
|
|
workspace._git = Mock(
|
|
side_effect=[
|
|
subprocess.CompletedProcess([], 0, "", ""),
|
|
subprocess.CompletedProcess([], 0, "new.php\n", ""),
|
|
]
|
|
)
|
|
|
|
normalized = workspace.normalize_changed_whitespace(
|
|
ChangeSummary(("new.php",), 2, 0)
|
|
)
|
|
|
|
assert normalized == ("new.php",)
|
|
assert changed.read_bytes() == b"<?php\r\nreturn true;"
|
|
|
|
|
|
def test_normalize_changed_whitespace_only_cleans_reported_tracked_lines(
|
|
settings,
|
|
tmp_path: Path,
|
|
) -> None:
|
|
workspace = GitWorkspace(replace(settings, workspace_root=tmp_path), 1)
|
|
workspace.path.mkdir(parents=True)
|
|
changed = workspace.path / "tracked.php"
|
|
changed.write_bytes(b"<?php \nlegacy whitespace \n")
|
|
workspace._git = Mock(
|
|
side_effect=[
|
|
subprocess.CalledProcessError(
|
|
2,
|
|
["git", "diff", "--check"],
|
|
output="tracked.php:1: trailing whitespace.\n",
|
|
stderr="",
|
|
),
|
|
subprocess.CompletedProcess([], 0, "", ""),
|
|
]
|
|
)
|
|
|
|
normalized = workspace.normalize_changed_whitespace(
|
|
ChangeSummary(("tracked.php",), 1, 1)
|
|
)
|
|
|
|
assert normalized == ("tracked.php",)
|
|
assert changed.read_bytes() == b"<?php\nlegacy whitespace \n"
|
|
|
|
|
|
def test_check_diff_accepts_clean_changed_file(settings, tmp_path: Path) -> None:
|
|
workspace = GitWorkspace(replace(settings, workspace_root=tmp_path), 1)
|
|
workspace.path.mkdir(parents=True)
|
|
(workspace.path / "app.php").write_text("<?php\nreturn true;\n")
|
|
workspace._git = Mock(
|
|
side_effect=[
|
|
subprocess.CompletedProcess([], 0, "", ""),
|
|
subprocess.CompletedProcess([], 0, "app.php\n", ""),
|
|
]
|
|
)
|
|
|
|
workspace.check_diff(ChangeSummary(("app.php",), 2, 0))
|
|
|
|
assert workspace._git.call_count == 2
|
|
|
|
|
|
def test_check_diff_rejects_trailing_whitespace_in_untracked_file(
|
|
settings,
|
|
tmp_path: Path,
|
|
) -> None:
|
|
workspace = GitWorkspace(replace(settings, workspace_root=tmp_path), 1)
|
|
workspace.path.mkdir(parents=True)
|
|
(workspace.path / "app.php").write_text("<?php \n")
|
|
workspace._git = Mock(
|
|
side_effect=[
|
|
subprocess.CompletedProcess([], 0, "", ""),
|
|
subprocess.CompletedProcess([], 0, "app.php\n", ""),
|
|
]
|
|
)
|
|
|
|
with pytest.raises(RuntimeError, match="trailing whitespace"):
|
|
workspace.check_diff(ChangeSummary(("app.php",), 1, 0))
|
|
|
|
|
|
def test_check_diff_ignores_unchanged_whitespace_in_tracked_file(
|
|
settings,
|
|
tmp_path: Path,
|
|
) -> None:
|
|
workspace = GitWorkspace(replace(settings, workspace_root=tmp_path), 1)
|
|
workspace.path.mkdir(parents=True)
|
|
(workspace.path / "legacy.php").write_text("<?php \nreturn true;\n")
|
|
workspace._git = Mock(
|
|
side_effect=[
|
|
subprocess.CompletedProcess([], 0, "", ""),
|
|
subprocess.CompletedProcess([], 0, "", ""),
|
|
]
|
|
)
|
|
|
|
workspace.check_diff(ChangeSummary(("legacy.php",), 1, 0)) |