From 97bc37bb0b23079f5cd14fa771865b25c9aef401 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Feb 2026 20:53:09 +0000 Subject: [PATCH] Add tests for file detail view endpoints - Added tests for reprocess endpoint with various scenarios - Added tests for file preview endpoint (original and processed) - Added tests for enhanced file detail view - Tests cover success cases, error cases, and edge cases Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com> --- tests/test_file_detail_endpoints.py | 200 ++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 tests/test_file_detail_endpoints.py diff --git a/tests/test_file_detail_endpoints.py b/tests/test_file_detail_endpoints.py new file mode 100644 index 00000000..e5dc1c5a --- /dev/null +++ b/tests/test_file_detail_endpoints.py @@ -0,0 +1,200 @@ +""" +Tests for file detail view improvements including reprocessing and preview endpoints. +""" +import os +import pytest +from fastapi.testclient import TestClient +from app.models import FileRecord, ProcessingLog + + +@pytest.mark.integration +class TestFileReprocessing: + """Tests for single file reprocessing endpoint.""" + + def test_reprocess_existing_file(self, client: TestClient, db_session, sample_pdf_path): + """Test reprocessing an existing file.""" + # Create a file record + file_record = FileRecord( + filehash="abc123", + original_filename="test.pdf", + local_filename=sample_pdf_path, + file_size=1024, + mime_type="application/pdf" + ) + db_session.add(file_record) + db_session.commit() + db_session.refresh(file_record) + + # Add a failed processing log + log = ProcessingLog( + file_id=file_record.id, + task_id="test-task-123", + step_name="extract_metadata_with_gpt", + status="failure", + message="API error" + ) + db_session.add(log) + db_session.commit() + + # Test reprocessing + response = client.post(f"/api/files/{file_record.id}/reprocess") + assert response.status_code == 200 + data = response.json() + assert data["status"] == "success" + assert "task_id" in data + assert data["file_id"] == file_record.id + assert data["filename"] == "test.pdf" + + def test_reprocess_nonexistent_file(self, client: TestClient): + """Test reprocessing a file that doesn't exist.""" + response = client.post("/api/files/99999/reprocess") + assert response.status_code == 404 + assert "not found" in response.json()["detail"].lower() + + def test_reprocess_file_missing_on_disk(self, client: TestClient, db_session): + """Test reprocessing when local file is missing.""" + # Create a file record with non-existent local path + file_record = FileRecord( + filehash="xyz789", + original_filename="missing.pdf", + local_filename="/nonexistent/path/missing.pdf", + file_size=1024, + mime_type="application/pdf" + ) + db_session.add(file_record) + db_session.commit() + db_session.refresh(file_record) + + # Test reprocessing + response = client.post(f"/api/files/{file_record.id}/reprocess") + assert response.status_code == 400 + assert "not found on disk" in response.json()["detail"].lower() + + +@pytest.mark.integration +class TestFilePreview: + """Tests for file preview endpoint.""" + + def test_preview_original_file(self, client: TestClient, db_session, sample_pdf_path): + """Test getting original file preview.""" + # Create a file record + file_record = FileRecord( + filehash="def456", + original_filename="preview.pdf", + local_filename=sample_pdf_path, + file_size=1024, + mime_type="application/pdf" + ) + db_session.add(file_record) + db_session.commit() + db_session.refresh(file_record) + + # Test preview + response = client.get(f"/api/files/{file_record.id}/preview?version=original") + assert response.status_code == 200 + assert response.headers["content-type"].startswith("application/pdf") + + def test_preview_processed_file_not_found(self, client: TestClient, db_session, sample_pdf_path): + """Test getting processed file preview when it doesn't exist.""" + # Create a file record + file_record = FileRecord( + filehash="ghi789", + original_filename="processed.pdf", + local_filename=sample_pdf_path, + file_size=1024, + mime_type="application/pdf" + ) + db_session.add(file_record) + db_session.commit() + db_session.refresh(file_record) + + # Test preview (processed version should not exist) + response = client.get(f"/api/files/{file_record.id}/preview?version=processed") + assert response.status_code == 404 + assert "not found" in response.json()["detail"].lower() + + def test_preview_nonexistent_file(self, client: TestClient): + """Test preview for a file that doesn't exist.""" + response = client.get("/api/files/99999/preview?version=original") + assert response.status_code == 404 + assert "not found" in response.json()["detail"].lower() + + def test_preview_invalid_version(self, client: TestClient, db_session, sample_pdf_path): + """Test preview with invalid version parameter.""" + # Create a file record + file_record = FileRecord( + filehash="jkl012", + original_filename="test.pdf", + local_filename=sample_pdf_path, + file_size=1024, + mime_type="application/pdf" + ) + db_session.add(file_record) + db_session.commit() + db_session.refresh(file_record) + + # Test with invalid version + response = client.get(f"/api/files/{file_record.id}/preview?version=invalid") + assert response.status_code == 400 + assert "invalid version" in response.json()["detail"].lower() + + +@pytest.mark.integration +class TestFileDetailView: + """Tests for enhanced file detail view.""" + + def test_file_detail_view_with_logs(self, client: TestClient, db_session, sample_pdf_path): + """Test file detail view returns enhanced data.""" + # Create a file record + file_record = FileRecord( + filehash="mno345", + original_filename="detail.pdf", + local_filename=sample_pdf_path, + file_size=1024, + mime_type="application/pdf" + ) + db_session.add(file_record) + db_session.commit() + db_session.refresh(file_record) + + # Add processing logs + logs = [ + ProcessingLog( + file_id=file_record.id, + task_id="task-1", + step_name="hash_file", + status="success", + message="File hashed successfully" + ), + ProcessingLog( + file_id=file_record.id, + task_id="task-1", + step_name="create_file_record", + status="success", + message="File record created" + ), + ProcessingLog( + file_id=file_record.id, + task_id="task-1", + step_name="extract_metadata_with_gpt", + status="failure", + message="API rate limit exceeded" + ) + ] + for log in logs: + db_session.add(log) + db_session.commit() + + # Test detail view + response = client.get(f"/files/{file_record.id}/detail") + assert response.status_code == 200 + # Check that response contains HTML with file information + assert b"File Information" in response.content + assert b"detail.pdf" in response.content + assert b"Processing History" in response.content + + def test_file_detail_view_nonexistent(self, client: TestClient): + """Test file detail view for nonexistent file.""" + response = client.get("/files/99999/detail") + assert response.status_code == 200 # Returns page with error message + assert b"not found" in response.content.lower()