Files
metin-release-cli/tests/conftest.py
Jan Nedbal d2dd2c88b6 tests: cover phase 1 commands end to end
Pytest suite with a tiny_client fixture, an ephemeral Ed25519 keypair
fixture, and a threaded HTTPServer helper. Exercises cli dispatch,
inspect (including excluded-path handling), build-manifest and sign
against the real m2dev-client scripts, diff-remote via a local server,
and the full release publish composite against a local rsync target.
2026-04-14 18:59:50 +02:00

67 lines
1.9 KiB
Python

from __future__ import annotations
import os
import shutil
import sys
from pathlib import Path
import pytest
# Ensure editable install's src path is on sys.path when running from checkout.
ROOT = Path(__file__).resolve().parents[1]
SRC = ROOT / "src"
if str(SRC) not in sys.path:
sys.path.insert(0, str(SRC))
@pytest.fixture
def tiny_client(tmp_path: Path) -> Path:
"""Copy the checked-in tiny_client fixture into a tmp dir and return it."""
src = Path(__file__).parent / "fixtures" / "tiny_client"
dst = tmp_path / "client"
shutil.copytree(src, dst)
return dst
@pytest.fixture
def make_manifest_script() -> Path:
return Path("/home/jann/metin/repos/m2dev-client/scripts/make-manifest.py")
@pytest.fixture
def sign_manifest_script() -> Path:
return Path("/home/jann/metin/repos/m2dev-client/scripts/sign-manifest.py")
@pytest.fixture(autouse=True)
def reset_env(monkeypatch):
# Don't let ambient env vars bleed into tests.
for key in ("METIN_RELEASE_MAKE_MANIFEST", "METIN_RELEASE_SIGN_MANIFEST"):
monkeypatch.delenv(key, raising=False)
yield
@pytest.fixture
def test_keypair(tmp_path: Path) -> tuple[Path, str]:
"""Generate an ephemeral Ed25519 keypair, write the private key mode 600.
Returns (private_key_path, public_key_hex).
"""
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
priv = Ed25519PrivateKey.generate()
raw = priv.private_bytes(
encoding=serialization.Encoding.Raw,
format=serialization.PrivateFormat.Raw,
encryption_algorithm=serialization.NoEncryption(),
)
key_path = tmp_path / "key"
key_path.write_bytes(raw)
os.chmod(key_path, 0o600)
pub_hex = priv.public_key().public_bytes(
encoding=serialization.Encoding.Raw,
format=serialization.PublicFormat.Raw,
).hex()
return key_path, pub_hex