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