from pathlib import Path import pytest from lai_automation.config import Settings def settings(**overrides) -> Settings: values = { "database_host": "db", "database_port": 3306, "database_name": "lai", "database_user": "worker", "database_password": "secret", "source_repository": "https://example.test/lai.git", "source_branch": "main", "workspace_root": Path("/tmp/workspaces"), "mode": "dry-run", "allow_direct_main": False, "gitea_url": "https://example.test", "gitea_owner": "owner", "gitea_repository": "lai", "gitea_token": "", "gitea_username": "bot", "agent_command": "aider", "agent_model": "mistral/test", "test_commands": ("php artisan test",), "test_database_host": "test-db", "test_database_port": 3306, "test_database_name": "lai_agent_test", "test_database_user": "test_runner", "test_database_password": "test-secret", "test_customer_database": "customer_agent_test", "test_config_database": "cockpit_agent_test", "poll_seconds": 60, "max_changed_files": 12, "max_changed_lines": 800, "stale_claim_minutes": 90, "dry_run": True, } values.update(overrides) return Settings(**values) def test_direct_main_requires_explicit_kill_switch() -> None: config = settings(mode="direct-main", dry_run=False, gitea_token="token") with pytest.raises(ValueError, match="ALLOW_DIRECT_MAIN"): config.validate() def test_pr_requires_gitea_token() -> None: config = settings(mode="pr", dry_run=False) with pytest.raises(ValueError, match="GITEA_TOKEN"): config.validate() def test_default_commands_initialize_disposable_laravel_schema(monkeypatch) -> None: monkeypatch.setenv("FAILURE_DB_PASSWORD", "failure-secret") monkeypatch.setenv("TEST_DB_PASSWORD", "test-secret") monkeypatch.delenv("TEST_COMMANDS", raising=False) config = Settings.from_env() assert "php artisan migrate:fresh --force" in config.test_commands assert config.test_commands[-1] == "php artisan test"