81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
"""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
|