Files
gh-christianlouis-docuelevate/tests/test_original_filename_preservation.py
T
copilot-swe-agent[bot] f4b793e9b8 fix(tests): add missing mock settings attrs in test_original_filename_preservation
The test was patching `settings` with a MagicMock but only setting
`workdir`.  Other attributes (`default_owner_id`, `enable_deduplication`,
`show_deduplication_step`, `enable_text_quality_check`) remained as
MagicMock objects.  When `default_owner_id` (truthy MagicMock) was
assigned to `owner_id` and passed to SQLAlchemy, SQLite rejected the
unsupported type.

Fix: explicitly set all accessed settings attributes to sensible test
defaults in both test functions.

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-06 10:00:33 +00:00

220 lines
5.2 KiB
Python

"""
Unit tests for verifying that original filenames are preserved during upload.
These tests verify the fix for the issue where uploaded files do not maintain
their original file names.
"""
from unittest.mock import MagicMock, patch
import pytest
from app.models import FileRecord
from app.tasks.process_document import process_document
@pytest.mark.unit
@pytest.mark.requires_db
def test_process_document_preserves_original_filename_parameter(db_session, tmp_path):
"""
Test that process_document correctly uses the original_filename parameter
when provided, instead of extracting it from the file path.
"""
# Create a test PDF file with a UUID-based name
test_pdf = tmp_path / "e64b2825-9ff2-486b-aff1-08af2957140b.pdf"
pdf_content = b"""%PDF-1.4
1 0 obj
<<
/Type /Catalog
/Pages 2 0 R
>>
endobj
2 0 obj
<<
/Type /Pages
/Kids [3 0 R]
/Count 1
>>
endobj
3 0 obj
<<
/Type /Page
/Parent 2 0 R
/MediaBox [0 0 612 792]
/Resources <<
/Font <<
/F1 <<
/Type /Font
/Subtype /Type1
/BaseFont /Helvetica
>>
>>
>>
/Contents 4 0 R
>>
endobj
4 0 obj
<<
/Length 44
>>
stream
BT
/F1 12 Tf
100 700 Td
(Test content) Tj
ET
endstream
endobj
xref
0 5
0000000000 65535 f
0000000009 00000 n
0000000058 00000 n
0000000115 00000 n
0000000306 00000 n
trailer
<<
/Size 5
/Root 1 0 R
>>
startxref
399
%%EOF
"""
test_pdf.write_bytes(pdf_content)
# The original filename that the user uploaded
original_filename = "Apostille Sverige.pdf"
# Mock environment and dependencies
with (
patch("app.tasks.process_document.SessionLocal") as mock_session_local,
patch("app.tasks.process_document.settings") as mock_settings,
patch("app.tasks.process_document.log_task_progress"),
patch("app.tasks.process_document.extract_metadata_with_gpt") as mock_extract,
):
# Setup mocks
mock_settings.workdir = str(tmp_path)
mock_settings.default_owner_id = ""
mock_settings.enable_deduplication = False
mock_settings.show_deduplication_step = False
mock_settings.enable_text_quality_check = False
mock_session_local.return_value.__enter__.return_value = db_session
mock_session_local.return_value.__exit__.return_value = None
mock_extract.delay = MagicMock()
# Call the task with the original_filename parameter
result = process_document.run(str(test_pdf), original_filename=original_filename)
# Verify that the task completed successfully
assert "file_id" in result
assert result["status"] == "Text extracted locally"
# Verify that a FileRecord was created with the correct original filename
file_record = db_session.query(FileRecord).first()
assert file_record is not None
# This is the key assertion - the original filename should be preserved
assert file_record.original_filename == original_filename
# The filename should NOT be the UUID-based filename
assert file_record.original_filename != "e64b2825-9ff2-486b-aff1-08af2957140b.pdf"
@pytest.mark.unit
@pytest.mark.requires_db
def test_process_document_fallback_to_basename_when_no_parameter(db_session, tmp_path):
"""
Test that process_document falls back to extracting filename from path
when original_filename parameter is not provided (backward compatibility).
"""
# Create a test PDF file
test_pdf = tmp_path / "test_document.pdf"
pdf_content = b"""%PDF-1.4
1 0 obj
<<
/Type /Catalog
/Pages 2 0 R
>>
endobj
2 0 obj
<<
/Type /Pages
/Kids [3 0 R]
/Count 1
>>
endobj
3 0 obj
<<
/Type /Page
/Parent 2 0 R
/MediaBox [0 0 612 792]
/Resources <<
/Font <<
/F1 <<
/Type /Font
/Subtype /Type1
/BaseFont /Helvetica
>>
>>
>>
/Contents 4 0 R
>>
endobj
4 0 obj
<<
/Length 44
>>
stream
BT
/F1 12 Tf
100 700 Td
(Test content) Tj
ET
endstream
endobj
xref
0 5
0000000000 65535 f
0000000009 00000 n
0000000058 00000 n
0000000115 00000 n
0000000306 00000 n
trailer
<<
/Size 5
/Root 1 0 R
>>
startxref
399
%%EOF
"""
test_pdf.write_bytes(pdf_content)
# Mock environment and dependencies
with (
patch("app.tasks.process_document.SessionLocal") as mock_session_local,
patch("app.tasks.process_document.settings") as mock_settings,
patch("app.tasks.process_document.log_task_progress"),
patch("app.tasks.process_document.extract_metadata_with_gpt") as mock_extract,
):
# Setup mocks
mock_settings.workdir = str(tmp_path)
mock_settings.default_owner_id = ""
mock_settings.enable_deduplication = False
mock_settings.show_deduplication_step = False
mock_settings.enable_text_quality_check = False
mock_session_local.return_value.__enter__.return_value = db_session
mock_session_local.return_value.__exit__.return_value = None
mock_extract.delay = MagicMock()
# Call the task WITHOUT the original_filename parameter (old behavior)
result = process_document.run(str(test_pdf))
# Verify that the task completed successfully
assert "file_id" in result
# Verify that the filename was extracted from the path
file_record = db_session.query(FileRecord).first()
assert file_record is not None
assert file_record.original_filename == "test_document.pdf"