Initial import of cf-temp-email deploy CLI
This commit is contained in:
102
tests/test_source.py
Normal file
102
tests/test_source.py
Normal file
@@ -0,0 +1,102 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
from cf_temp_email_deploy.models import DeploymentConfig, DeploymentState
|
||||
from cf_temp_email_deploy.source import prepare_source
|
||||
from cf_temp_email_deploy.subprocess_runner import CommandRunner
|
||||
|
||||
|
||||
def run_git(args: tuple[str, ...], cwd: Path) -> str:
|
||||
completed = subprocess.run(args, cwd=cwd, check=True, capture_output=True, text=True)
|
||||
return completed.stdout.strip()
|
||||
|
||||
|
||||
def create_git_repository(path: Path) -> str:
|
||||
path.mkdir(parents=True, exist_ok=True)
|
||||
run_git(("git", "init", "-b", "main"), path)
|
||||
run_git(("git", "config", "user.name", "Codex"), path)
|
||||
run_git(("git", "config", "user.email", "codex@example.com"), path)
|
||||
(path / "README.md").write_text("demo\n", encoding="utf-8")
|
||||
run_git(("git", "add", "README.md"), path)
|
||||
run_git(("git", "commit", "-m", "initial"), path)
|
||||
return run_git(("git", "rev-parse", "HEAD"), path)
|
||||
|
||||
|
||||
def test_prepare_local_source_records_commit(tmp_path: Path) -> None:
|
||||
repo_dir = tmp_path / "local-repo"
|
||||
expected_sha = create_git_repository(repo_dir)
|
||||
|
||||
config = DeploymentConfig.model_validate(
|
||||
{
|
||||
"source": {
|
||||
"mode": "local",
|
||||
"local_path": str(repo_dir),
|
||||
},
|
||||
"cloudflare": {"zone_name": "example.com"},
|
||||
"mail": {"domains": ["mail.example.com"], "verified_destination_address": "target@example.com"},
|
||||
"pages": {"custom_domain": "mail.example.com"},
|
||||
}
|
||||
)
|
||||
|
||||
prepared = prepare_source(config, CommandRunner())
|
||||
|
||||
assert prepared.source_dir == repo_dir.resolve()
|
||||
assert prepared.commit_sha == expected_sha
|
||||
|
||||
state = DeploymentState()
|
||||
prepared.apply_to_state(state)
|
||||
assert state.source.source_dir == str(repo_dir.resolve())
|
||||
assert state.source.commit_sha == expected_sha
|
||||
|
||||
|
||||
def test_prepare_clone_source_clones_and_checks_out_ref(tmp_path: Path) -> None:
|
||||
origin_dir = tmp_path / "origin-repo"
|
||||
expected_sha = create_git_repository(origin_dir)
|
||||
workspace_dir = tmp_path / "workspace"
|
||||
|
||||
config = DeploymentConfig.model_validate(
|
||||
{
|
||||
"source": {
|
||||
"mode": "clone",
|
||||
"repo_url": str(origin_dir),
|
||||
"repo_ref": "main",
|
||||
"workspace_dir": str(workspace_dir),
|
||||
},
|
||||
"cloudflare": {"zone_name": "example.com"},
|
||||
"mail": {"domains": ["mail.example.com"], "verified_destination_address": "target@example.com"},
|
||||
"pages": {"custom_domain": "mail.example.com"},
|
||||
}
|
||||
)
|
||||
|
||||
prepared = prepare_source(config, CommandRunner())
|
||||
|
||||
assert prepared.source_dir == (workspace_dir / "source").resolve()
|
||||
assert prepared.commit_sha == expected_sha
|
||||
assert (prepared.source_dir / "README.md").read_text(encoding="utf-8") == "demo\n"
|
||||
|
||||
|
||||
def test_prepare_clone_source_uses_latest_default_branch_when_repo_ref_empty(tmp_path: Path) -> None:
|
||||
origin_dir = tmp_path / "origin-repo"
|
||||
expected_sha = create_git_repository(origin_dir)
|
||||
workspace_dir = tmp_path / "workspace"
|
||||
|
||||
config = DeploymentConfig.model_validate(
|
||||
{
|
||||
"source": {
|
||||
"mode": "clone",
|
||||
"repo_url": str(origin_dir),
|
||||
"repo_ref": "",
|
||||
"workspace_dir": str(workspace_dir),
|
||||
},
|
||||
"cloudflare": {"zone_name": "example.com"},
|
||||
"mail": {"domains": ["example.com"], "verified_destination_address": "target@example.com"},
|
||||
"pages": {"custom_domain": "email.example.com"},
|
||||
}
|
||||
)
|
||||
|
||||
prepared = prepare_source(config, CommandRunner())
|
||||
|
||||
assert prepared.source_dir == (workspace_dir / "source").resolve()
|
||||
assert prepared.commit_sha == expected_sha
|
||||
Reference in New Issue
Block a user