import pytest from fastapi.testclient import TestClient from main import app from routes.translate_routes import TranslateEndpointError client = TestClient(app) def test_validate_unsupported_extension(): # Test with .txt file files = {"file": ("test.txt", b"some text content", "text/plain")} response = client.post( "/api/v1/translate", files=files, data={"target_lang": "fr"} ) assert response.status_code == 400 assert response.json()["error"] == "INVALID_FORMAT" # Updated message to French assert "Formats acceptes" in response.json()["message"] def test_validate_invalid_magic_bytes(): # Test with .docx extension but invalid content (should trigger CORRUPTED_FILE) files = {"file": ("test.docx", b"not a zip file", "application/vnd.openxmlformats-officedocument.wordprocessingml.document")} response = client.post( "/api/v1/translate", files=files, data={"target_lang": "fr"} ) assert response.status_code == 400 assert response.json()["error"] == "CORRUPTED_FILE" assert "corrompu" in response.json()["message"] def _minimal_zip() -> bytes: """A real minimal ZIP archive (Office files are ZIPs).""" import io, zipfile buf = io.BytesIO() with zipfile.ZipFile(buf, "w") as zf: zf.writestr("[Content_Types].xml", "") return buf.getvalue() def test_validate_valid_file_header(): # Minimal real ZIP: passes magic-byte AND zip-safety checks files = {"file": ("test.docx", _minimal_zip(), "application/vnd.openxmlformats-officedocument.wordprocessingml.document")} response = client.post( "/api/v1/translate", files=files, data={"target_lang": "fr"} ) # Should be 202 (Accepted) if validation passes assert response.status_code == 202 assert response.json()["data"]["status"] == "processing" def test_validate_too_large_file(): # Test with file larger than 50MB large_content = b"PK\x03\x04" + b"0" * (51 * 1024 * 1024) files = {"file": ("large.docx", large_content, "application/vnd.openxmlformats-officedocument.wordprocessingml.document")} response = client.post( "/api/v1/translate", files=files, data={"target_lang": "fr"} ) assert response.status_code == 413 assert response.json()["error"] == "FILE_TOO_LARGE" assert "volumineux" in response.json()["message"]