ميزة: إضافة مكوني 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,111 @@
"""Tests for PDF tools service — Merge, Split, Rotate, etc."""
import os
import pytest
from unittest.mock import patch, MagicMock
from app.services.pdf_tools_service import (
merge_pdfs,
split_pdf,
PDFToolsError,
)
class TestMergePdfsService:
def test_merge_file_not_found_raises(self, app):
"""Should raise when input file doesn't exist."""
with app.app_context():
with pytest.raises(PDFToolsError, match="not found"):
merge_pdfs(
['/tmp/nonexistent1.pdf', '/tmp/nonexistent2.pdf'],
'/tmp/merged_output.pdf',
)
def test_merge_success(self, app, tmp_path):
"""Should merge PDF files successfully."""
with app.app_context():
# Create test PDFs using PyPDF2
try:
from PyPDF2 import PdfWriter
pdf1 = str(tmp_path / 'a.pdf')
pdf2 = str(tmp_path / 'b.pdf')
for path in [pdf1, pdf2]:
writer = PdfWriter()
writer.add_blank_page(width=612, height=792)
with open(path, 'wb') as f:
writer.write(f)
output = str(tmp_path / 'merged.pdf')
result = merge_pdfs([pdf1, pdf2], output)
assert result['total_pages'] == 2
assert result['files_merged'] == 2
assert result['output_size'] > 0
assert os.path.exists(output)
except ImportError:
pytest.skip("PyPDF2 not installed")
class TestSplitPdfService:
def test_split_all_pages(self, app, tmp_path):
"""Should split PDF into individual pages."""
with app.app_context():
try:
from PyPDF2 import PdfWriter
# Create 3-page PDF
input_path = str(tmp_path / 'multi.pdf')
writer = PdfWriter()
for _ in range(3):
writer.add_blank_page(width=612, height=792)
with open(input_path, 'wb') as f:
writer.write(f)
output_dir = str(tmp_path / 'split_output')
result = split_pdf(input_path, output_dir, mode='all')
assert result['total_pages'] == 3
assert result['extracted_pages'] == 3
assert os.path.exists(result['zip_path'])
except ImportError:
pytest.skip("PyPDF2 not installed")
def test_split_range_out_of_bounds_includes_total_pages(self, app, tmp_path):
"""Should raise a clear error when requested pages exceed document page count."""
with app.app_context():
try:
from PyPDF2 import PdfWriter
input_path = str(tmp_path / 'single-page.pdf')
writer = PdfWriter()
writer.add_blank_page(width=612, height=792)
with open(input_path, 'wb') as f:
writer.write(f)
output_dir = str(tmp_path / 'split_output')
with pytest.raises(PDFToolsError, match='has only 1 page'):
split_pdf(input_path, output_dir, mode='range', pages='1-2')
except ImportError:
pytest.skip("PyPDF2 not installed")
def test_split_range_invalid_format_returns_clear_message(self, app, tmp_path):
"""Should raise a clear error for malformed page ranges."""
with app.app_context():
try:
from PyPDF2 import PdfWriter
input_path = str(tmp_path / 'two-pages.pdf')
writer = PdfWriter()
writer.add_blank_page(width=612, height=792)
writer.add_blank_page(width=612, height=792)
with open(input_path, 'wb') as f:
writer.write(f)
output_dir = str(tmp_path / 'split_output')
with pytest.raises(PDFToolsError, match='Invalid page format'):
split_pdf(input_path, output_dir, mode='range', pages='1-2-3')
except ImportError:
pytest.skip("PyPDF2 not installed")