ميزة: إضافة مكوني ProcedureSelection و StepProgress لأداة مخططات التدفق بصيغة PDF
- تنفيذ مكون ProcedureSelection لتمكين المستخدمين من اختيار الإجراءات من قائمة، وإدارة الاختيارات، ومعالجة الإجراءات المرفوضة. - إنشاء مكون StepProgress لعرض تقدم معالج متعدد الخطوات بشكل مرئي. - تعريف أنواع مشتركة للإجراءات، وخطوات التدفق، ورسائل الدردشة في ملف types.ts. - إضافة اختبارات وحدة لخطافات useFileUpload و useTaskPolling لضمان الأداء السليم ومعالجة الأخطاء. - تنفيذ اختبارات واجهة برمجة التطبيقات (API) للتحقق من تنسيقات نقاط النهاية وضمان اتساق ربط الواجهة الأمامية بالخلفية.
This commit is contained in:
66
backend/tests/test_tasks_route.py
Normal file
66
backend/tests/test_tasks_route.py
Normal file
@@ -0,0 +1,66 @@
|
||||
"""Tests for task status polling route."""
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
|
||||
class TestTaskStatus:
|
||||
def test_pending_task(self, client, monkeypatch):
|
||||
"""Should return PENDING state for a queued task."""
|
||||
mock_result = MagicMock()
|
||||
mock_result.state = 'PENDING'
|
||||
mock_result.info = None
|
||||
|
||||
with patch('app.routes.tasks.AsyncResult', return_value=mock_result):
|
||||
response = client.get('/api/tasks/test-task-id/status')
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.get_json()
|
||||
assert data['task_id'] == 'test-task-id'
|
||||
assert data['state'] == 'PENDING'
|
||||
assert 'progress' in data
|
||||
|
||||
def test_processing_task(self, client, monkeypatch):
|
||||
"""Should return PROCESSING state with step info."""
|
||||
mock_result = MagicMock()
|
||||
mock_result.state = 'PROCESSING'
|
||||
mock_result.info = {'step': 'Converting page 3 of 10...'}
|
||||
|
||||
with patch('app.routes.tasks.AsyncResult', return_value=mock_result):
|
||||
response = client.get('/api/tasks/processing-id/status')
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.get_json()
|
||||
assert data['state'] == 'PROCESSING'
|
||||
assert data['progress'] == 'Converting page 3 of 10...'
|
||||
|
||||
def test_success_task(self, client, monkeypatch):
|
||||
"""Should return SUCCESS state with result data."""
|
||||
mock_result = MagicMock()
|
||||
mock_result.state = 'SUCCESS'
|
||||
mock_result.result = {
|
||||
'status': 'completed',
|
||||
'download_url': '/api/download/task-id/output.pdf',
|
||||
'filename': 'output.pdf',
|
||||
}
|
||||
|
||||
with patch('app.routes.tasks.AsyncResult', return_value=mock_result):
|
||||
response = client.get('/api/tasks/success-id/status')
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.get_json()
|
||||
assert data['state'] == 'SUCCESS'
|
||||
assert data['result']['status'] == 'completed'
|
||||
assert 'download_url' in data['result']
|
||||
|
||||
def test_failure_task(self, client, monkeypatch):
|
||||
"""Should return FAILURE state with error message."""
|
||||
mock_result = MagicMock()
|
||||
mock_result.state = 'FAILURE'
|
||||
mock_result.info = Exception('Conversion failed due to corrupt PDF.')
|
||||
|
||||
with patch('app.routes.tasks.AsyncResult', return_value=mock_result):
|
||||
response = client.get('/api/tasks/failed-id/status')
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.get_json()
|
||||
assert data['state'] == 'FAILURE'
|
||||
assert 'error' in data
|
||||
Reference in New Issue
Block a user