Spaces:
Sleeping
Sleeping
""" | |
اختبارات وحدة تقارير المشاريع | |
""" | |
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() |