bulk-questionnaire-upload/tests/backend/test_api.py
vee1e 165b249c3d feat: implement CI workflow, enhance file validation, and add test cases
- Introduced a CI workflow for automated testing of backend and frontend components.
- Added pytest configuration for backend tests and Vitest configuration for frontend tests.
- Enhanced file validation logic in the backend to improve error handling and reporting.
- Created comprehensive test cases for various validation scenarios, including edge cases and incorrect formats.
- Updated requirements to include necessary testing libraries and tools.
2025-08-26 00:22:54 +05:30

97 lines
3.6 KiB
Python

import os
import sys
import io
import pytest
import httpx
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', 'backend'))
import main
@pytest.mark.asyncio
async def test_validate_invalid_extension(client: httpx.AsyncClient):
"""Test validation endpoint with invalid file extension"""
files = {'file': ('bad.txt', b'data', 'text/plain')}
resp = await client.post('/api/validate', files=files)
assert resp.status_code == 200
body = resp.json()
assert body['valid'] is False
assert 'Only .xls/.xlsx' in body['message']
@pytest.mark.asyncio
async def test_parse_missing_file_name(client: httpx.AsyncClient):
"""Test parse endpoint with no file uploaded"""
resp = await client.post('/api/forms/parse', data={})
assert resp.status_code == 400
detail = resp.json()['detail']
assert detail['error_type'] == 'MISSING_FILE'
@pytest.mark.asyncio
async def test_parse_invalid_extension(client: httpx.AsyncClient):
"""Test parse endpoint with invalid file extension"""
files = {'file': ('bad.txt', io.BytesIO(b'data'), 'text/plain')}
resp = await client.post('/api/forms/parse', files=files)
assert resp.status_code == 400
detail = resp.json()['detail']
assert detail['error_type'] == 'INVALID_FILE_FORMAT'
@pytest.mark.asyncio
async def test_get_all_forms_empty(client: httpx.AsyncClient):
"""Test getting all forms when database is empty (mocked)"""
resp = await client.get('/api/forms')
assert resp.status_code == 200
body = resp.json()
assert 'forms' in body
assert 'count' in body
assert body['count'] == 0
assert body['forms'] == []
@pytest.mark.asyncio
async def test_get_form_by_id_not_found(client: httpx.AsyncClient):
"""Test getting a form by ID when form doesn't exist (mocked)"""
resp = await client.get('/api/forms/507f1f77bcf86cd799439011') # Valid ObjectId format
assert resp.status_code == 404
@pytest.mark.asyncio
async def test_parse_with_valid_excel_file(client: httpx.AsyncClient):
"""Test parsing a valid Excel file using local test files"""
test_file_path = os.path.join(os.path.dirname(__file__), '..', 'test_xlsforms_valid', 'valid_form_1.xlsx')
if os.path.exists(test_file_path):
with open(test_file_path, 'rb') as f:
files = {'file': ('valid_form_1.xlsx', f, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')}
resp = await client.post('/api/forms/parse', files=files)
# Should return parsed form data without saving to DB
assert resp.status_code == 200
body = resp.json()
assert 'title' in body
assert 'groups' in body
assert 'metadata' in body
else:
# Skip test if no test file available
pytest.skip("Test Excel file not found")
@pytest.mark.asyncio
async def test_validate_with_valid_excel_file(client: httpx.AsyncClient):
"""Test validation with a valid Excel file using local test files"""
test_file_path = os.path.join(os.path.dirname(__file__), '..', 'test_xlsforms_valid', 'valid_form_1.xlsx')
if os.path.exists(test_file_path):
with open(test_file_path, 'rb') as f:
files = {'file': ('valid_form_1.xlsx', f, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')}
resp = await client.post('/api/validate', files=files)
assert resp.status_code == 200
body = resp.json()
assert 'valid' in body
assert 'message' in body
assert 'sheets' in body
else:
# Skip test if no test file available
pytest.skip("Test Excel file not found")