"""Unit Tests - FileHandler - ServiceManagerWeb Tests para app.core.file_handler.FileHandler. """ import io import uuid import tempfile import pytest from fastapi import UploadFile from fastapi import HTTPException @pytest.mark.asyncio async def test_save_upload_pdf_valid_streaming(): from app.core.file_handler import FileHandler, settings with tempfile.TemporaryDirectory() as tmp: settings.UPLOAD_PATH = tmp handler = FileHandler() tenant_id = uuid.uuid4() ticket_id = uuid.uuid4() content = b"%PDF-1.7\n%\xe2\xe3\xcf\xd3\n1 0 obj\n<<>>\nendobj\n" up = UploadFile(filename="test.pdf", file=io.BytesIO(content)) meta = await handler.save_upload(up, tenant_id=tenant_id, ticket_id=ticket_id) assert meta["file_size"] == len(content) assert meta["original_filename"] == "test.pdf" assert meta["filename"].endswith(".pdf") assert meta["md5_hash"] assert meta["sha256_hash"] @pytest.mark.asyncio async def test_save_upload_pdf_invalid_magic_bytes_rejected(): from app.core.file_handler import FileHandler, settings with tempfile.TemporaryDirectory() as tmp: settings.UPLOAD_PATH = tmp handler = FileHandler() up = UploadFile(filename="bad.pdf", file=io.BytesIO(b"NOTPDF")) with pytest.raises(HTTPException) as exc: await handler.save_upload(up, tenant_id=uuid.uuid4(), ticket_id=uuid.uuid4()) assert exc.value.status_code == 400 @pytest.mark.asyncio async def test_save_upload_oversize_rejected_and_file_removed(): from app.core.file_handler import FileHandler, settings with tempfile.TemporaryDirectory() as tmp: settings.UPLOAD_PATH = tmp settings.MAX_UPLOAD_SIZE_MB = 0 # 0MB => max 0 bytes handler = FileHandler() up = UploadFile(filename="a.txt", file=io.BytesIO(b"x")) with pytest.raises(HTTPException) as exc: await handler.save_upload(up, tenant_id=uuid.uuid4(), ticket_id=uuid.uuid4()) assert exc.value.status_code == 413 def test_get_file_path_prevents_path_traversal(): from app.core.file_handler import FileHandler, settings with tempfile.TemporaryDirectory() as tmp: settings.UPLOAD_PATH = tmp handler = FileHandler() with pytest.raises(HTTPException) as exc: handler.get_file_path("../../etc/passwd") assert exc.value.status_code == 403