ميزة: إضافة مكوني ProcedureSelection و StepProgress لأداة مخططات التدفق بصيغة PDF

- تنفيذ مكون ProcedureSelection لتمكين المستخدمين من اختيار الإجراءات من قائمة، وإدارة الاختيارات، ومعالجة الإجراءات المرفوضة.

- إنشاء مكون StepProgress لعرض تقدم معالج متعدد الخطوات بشكل مرئي.

- تعريف أنواع مشتركة للإجراءات، وخطوات التدفق، ورسائل الدردشة في ملف types.ts.

- إضافة اختبارات وحدة لخطافات useFileUpload و useTaskPolling لضمان الأداء السليم ومعالجة الأخطاء.

- تنفيذ اختبارات واجهة برمجة التطبيقات (API) للتحقق من تنسيقات نقاط النهاية وضمان اتساق ربط الواجهة الأمامية بالخلفية.
This commit is contained in:
Your Name
2026-03-06 17:16:09 +02:00
parent 2e97741d60
commit cfbcc8bd79
62 changed files with 10567 additions and 101 deletions

View File

@@ -0,0 +1,74 @@
"""Tests for sanitizer utilities — generate_safe_path, get_output_path, cleanup."""
import os
from app.utils.sanitizer import generate_safe_path, get_output_path, cleanup_task_files
class TestGenerateSafePath:
def test_returns_tuple(self, app):
"""Should return (task_id, file_path) tuple."""
with app.app_context():
task_id, path = generate_safe_path('pdf', folder_type='upload')
assert isinstance(task_id, str)
assert isinstance(path, str)
def test_uuid_in_path(self, app):
"""Path should contain the UUID task_id."""
with app.app_context():
task_id, path = generate_safe_path('pdf')
assert task_id in path
def test_correct_extension(self, app):
"""Path should end with the specified extension."""
with app.app_context():
_, path = generate_safe_path('docx')
assert path.endswith('.docx')
def test_upload_folder(self, app):
"""upload folder_type should use UPLOAD_FOLDER config."""
with app.app_context():
_, path = generate_safe_path('pdf', folder_type='upload')
assert app.config['UPLOAD_FOLDER'] in path
def test_output_folder(self, app):
"""output folder_type should use OUTPUT_FOLDER config."""
with app.app_context():
_, path = generate_safe_path('pdf', folder_type='output')
assert app.config['OUTPUT_FOLDER'] in path
class TestGetOutputPath:
def test_returns_correct_path(self, app):
"""Should return path in OUTPUT_FOLDER with task_id and extension."""
with app.app_context():
path = get_output_path('my-task-id', 'pdf')
assert 'my-task-id' in path
assert path.endswith('.pdf')
assert app.config['OUTPUT_FOLDER'] in path
class TestCleanupTaskFiles:
def test_cleanup_removes_upload_dir(self, app):
"""Should remove upload directory for the task."""
with app.app_context():
task_id = 'cleanup-test-id'
upload_dir = os.path.join(app.config['UPLOAD_FOLDER'], task_id)
os.makedirs(upload_dir, exist_ok=True)
# Create a test file
with open(os.path.join(upload_dir, 'test.pdf'), 'w') as f:
f.write('test')
cleanup_task_files(task_id)
assert not os.path.exists(upload_dir)
def test_cleanup_keeps_outputs_when_requested(self, app):
"""Should keep output directory when keep_outputs=True."""
with app.app_context():
task_id = 'keep-output-id'
output_dir = os.path.join(app.config['OUTPUT_FOLDER'], task_id)
os.makedirs(output_dir, exist_ok=True)
with open(os.path.join(output_dir, 'out.pdf'), 'w') as f:
f.write('test')
cleanup_task_files(task_id, keep_outputs=True)
assert os.path.exists(output_dir)