""" اختبارات وحدة تقارير المشاريع """ import unittest import pandas as pd import numpy as np import sys import os from datetime import datetime, timedelta # إضافة المسار الرئيسي للمشروع لاستيراد الوحدات sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../..'))) from modules.reports.reports_app import ReportsApp class TestReportsApp(unittest.TestCase): """اختبارات وحدة لتطبيق التقارير""" def setUp(self): """إعداد بيئة الاختبار""" self.reports_app = ReportsApp() # إنشاء بيانات محاكاة للمشاريع self.mock_projects = [ { 'id': 1, 'name': 'مشروع 1', 'number': 'T-2024001', 'client': 'وزارة الصحة', 'location': 'الرياض', 'status': 'جديد', 'submission_date': '2024-01-15', 'tender_type': 'عامة', 'created_at': '2024-01-10' }, { 'id': 2, 'name': 'مشروع 2', 'number': 'T-2024002', 'client': 'وزارة التعليم', 'location': 'جدة', 'status': 'قيد التسعير', 'submission_date': '2024-01-28', 'tender_type': 'خاصة', 'created_at': '2024-01-20' }, { 'id': 3, 'name': 'مشروع 3', 'number': 'T-2024003', 'client': 'وزارة الصحة', 'location': 'الدمام', 'status': 'تم التقديم', 'submission_date': '2024-02-10', 'tender_type': 'عامة', 'created_at': '2024-02-01' }, { 'id': 4, 'name': 'مشروع 4', 'number': 'T-2024004', 'client': 'شركة أرامكو', 'location': 'الظهران', 'status': 'تمت الترسية', 'submission_date': '2024-02-15', 'tender_type': 'عامة', 'created_at': '2024-02-05' }, { 'id': 5, 'name': 'مشروع 5', 'number': 'T-2024005', 'client': 'شركة سابك', 'location': 'الجبيل', 'status': 'قيد التنفيذ', 'submission_date': '2024-02-20', 'tender_type': 'خاصة', 'created_at': '2024-02-10' } ] def test_get_total_projects(self): """اختبار حساب إجمالي عدد المشاريع""" # تعيين المشاريع في حالة الجلسة import streamlit as st st.session_state.projects = self.mock_projects # اختبار الدالة total = self.reports_app._get_total_projects() self.assertEqual(total, 5) def test_get_active_projects(self): """اختبار حساب عدد المشاريع النشطة""" # تعيين المشاريع في حالة الجلسة import streamlit as st st.session_state.projects = self.mock_projects # اختبار الدالة active = self.reports_app._get_active_projects() self.assertEqual(active, 4) # جميع المشاريع باستثناء الجديدة أو المنتهية أو الملغية def test_get_won_projects(self): """اختبار حساب عدد المشاريع المرساة""" # تعيين المشاريع في حالة الجلسة import streamlit as st st.session_state.projects = self.mock_projects # اختبار الدالة won = self.reports_app._get_won_projects() self.assertEqual(won, 2) # المشاريع المرساة وقيد التنفيذ والمنتهية def test_get_project_status_data(self): """اختبار الحصول على بيانات توزيع المشاريع حسب الحالة""" # تعيين المشاريع في حالة الجلسة import streamlit as st st.session_state.projects = self.mock_projects # اختبار الدالة status_data = self.reports_app._get_project_status_data() self.assertIsInstance(status_data, pd.DataFrame) self.assertEqual(len(status_data), 5) # 5 حالات مختلفة # التحقق من أن عدد المشاريع لكل حالة صحيح status_counts = status_data.set_index('status')['count'].to_dict() self.assertEqual(status_counts['جديد'], 1) self.assertEqual(status_counts['قيد التسعير'], 1) self.assertEqual(status_counts['تم التقديم'], 1) self.assertEqual(status_counts['تمت الترسية'], 1) self.assertEqual(status_counts['قيد التنفيذ'], 1) def test_get_monthly_project_data(self): """اختبار الحصول على بيانات اتجاه المشاريع الشهري""" # اختبار الدالة monthly_data = self.reports_app._get_monthly_project_data() self.assertIsInstance(monthly_data, pd.DataFrame) self.assertEqual(len(monthly_data), 6) # 6 أشهر # التحقق من وجود الأعمدة المطلوبة self.assertIn('month', monthly_data.columns) self.assertIn('new', monthly_data.columns) self.assertIn('submitted', monthly_data.columns) self.assertIn('won', monthly_data.columns) def test_get_project_value_data(self): """اختبار الحصول على بيانات توزيع قيم المشاريع""" # اختبار الدالة value_data = self.reports_app._get_project_value_data() self.assertIsInstance(value_data, pd.DataFrame) self.assertEqual(len(value_data), 7) # 7 نطاقات قيمة # التحقق من وجود الأعمدة المطلوبة self.assertIn('range', value_data.columns) self.assertIn('count', value_data.columns) def test_generate_sample_data(self): """اختبار توليد البيانات العشوائية للمحاكاة""" # مشاريع project_fields = ["اسم المشروع", "رقم المناقصة", "العميل", "الموقع", "الحالة"] project_data = self.reports_app._generate_sample_data("المشاريع", project_fields, 10) self.assertIsInstance(project_data, pd.DataFrame) self.assertEqual(len(project_data), 10) for field in project_fields: self.assertIn(field, project_data.columns) # تسعير pricing_fields = ["اسم المشروع", "رقم البند", "وصف البند", "الكمية", "سعر الوحدة"] pricing_data = self.reports_app._generate_sample_data("التسعير", pricing_fields, 10) self.assertIsInstance(pricing_data, pd.DataFrame) self.assertEqual(len(pricing_data), 10) for field in pricing_fields: self.assertIn(field, pricing_data.columns) # مخاطر risk_fields = ["اسم المشروع", "رمز المخاطرة", "وصف المخاطرة", "الفئة"] risk_data = self.reports_app._generate_sample_data("المخاطر", risk_fields, 10) self.assertIsInstance(risk_data, pd.DataFrame) self.assertEqual(len(risk_data), 10) for field in risk_fields: self.assertIn(field, risk_data.columns) # محتوى محلي local_content_fields = ["اسم المشروع", "الفئة", "البند", "المورد", "التكلفة"] local_content_data = self.reports_app._generate_sample_data("المحتوى المحلي", local_content_fields, 10) self.assertIsInstance(local_content_data, pd.DataFrame) self.assertEqual(len(local_content_data), 10) for field in local_content_fields: self.assertIn(field, local_content_data.columns) if __name__ == '__main__': unittest.main()