File size: 12,226 Bytes
82676b8 |
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 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
"""
اختبارات تكامل لتصدير التقارير
"""
import unittest
import pandas as pd
import os
import sys
import tempfile
import shutil
from datetime import datetime
# إضافة المسار الرئيسي للمشروع لاستيراد الوحدات
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')))
from modules.reports.reports_app import ReportsApp
from utils.excel_handler import export_to_excel
class TestReportExport(unittest.TestCase):
"""اختبارات تكامل لتصدير التقارير"""
def setUp(self):
"""إعداد بيئة الاختبار"""
self.reports_app = ReportsApp()
# إنشاء مجلد مؤقت للملفات المصدرة
self.test_dir = tempfile.mkdtemp()
# إنشاء بيانات محاكاة للمشاريع
self.projects_data = pd.DataFrame({
'اسم المشروع': [f'مشروع {i}' for i in range(1, 6)],
'رقم المناقصة': [f'T-2024{i:03d}' for i in range(1, 6)],
'العميل': ['وزارة الصحة', 'وزارة التعليم', 'وزارة الصحة', 'شركة أرامكو', 'شركة سابك'],
'الموقع': ['الرياض', 'جدة', 'الدمام', 'الظهران', 'الجبيل'],
'الحالة': ['جديد', 'قيد التسعير', 'تم التقديم', 'تمت الترسية', 'قيد التنفيذ'],
'تاريخ التقديم': ['2024-01-15', '2024-01-28', '2024-02-10', '2024-02-15', '2024-02-20'],
'نوع المناقصة': ['عامة', 'خاصة', 'عامة', 'عامة', 'خاصة']
})
# إنشاء بيانات محاكاة للتسعير
self.pricing_data = pd.DataFrame({
'اسم المشروع': ['مشروع 1', 'مشروع 1', 'مشروع 1', 'مشروع 2', 'مشروع 2'],
'رقم البند': ['A001', 'A002', 'A003', 'B001', 'B002'],
'وصف البند': [
'أعمال الحفر والردم',
'أعمال الخرسانة المسلحة',
'أعمال حديد التسليح',
'أعمال البلوك',
'أعمال اللياسة'
],
'الوحدة': ['م3', 'م3', 'طن', 'م2', 'م2'],
'الكمية': [1000, 500, 50, 800, 1200],
'سعر الوحدة': [50, 1200, 5000, 120, 80],
'الإجمالي': [50000, 600000, 250000, 96000, 96000]
})
# إنشاء بيانات محاكاة للمخاطر
self.risks_data = pd.DataFrame({
'رمز المخاطرة': [f'R{i:03d}' for i in range(1, 6)],
'اسم المشروع': ['مشروع 1', 'مشروع 1', 'مشروع 2', 'مشروع 3', 'مشروع 4'],
'وصف المخاطرة': [
'غرامة تأخير مرتفعة',
'مدة تنفيذ قصيرة',
'متطلبات ضمان بنكي مرتفعة',
'شروط دفع متأخرة',
'متطلبات تأمين شاملة ومكلفة'
],
'الفئة': [
'مخاطر مالية',
'مخاطر زمنية',
'مخاطر مالية',
'مخاطر مالية',
'مخاطر مالية'
],
'التأثير': ['عالي', 'متوسط', 'منخفض', 'عالي', 'متوسط'],
'الاحتمالية': ['محتمل', 'مؤكد', 'غير محتمل', 'محتمل', 'غير محتمل'],
'درجة المخاطرة': [6, 6, 2, 8, 4]
})
def tearDown(self):
"""تنظيف بيئة الاختبار"""
# حذف المجلد المؤقت
shutil.rmtree(self.test_dir)
def test_export_projects_report_to_excel(self):
"""اختبار تصدير تقرير المشاريع إلى Excel"""
# إنشاء مسار الملف المصدر
output_file = os.path.join(self.test_dir, 'projects_report.xlsx')
# تصدير البيانات
result = export_to_excel(self.projects_data, output_file, sheet_name='المشاريع', title='تقرير المشاريع')
# التحقق من نجاح التصدير
self.assertTrue(result)
self.assertTrue(os.path.exists(output_file))
# التحقق من محتوى الملف المصدر
imported_data = pd.read_excel(output_file, sheet_name='المشاريع', skiprows=2) # تخطي الصفوف الأولى (العنوان)
# التحقق من عدد الصفوف والأعمدة
self.assertEqual(len(imported_data), len(self.projects_data))
self.assertEqual(len(imported_data.columns), len(self.projects_data.columns))
def test_export_pricing_report_to_excel(self):
"""اختبار تصدير تقرير التسعير إلى Excel"""
# إنشاء مسار الملف المصدر
output_file = os.path.join(self.test_dir, 'pricing_report.xlsx')
# تصدير البيانات
result = export_to_excel(self.pricing_data, output_file, sheet_name='التسعير', title='تقرير التسعير')
# التحقق من نجاح التصدير
self.assertTrue(result)
self.assertTrue(os.path.exists(output_file))
# التحقق من محتوى الملف المصدر
imported_data = pd.read_excel(output_file, sheet_name='التسعير', skiprows=2) # تخطي الصفوف الأولى (العنوان)
# التحقق من عدد الصفوف والأعمدة
self.assertEqual(len(imported_data), len(self.pricing_data))
self.assertEqual(len(imported_data.columns), len(self.pricing_data.columns))
def test_export_multiple_sheets(self):
"""اختبار تصدير تقرير متعدد الصفحات"""
# إنشاء مسار الملف المصدر
output_file = os.path.join(self.test_dir, 'combined_report.xlsx')
# تصدير البيانات متعددة الصفحات
result1 = export_to_excel(self.projects_data, output_file, sheet_name='المشاريع', title='تقرير المشاريع')
result2 = export_to_excel(self.pricing_data, output_file, sheet_name='التسعير', title='تقرير التسعير', append=True)
result3 = export_to_excel(self.risks_data, output_file, sheet_name='المخاطر', title='تقرير المخاطر', append=True)
# التحقق من نجاح التصدير
self.assertTrue(result1)
self.assertTrue(result2)
self.assertTrue(result3)
self.assertTrue(os.path.exists(output_file))
# التحقق من وجود جميع الصفحات
excel_file = pd.ExcelFile(output_file)
self.assertIn('المشاريع', excel_file.sheet_names)
self.assertIn('التسعير', excel_file.sheet_names)
self.assertIn('المخاطر', excel_file.sheet_names)
# التحقق من محتوى كل صفحة
projects_data = pd.read_excel(output_file, sheet_name='المشاريع', skiprows=2)
pricing_data = pd.read_excel(output_file, sheet_name='التسعير', skiprows=2)
risks_data = pd.read_excel(output_file, sheet_name='المخاطر', skiprows=2)
self.assertEqual(len(projects_data), len(self.projects_data))
self.assertEqual(len(pricing_data), len(self.pricing_data))
self.assertEqual(len(risks_data), len(self.risks_data))
def test_export_with_formatting(self):
"""اختبار تصدير تقرير مع التنسيق"""
# إنشاء مسار الملف المصدر
output_file = os.path.join(self.test_dir, 'formatted_report.xlsx')
# تصدير البيانات مع تنسيق
formatting = {
'header_format': {
'bold': True,
'bg_color': '#4F81BD',
'font_color': 'white',
'border': 1,
'align': 'center'
},
'row_formats': [
{
'columns': ['الإجمالي'],
'num_format': '#,##0.00 ريال'
},
{
'columns': ['الكمية'],
'num_format': '#,##0.00'
}
],
'conditional_formats': [
{
'column': 'درجة المخاطرة',
'criteria': '>',
'value': 6,
'format': {'bg_color': '#FF9999'}
}
]
}
result = export_to_excel(self.risks_data, output_file, sheet_name='المخاطر',
title='تقرير المخاطر', formatting=formatting)
# التحقق من نجاح التصدير
self.assertTrue(result)
self.assertTrue(os.path.exists(output_file))
def test_export_with_filters(self):
"""اختبار تصدير تقرير مع تصفية"""
# إنشاء مسار الملف المصدر
output_file = os.path.join(self.test_dir, 'filtered_report.xlsx')
# تصدير البيانات المشاريع المفلترة (فقط مشاريع وزارة الصحة)
filtered_data = self.projects_data[self.projects_data['العميل'] == 'وزارة الصحة']
result = export_to_excel(filtered_data, output_file, sheet_name='مشاريع الصحة',
title='تقرير مشاريع وزارة الصحة')
# التحقق من نجاح التصدير
self.assertTrue(result)
self.assertTrue(os.path.exists(output_file))
# التحقق من محتوى الملف المصدر
imported_data = pd.read_excel(output_file, sheet_name='مشاريع الصحة', skiprows=2)
# التحقق من أن جميع المشاريع تنتمي لوزارة الصحة
self.assertEqual(len(imported_data), 2)
self.assertTrue(all(client == 'وزارة الصحة' for client in imported_data['العميل']))
def test_export_with_summary(self):
"""اختبار تصدير تقرير مع ملخص"""
# إنشاء مسار الملف المصدر
output_file = os.path.join(self.test_dir, 'summary_report.xlsx')
# إنشاء بيانات الملخص
summary_data = pd.DataFrame({
'المؤشر': ['إجمالي المشاريع', 'المشاريع النشطة', 'المشاريع المرساة', 'نسبة النجاح'],
'القيمة': [5, 4, 2, '40%']
})
# تصدير البيانات مع ملخص
result1 = export_to_excel(summary_data, output_file, sheet_name='الملخص',
title='ملخص تقرير المشاريع')
result2 = export_to_excel(self.projects_data, output_file, sheet_name='البيانات',
title='تفاصيل المشاريع', append=True)
# التحقق من نجاح التصدير
self.assertTrue(result1)
self.assertTrue(result2)
self.assertTrue(os.path.exists(output_file))
# التحقق من وجود صفحات الملخص والبيانات
excel_file = pd.ExcelFile(output_file)
self.assertIn('الملخص', excel_file.sheet_names)
self.assertIn('البيانات', excel_file.sheet_names)
if __name__ == '__main__':
unittest.main() |