| |
| """ |
| End-to-end test simulating the frontend workflow |
| """ |
|
|
| import requests |
| import json |
| from pathlib import Path |
|
|
| BASE_URL = "http://localhost:8000/api" |
|
|
| |
| test_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 /Resources << /Font << /F1 4 0 R >> >> /MediaBox [0 0 612 792] /Contents 5 0 R >> |
| endobj |
| 4 0 obj |
| << /Type /Font /Subtype /Type1 /BaseFont /Helvetica >> |
| endobj |
| 5 0 obj |
| << /Length 44 >> |
| stream |
| BT /F1 12 Tf 100 700 Td (Test CV) Tj ET |
| endstream |
| endobj |
| xref |
| 0 6 |
| 0000000000 65535 f |
| 0000000009 00000 n |
| 0000000058 00000 n |
| 0000000115 00000 n |
| 0000000244 00000 n |
| 0000000330 00000 n |
| trailer |
| << /Size 6 /Root 1 0 R >> |
| startxref |
| 424 |
| %%EOF""" |
|
|
| pdf_path = Path("/tmp/test_cv.pdf") |
| pdf_path.write_bytes(test_pdf_content) |
| print(f"✓ Created test PDF: {pdf_path}") |
|
|
| |
| print("\n1️⃣ LOGIN") |
| login_resp = requests.post(f"{BASE_URL}/auth/login", json={ |
| "email": "alice@test.com", |
| "password": "password123" |
| }) |
| print(f" Status: {login_resp.status_code}") |
| if login_resp.status_code == 200: |
| login_data = login_resp.json() |
| token = login_data['access_token'] |
| print(f" Token: {token[:50]}...") |
| else: |
| print(f" Error: {login_resp.json()}") |
| exit(1) |
|
|
| headers = {"Authorization": f"Bearer {token}"} |
|
|
| |
| print("\n2️⃣ GET PROFILE (before upload)") |
| profile_resp = requests.get(f"{BASE_URL}/candidates/me/profile", headers=headers) |
| print(f" Status: {profile_resp.status_code}") |
| print(f" Response: {profile_resp.json()['detail']}") |
|
|
| |
| print("\n3️⃣ UPLOAD CV") |
| with open(pdf_path, 'rb') as f: |
| files = {'file': f} |
| upload_resp = requests.post(f"{BASE_URL}/candidates/upload", headers=headers, files=files) |
|
|
| print(f" Status: {upload_resp.status_code}") |
| if upload_resp.status_code == 200: |
| upload_data = upload_resp.json() |
| print(f" ✅ Upload successful!") |
| print(f" Candidate ID: {upload_data.get('candidate_id')}") |
| print(f" Quality Score: {upload_data.get('extraction', {}).get('quality_score')}") |
| else: |
| print(f" ❌ Upload failed!") |
| print(f" Response: {upload_resp.text[:200]}") |
|
|
| |
| print("\n4️⃣ GET PROFILE (after upload)") |
| profile_resp = requests.get(f"{BASE_URL}/candidates/me/profile", headers=headers) |
| print(f" Status: {profile_resp.status_code}") |
| if profile_resp.status_code == 200: |
| data = profile_resp.json() |
| print(f" ✅ Profile found!") |
| print(f" Name: {data.get('full_name')}") |
| print(f" Email: {data.get('email')}") |
| print(f" Extraction Quality: {data.get('extraction_quality_score')}") |
| else: |
| print(f" Error: {profile_resp.json()}") |
|
|
| print("\n✅ Test complete!") |
|
|