legal-doc-backend / backend /tests /test_endpoints.py
Harsh Upadhyay
made the relative imports work.
718633d
import pytest
import json
import os
import sys
import tempfile
import shutil
from fpdf import FPDF
import uuid
# Add the parent directory to Python path
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from app import create_app
from backend.app.database import init_db
@pytest.fixture
def app():
app = create_app({
'TESTING': True,
'JWT_SECRET_KEY': 'test-secret-key',
'DATABASE': ':memory:'
})
with app.app_context():
init_db()
return app
@pytest.fixture
def client(app):
return app.test_client()
@pytest.fixture
def auth_headers(client):
# Register a test user with unique username
unique_username = f"testuser_{uuid.uuid4().hex[:8]}"
register_response = client.post('/register', json={
'username': unique_username,
'password': 'testpass'
})
assert register_response.status_code == 201, "User registration failed"
# Login to get token
login_response = client.post('/login', json={
'username': unique_username,
'password': 'testpass'
})
assert login_response.status_code == 200, "Login failed"
assert 'access_token' in login_response.json, "No access token in response"
token = login_response.json['access_token']
return {'Authorization': f'Bearer {token}'}
def create_test_pdf():
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
# Add more content to make it a realistic document
pdf.cell(200, 10, txt="Legal Document Analysis", ln=1, align="C")
pdf.cell(200, 10, txt="This is a test document for legal processing.", ln=1, align="C")
pdf.cell(200, 10, txt="Section 1: Introduction", ln=1, align="L")
pdf.cell(200, 10, txt="This document contains various legal clauses and provisions.", ln=1, align="L")
pdf.cell(200, 10, txt="Section 2: Main Provisions", ln=1, align="L")
pdf.cell(200, 10, txt="The main provisions of this agreement include confidentiality clauses,", ln=1, align="L")
pdf.cell(200, 10, txt="intellectual property rights, and dispute resolution mechanisms.", ln=1, align="L")
pdf.cell(200, 10, txt="Section 3: Conclusion", ln=1, align="L")
pdf.cell(200, 10, txt="This document serves as a comprehensive legal agreement.", ln=1, align="L")
pdf.output("test.pdf")
return "test.pdf"
# Authentication Tests
def test_register_success(client):
unique_username = f"newuser_{uuid.uuid4().hex[:8]}"
response = client.post('/register', json={
'username': unique_username,
'password': 'newpass'
})
assert response.status_code == 201
assert response.json['message'] == "User registered successfully"
def test_register_duplicate_username(client):
# First registration
username = f"duplicate_{uuid.uuid4().hex[:8]}"
client.post('/register', json={
'username': username,
'password': 'pass1'
})
# Second registration with same username
response = client.post('/register', json={
'username': username,
'password': 'pass2'
})
assert response.status_code == 409
assert 'error' in response.json
def test_login_success(client):
# Register first
username = f"loginuser_{uuid.uuid4().hex[:8]}"
client.post('/register', json={
'username': username,
'password': 'loginpass'
})
# Then login
response = client.post('/login', json={
'username': username,
'password': 'loginpass'
})
assert response.status_code == 200
assert 'access_token' in response.json
def test_login_invalid_credentials(client):
response = client.post('/login', json={
'username': 'nonexistent',
'password': 'wrongpass'
})
assert response.status_code == 401
assert 'error' in response.json
# Document Upload Tests
def test_upload_success(client, auth_headers):
pdf_path = create_test_pdf()
try:
with open(pdf_path, 'rb') as f:
response = client.post('/upload',
data={'file': (f, 'test.pdf')},
headers=auth_headers,
content_type='multipart/form-data'
)
assert response.status_code == 200
assert response.json['success'] == True
assert 'document_id' in response.json
finally:
os.unlink(pdf_path)
def test_upload_no_file(client, auth_headers):
response = client.post('/upload', headers=auth_headers)
assert response.status_code == 400
assert 'error' in response.json
def test_upload_unauthorized(client):
response = client.post('/upload')
assert response.status_code == 401
# Document Retrieval Tests
def test_list_documents_success(client, auth_headers):
response = client.get('/documents', headers=auth_headers)
assert response.status_code == 200
assert isinstance(response.json, list)
def test_list_documents_unauthorized(client):
response = client.get('/documents')
assert response.status_code == 401
def test_get_document_success(client, auth_headers):
# First upload a document
pdf_path = create_test_pdf()
try:
with open(pdf_path, 'rb') as f:
upload_response = client.post('/upload',
data={'file': (f, 'test.pdf')},
headers=auth_headers,
content_type='multipart/form-data'
)
doc_id = upload_response.json['document_id']
# Then retrieve it
response = client.get(f'/get_document/{doc_id}', headers=auth_headers)
assert response.status_code == 200
assert response.json['id'] == doc_id
finally:
os.unlink(pdf_path)
def test_get_document_not_found(client, auth_headers):
response = client.get('/get_document/99999', headers=auth_headers)
assert response.status_code == 404
# Search Tests
def test_search_success(client, auth_headers):
response = client.get('/search_documents?q=test', headers=auth_headers)
assert response.status_code == 200
assert 'results' in response.json
def test_search_no_query(client, auth_headers):
response = client.get('/search_documents', headers=auth_headers)
assert response.status_code == 400
# QA Tests
def test_qa_success(client, auth_headers):
# First upload a document
pdf_path = create_test_pdf()
try:
with open(pdf_path, 'rb') as f:
upload_response = client.post('/upload',
data={'file': (f, 'test.pdf')},
headers=auth_headers,
content_type='multipart/form-data'
)
doc_id = upload_response.json['document_id']
# Then ask a question
response = client.post('/qa',
json={
'document_id': doc_id,
'question': 'What is this document about?'
},
headers=auth_headers
)
assert response.status_code == 200
assert 'answer' in response.json
finally:
os.unlink(pdf_path)
def test_qa_missing_fields(client, auth_headers):
response = client.post('/qa',
json={'document_id': 1},
headers=auth_headers
)
assert response.status_code == 400
# Document Processing Tests
def test_process_document_success(client):
response = client.post('/process_document',
json={'text': 'Test legal document content'}
)
assert response.status_code == 200
assert 'processed' in response.json
assert 'features' in response.json
assert 'context_analysis' in response.json
def test_process_document_empty_text(client):
response = client.post('/process_document',
json={'text': ''}
)
assert response.status_code == 400