File size: 4,818 Bytes
66fa3e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import os
import sys
import unittest
from datetime import datetime
import tempfile

# إضافة المسار الرئيسي للمشروع إلى PATH
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

# استيراد الوحدات المراد اختبارها
from modules.document_processor import DocumentProcessor

class TestDocumentProcessor(unittest.TestCase):
    """
    اختبارات وحدة لمعالج المستندات
    """
    
    def setUp(self):
        """
        إعداد بيئة الاختبار
        """
        self.document_processor = DocumentProcessor()
        
        # إنشاء ملفات اختبار مؤقتة
        self.temp_files = {}
        
        # إنشاء ملف نصي للاختبار
        with tempfile.NamedTemporaryFile(suffix=".txt", delete=False) as tmp:
            tmp.write("""
            مناقصة لإنشاء مبنى إداري
            
            المتطلبات:
            1. يجب أن تكون الشركة مصنفة في مجال المباني الدرجة الثانية على الأقل
            2. خبرة لا تقل عن 10 سنوات في مجال إنشاء المباني الإدارية
            3. تنفيذ 3 مشاريع مماثلة خلال الخمس سنوات الماضية
            
            المحتوى المحلي:
            يجب ألا تقل نسبة المحتوى المحلي عن 40% من إجمالي قيمة المشروع
            
            التكلفة التقديرية: 15,000,000 ريال سعودي
            
            المدة: 24 شهر
            
            تاريخ البدء: 01/01/2024
            """.encode('utf-8'))
            self.temp_files["txt"] = tmp.name
    
    def tearDown(self):
        """
        تنظيف بيئة الاختبار
        """
        # حذف الملفات المؤقتة
        for file_path in self.temp_files.values():
            if os.path.exists(file_path):
                os.remove(file_path)
    
    def test_process_txt_document(self):
        """
        اختبار معالجة ملف نصي
        """
        # قراءة محتوى الملف
        with open(self.temp_files["txt"], 'rb') as f:
            file_content = f.read()
        
        # معالجة الملف
        result = self.document_processor.process_document(
            file_content, 
            "txt", 
            "test_document.txt"
        )
        
        # التحقق من النتائج
        self.assertIn("text", result)
        self.assertIn("file_name", result)
        self.assertEqual(result["file_name"], "test_document.txt")
        self.assertEqual(result["file_type"], "txt")
        
        # التحقق من استخراج النص
        self.assertIn("مناقصة لإنشاء مبنى إداري", result["text"])
        
        # التحقق من استخراج المتطلبات
        self.assertIn("requirements", result)
        requirements = result.get("requirements", [])
        self.assertGreaterEqual(len(requirements), 1)
        
        # التحقق من استخراج المحتوى المحلي
        self.assertIn("local_content", result)
        local_content = result.get("local_content", {})
        self.assertIn("percentages", local_content)
        
        # التحقق من استخراج البيانات المالية
        self.assertIn("financial_data", result)
        financial_data = result.get("financial_data", {})
        self.assertIn("total_cost", financial_data)
        
        # التحقق من استخراج التواريخ
        self.assertIn("dates", result)
        dates = result.get("dates", [])
        self.assertGreaterEqual(len(dates), 1)
    
    def test_extract_requirements(self):
        """
        اختبار استخراج المتطلبات
        """
        test_text = """
        المتطلبات الفنية:
        1. يجب أن يكون المقاول مصنفاً في مجال المباني الدرجة الأولى
        2. خبرة لا تقل عن 15 سنة
        
        المتطلبات المالية:
        1. ملاءة مالية لا تقل عن 10 مليون ريال
        """
        
        requirements = self.document_processor._extract_requirements(test_text)
        
        # التحقق من النتائج
        self.assertGreaterEqual(len(requirements), 2)
        
        # التحقق من تصنيف المتطلبات
        categories = set(req["category"] for req in requirements)
        self.assertIn("فنية", categories)
    
    def test_extract_local_content_info(self):
        """
        اختبار استخراج معلومات المحتوى المحلي
        """