test(v2): define secure control-plane contracts

This commit is contained in:
2026-07-27 19:56:01 +02:00
parent 8b831fc985
commit cb864bcac5
12 changed files with 499 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
from __future__ import annotations
import importlib
from collections.abc import AsyncIterator
from pathlib import Path
from typing import Any
import pytest_asyncio
from alembic import command
from httpx import ASGITransport, AsyncClient
cli = importlib.import_module("backup_tool.cli")
config = importlib.import_module("backup_tool.config")
Settings = config.Settings
def make_settings(tmp_path: Path) -> Any:
key = tmp_path / "master.key"
key.write_bytes(b"m2-test-master-key-material-32-bytes-minimum")
key.chmod(0o600)
data = tmp_path / "data"
repositories = tmp_path / "repositories"
sources = tmp_path / "sources"
restores = tmp_path / "restores"
for path in (data, repositories, sources, restores):
path.mkdir()
return Settings(
data_dir=data,
database_url=f"sqlite+aiosqlite:///{data / 'metadata.db'}",
repository_roots=(repositories,),
local_source_roots=(sources,),
restore_roots=(restores,),
master_key_file=key,
public_base_url="https://testserver",
)
@pytest_asyncio.fixture
async def app_client(tmp_path: Path) -> AsyncIterator[tuple[AsyncClient, Any]]:
settings = make_settings(tmp_path)
command.upgrade(cli.build_alembic_config(settings), "head")
app_module = importlib.import_module("backup_tool.api.app")
app = app_module.create_app(settings)
async with AsyncClient(
transport=ASGITransport(app=app), base_url="https://testserver"
) as client:
yield client, settings
await app.state.engine.dispose()