Files
gh-christianlouis-docuelevate/tests/test_file_detail_enhancements.py
T
Christian Krakau-Louis 02e1445e01 Enhance file detail page with original and processed file previews, GPT metadata display, and text extraction functionality
- Added endpoints for previewing original and processed PDF files.
- Implemented on-demand text extraction from original and processed PDFs.
- Updated file detail page to show original and processed file paths with existence status.
- Introduced GPT metadata display with a collapsible JSON view.
- Enhanced front-end with PDF.js for in-browser PDF rendering and improved user experience.
- Added integration tests for new features including metadata display and file previews.
2026-02-11 23:32:29 +01:00

230 lines
7.3 KiB
Python

"""
Tests for file detail page enhancements.
Tests the new features:
- GPT metadata display
- PDF preview endpoints
- Text modal functionality
- Using persisted original_file_path and processed_file_path
"""
import json
import os
import tempfile
from pathlib import Path
import pytest
from fastapi.testclient import TestClient
from app.main import app
from app.models import FileRecord
@pytest.fixture
def sample_metadata():
"""Sample GPT metadata"""
return {
"document_type": "Invoice",
"filename": "2024-01-15_Company_Invoice",
"date": "2024-01-15",
"absender": "Test Company GmbH",
"empfaenger": "Customer Inc",
"betrag": "€ 1,234.56",
"kontonummer": "DE89370400440532013000",
"tags": ["invoice", "payment", "2024"],
}
@pytest.mark.integration
def test_file_detail_page_with_metadata(client: TestClient, db_session, sample_pdf_file):
"""Test file detail page displays GPT metadata correctly"""
from app.models import FileRecord
# Create a file record with paths
file_record = FileRecord(
filehash="test123abc",
original_filename="test_invoice.pdf",
local_filename=str(sample_pdf_file),
file_size=1024,
mime_type="application/pdf",
original_file_path=str(sample_pdf_file),
processed_file_path=None, # Not processed yet
)
db_session.add(file_record)
db_session.commit()
db_session.refresh(file_record)
# Get detail page
response = client.get(f"/files/{file_record.id}/detail")
assert response.status_code == 200
html = response.text
# Check for file info display
assert "File Information" in html
assert "test_invoice.pdf" in html
assert "Original File Path" in html
@pytest.mark.integration
def test_file_detail_with_gpt_metadata(client: TestClient, db_session, sample_pdf_file, sample_metadata, tmp_path):
"""Test file detail page with GPT metadata JSON"""
from app.models import FileRecord
# Create processed file path and metadata JSON
processed_file = tmp_path / "2024-01-15_Company_Invoice.pdf"
processed_file.write_bytes(sample_pdf_file.read_bytes())
metadata_file = tmp_path / "2024-01-15_Company_Invoice.json"
metadata_file.write_text(json.dumps(sample_metadata, indent=2))
file_record = FileRecord(
filehash="test456def",
original_filename="invoice_001.pdf",
local_filename=str(sample_pdf_file),
file_size=1024,
mime_type="application/pdf",
original_file_path=str(sample_pdf_file),
processed_file_path=str(processed_file),
)
db_session.add(file_record)
db_session.commit()
db_session.refresh(file_record)
# Get detail page
response = client.get(f"/files/{file_record.id}/detail")
assert response.status_code == 200
html = response.text
# Check for metadata display
assert "Extracted Metadata (GPT)" in html
assert "Invoice" in html # document_type
assert "2024-01-15_Company_Invoice" in html # filename
assert "Test Company GmbH" in html # absender
assert "€ 1,234.56" in html # betrag
@pytest.mark.integration
def test_preview_original_file_endpoint(client: TestClient, db_session, sample_pdf_file):
"""Test original file preview endpoint"""
from app.models import FileRecord
file_record = FileRecord(
filehash="test789ghi",
original_filename="original.pdf",
local_filename=str(sample_pdf_file),
file_size=1024,
mime_type="application/pdf",
original_file_path=str(sample_pdf_file),
processed_file_path=None,
)
db_session.add(file_record)
db_session.commit()
db_session.refresh(file_record)
# Request preview
response = client.get(f"/files/{file_record.id}/preview/original")
assert response.status_code == 200
assert response.headers["content-type"] == "application/pdf"
@pytest.mark.integration
def test_preview_processed_file_endpoint(client: TestClient, db_session, sample_pdf_file, tmp_path):
"""Test processed file preview endpoint"""
from app.models import FileRecord
# Create processed file
processed_file = tmp_path / "processed.pdf"
processed_file.write_bytes(sample_pdf_file.read_bytes())
file_record = FileRecord(
filehash="test101jkl",
original_filename="doc.pdf",
local_filename=str(sample_pdf_file),
file_size=1024,
mime_type="application/pdf",
original_file_path=str(sample_pdf_file),
processed_file_path=str(processed_file),
)
db_session.add(file_record)
db_session.commit()
db_session.refresh(file_record)
# Request preview
response = client.get(f"/files/{file_record.id}/preview/processed")
assert response.status_code == 200
assert response.headers["content-type"] == "application/pdf"
@pytest.mark.integration
def test_preview_missing_file_returns_404(client: TestClient, db_session, sample_pdf_file):
"""Test preview endpoint returns 404 when file doesn't exist"""
from app.models import FileRecord
file_record = FileRecord(
filehash="test202mno",
original_filename="missing.pdf",
local_filename=str(sample_pdf_file),
file_size=1024,
mime_type="application/pdf",
original_file_path="/nonexistent/path/original.pdf",
processed_file_path="/nonexistent/path/processed.pdf",
)
db_session.add(file_record)
db_session.commit()
db_session.refresh(file_record)
# Request original (missing)
response = client.get(f"/files/{file_record.id}/preview/original")
assert response.status_code == 404
# Request processed (missing)
response = client.get(f"/files/{file_record.id}/preview/processed")
assert response.status_code == 404
@pytest.mark.integration
def test_file_detail_shows_file_status_indicators(client: TestClient, db_session, sample_pdf_file):
"""Test file detail page shows correct status indicators for original and processed files"""
from app.models import FileRecord
file_record = FileRecord(
filehash="test303pqr",
original_filename="status_test.pdf",
local_filename=str(sample_pdf_file),
file_size=1024,
mime_type="application/pdf",
original_file_path=str(sample_pdf_file), # Exists
processed_file_path="/nonexistent/processed.pdf", # Doesn't exist
)
db_session.add(file_record)
db_session.commit()
db_session.refresh(file_record)
response = client.get(f"/files/{file_record.id}/detail")
assert response.status_code == 200
html = response.text
# Check for status indicators
assert "Original File Status" in html
assert "Processed File Status" in html
# Original should show as exists
assert html.count("File exists") >= 1
# Processed should show as not found
assert "File not found" in html
@pytest.mark.unit
def test_metadata_json_structure(sample_metadata):
"""Test metadata JSON structure is valid"""
# Verify all expected fields are present
assert "document_type" in sample_metadata
assert "filename" in sample_metadata
assert "date" in sample_metadata
assert "absender" in sample_metadata
assert "tags" in sample_metadata
# Verify it's JSON serializable
json_str = json.dumps(sample_metadata)
parsed = json.loads(json_str)
assert parsed == sample_metadata