From bbdd61d08d90cf4ac91ea346c28b5de9e58041fc Mon Sep 17 00:00:00 2001 From: Taylor Wilsdon Date: Sat, 28 Feb 2026 17:12:30 -0400 Subject: [PATCH] fix attachments + test --- core/server.py | 3 +- tests/core/test_attachment_route.py | 69 +++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 tests/core/test_attachment_route.py diff --git a/core/server.py b/core/server.py index 87e32ea..d21c9d5 100644 --- a/core/server.py +++ b/core/server.py @@ -472,10 +472,11 @@ async def health_check(request: Request): @server.custom_route("/attachments/{file_id}", methods=["GET"]) -async def serve_attachment(file_id: str): +async def serve_attachment(request: Request): """Serve a stored attachment file.""" from core.attachment_storage import get_attachment_storage + file_id = request.path_params["file_id"] storage = get_attachment_storage() metadata = storage.get_attachment_metadata(file_id) diff --git a/tests/core/test_attachment_route.py b/tests/core/test_attachment_route.py new file mode 100644 index 0000000..22ee04f --- /dev/null +++ b/tests/core/test_attachment_route.py @@ -0,0 +1,69 @@ +import pytest +from starlette.requests import Request +from starlette.responses import FileResponse, JSONResponse + +from core.server import serve_attachment + + +def _build_request(file_id: str) -> Request: + scope = { + "type": "http", + "asgi": {"version": "3.0"}, + "http_version": "1.1", + "method": "GET", + "scheme": "http", + "path": f"/attachments/{file_id}", + "raw_path": f"/attachments/{file_id}".encode(), + "query_string": b"", + "headers": [], + "client": ("127.0.0.1", 12345), + "server": ("localhost", 8000), + "path_params": {"file_id": file_id}, + } + + async def receive(): + return {"type": "http.request", "body": b"", "more_body": False} + + return Request(scope, receive) + + +@pytest.mark.asyncio +async def test_serve_attachment_uses_path_param_file_id(monkeypatch, tmp_path): + file_path = tmp_path / "sample.pdf" + file_path.write_bytes(b"%PDF-1.3\n") + captured = {} + + class DummyStorage: + def get_attachment_metadata(self, file_id): + captured["file_id"] = file_id + return {"filename": "sample.pdf", "mime_type": "application/pdf"} + + def get_attachment_path(self, _file_id): + return file_path + + monkeypatch.setattr( + "core.attachment_storage.get_attachment_storage", lambda: DummyStorage() + ) + + response = await serve_attachment(_build_request("abc123")) + + assert captured["file_id"] == "abc123" + assert isinstance(response, FileResponse) + assert response.status_code == 200 + + +@pytest.mark.asyncio +async def test_serve_attachment_404_when_metadata_missing(monkeypatch): + class DummyStorage: + def get_attachment_metadata(self, _file_id): + return None + + monkeypatch.setattr( + "core.attachment_storage.get_attachment_storage", lambda: DummyStorage() + ) + + response = await serve_attachment(_build_request("missing")) + + assert isinstance(response, JSONResponse) + assert response.status_code == 404 + assert b"Attachment not found or expired" in response.body