diff --git a/apps/backend/app/routers/reports.py b/apps/backend/app/routers/reports.py index 5b80ab8e..1f9265c3 100644 --- a/apps/backend/app/routers/reports.py +++ b/apps/backend/app/routers/reports.py @@ -4,6 +4,7 @@ import tempfile import pydicom from fastapi import APIRouter, HTTPException, status, File, Form, UploadFile +from starlette.background import BackgroundTask from typing import List, Optional from .data import data from pyaslreport import generate_report, get_bids_metadata @@ -129,5 +130,10 @@ async def download_pdf(report_data: dict): with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp: HTML(string=html_content).write_pdf(tmp.name) tmp_path = tmp.name - return FileResponse(tmp_path, media_type="application/pdf", filename="report.pdf") + return FileResponse( + tmp_path, + media_type="application/pdf", + filename="report.pdf", + background=BackgroundTask(os.remove, tmp_path) + ) diff --git a/apps/backend/tests/test_report.py b/apps/backend/tests/test_report.py index 2dd19c8f..315fc671 100644 --- a/apps/backend/tests/test_report.py +++ b/apps/backend/tests/test_report.py @@ -1,4 +1,5 @@ import os +from pathlib import Path import pytest from fastapi.testclient import TestClient from app.main import app @@ -40,4 +41,43 @@ def test_report_pdf_endpoint(): } response = client.post("/api/report/report-pdf", json=report_data) assert response.status_code == 200 - assert response.headers["content-type"] == "application/pdf" \ No newline at end of file + assert response.headers["content-type"] == "application/pdf" + + +def test_report_pdf_endpoint_removes_temp_file(tmp_path, monkeypatch): + temp_pdf = tmp_path / "report.pdf" + + class DummyTempFile: + def __init__(self, path: Path): + self.name = str(path) + self._file = path.open("wb") + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc, tb): + self._file.close() + + class FakeHTML: + def __init__(self, string: str): + self.string = string + + def write_pdf(self, path: str): + Path(path).write_bytes(b"%PDF-1.4 fake") + + monkeypatch.setattr("app.routers.reports.tempfile.NamedTemporaryFile", lambda **kwargs: DummyTempFile(temp_pdf)) + monkeypatch.setattr("app.routers.reports.HTML", FakeHTML) + + report_data = { + "report_data": { + "asl_parameters": [("param1", "value1")], + "missing_parameters": [], + "basic_report": "Basic report", + "extended_report": "Extended report", + } + } + + response = client.post("/api/report/report-pdf", json=report_data) + + assert response.status_code == 200 + assert not temp_pdf.exists() \ No newline at end of file