"""End-to-end coverage for /api/v1/deckies/files via the live FastAPI app. The docker subprocess is stubbed; everything else (DB, repo, auth) runs for real. """ from __future__ import annotations import asyncio import base64 from unittest.mock import patch import httpx import pytest _BASE = "/api/v1/deckies/files" class _FakeProc: def __init__(self, rc: int = 0, stderr: bytes = b"") -> None: self.returncode = rc self._stderr = stderr async def communicate(self, input: bytes | None = None) -> tuple[bytes, bytes]: return b"", self._stderr def kill(self) -> None: # pragma: no cover pass def _patch_subprocess_capture(rc: int = 0, stderr: bytes = b""): captured: list[list[str]] = [] async def _fake(*argv, **kw): captured.append(list(argv)) return _FakeProc(rc, stderr) return patch.object(asyncio, "create_subprocess_exec", _fake), captured def _hdr(token: str) -> dict[str, str]: return {"Authorization": f"Bearer {token}"} def _hydrate_returning(deckies: list[dict]): async def _fake(_repo, _topo_id): return { "topology": {"id": _topo_id}, "lans": [], "edges": [], "deckies": deckies, } return _fake # ---------------- POST: drop file ----------------------------------------- @pytest.mark.asyncio async def test_drop_file_on_fleet_decky_uses_ssh_container( client: httpx.AsyncClient, auth_token: str ) -> None: patcher, captured = _patch_subprocess_capture() body_b64 = base64.b64encode(b"hello world").decode() with patcher: res = await client.post( _BASE, json={ "decky_name": "web1", "path": "/root/note.txt", "content_b64": body_b64, }, headers=_hdr(auth_token), ) assert res.status_code == 201, res.text # docker exec -i web1-ssh sh -c