from dataclasses import replace from test_config import settings from lai_automation.git import ChangeSummary from lai_automation.policy import evaluate_changes def test_policy_accepts_small_application_change() -> None: result = evaluate_changes( ChangeSummary(("app/Services/Example.php", "tests/Feature/ExampleTest.php"), 40, 5), settings(), ) assert result.allowed def test_policy_rejects_secrets_and_vendor_paths() -> None: result = evaluate_changes( ChangeSummary((".env", "vendor/foo.php", ".aider.tags.cache.v4/cache.db"), 3, 0), settings(), ) assert not result.allowed assert len(result.errors) == 3 def test_policy_rejects_test_only_repair() -> None: result = evaluate_changes( ChangeSummary(("tests/Unit/ExampleTest.php",), 20, 2), settings(), ) assert not result.allowed assert "production behavior was not fixed" in result.errors[0] def test_direct_main_blocks_validator_and_migrations() -> None: config = replace( settings(), mode="direct-main", dry_run=False, allow_direct_main=True, gitea_token="token", ) result = evaluate_changes( ChangeSummary(("app/Services/SQLValidatorService.php", "database/migrations/new.php"), 10, 2), config, ) assert not result.allowed def test_policy_rejects_symlinks(tmp_path) -> None: (tmp_path / "link.php").symlink_to("/etc/passwd") result = evaluate_changes(ChangeSummary(("link.php",), 1, 0), settings(), tmp_path) assert not result.allowed