83 lines
3.5 KiB
Python
83 lines
3.5 KiB
Python
import unittest
|
|
import os
|
|
import sys
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
# Adjust path to allow importing from backend
|
|
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
|
|
|
from backend.services.classification import ClassificationService
|
|
from backend.database import Company, Industry, RoboticsCategory, Session
|
|
|
|
class TestHospitalMetricFinal(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
self.service = ClassificationService()
|
|
self.mock_db = MagicMock(spec=Session)
|
|
|
|
self.mock_company = Company(id=8, name="Klinikum Landkreis Erding")
|
|
self.mock_industry_hospital = Industry(
|
|
id=1,
|
|
name="Healthcare - Hospital",
|
|
scraper_search_term="Anzahl Betten",
|
|
standardization_logic="wert * 100",
|
|
primary_category=RoboticsCategory(name="Reinigungsroboter"),
|
|
secondary_category=RoboticsCategory(name="Serviceroboter"),
|
|
)
|
|
self.mock_website_content = "Ein langer Text, der die 100-Zeichen-Prüfung besteht."
|
|
|
|
@patch('backend.services.classification.ClassificationService._generate_marketing_opener')
|
|
@patch('backend.services.classification.ClassificationService._extract_and_calculate_metric_cascade')
|
|
@patch('backend.services.classification.ClassificationService._find_direct_area')
|
|
@patch('backend.services.classification.ClassificationService._run_llm_classification_prompt')
|
|
@patch('backend.services.classification.ClassificationService._get_website_content_and_url')
|
|
@patch('backend.services.classification.ClassificationService._load_industry_definitions')
|
|
def test_final_hospital_logic(
|
|
self,
|
|
mock_load_industries,
|
|
mock_get_website,
|
|
mock_classify,
|
|
mock_find_direct_area,
|
|
mock_extract_cascade,
|
|
mock_generate_opener
|
|
):
|
|
print("\n--- Running Final Hospital Logic Test ---")
|
|
|
|
# --- MOCK SETUP ---
|
|
mock_load_industries.return_value = [self.mock_industry_hospital]
|
|
mock_get_website.return_value = (self.mock_website_content, "http://mock.com")
|
|
mock_classify.return_value = "Healthcare - Hospital"
|
|
mock_find_direct_area.return_value = None # STAGE 1 MUST FAIL
|
|
|
|
proxy_metric_result = {
|
|
"calculated_metric_name": "Anzahl Betten",
|
|
"calculated_metric_value": 352.0,
|
|
"calculated_metric_unit": "Betten",
|
|
"standardized_metric_value": 35200.0,
|
|
"standardized_metric_unit": "m²",
|
|
"metric_source": "wikipedia",
|
|
}
|
|
mock_extract_cascade.return_value = proxy_metric_result
|
|
mock_generate_opener.side_effect = ["Primary Opener", "Secondary Opener"]
|
|
|
|
# --- EXECUTION ---
|
|
updated_company = self.service.classify_company_potential(self.mock_company, self.mock_db)
|
|
|
|
# --- ASSERTIONS ---
|
|
mock_find_direct_area.assert_called_once()
|
|
mock_extract_cascade.assert_called_once()
|
|
|
|
self.assertEqual(updated_company.calculated_metric_name, "Anzahl Betten")
|
|
self.assertEqual(updated_company.calculated_metric_value, 352.0)
|
|
self.assertEqual(updated_company.standardized_metric_value, 35200.0)
|
|
print(" ✅ Metrics from Stage 2 correctly applied.")
|
|
|
|
self.assertEqual(updated_company.ai_opener, "Primary Opener")
|
|
self.assertEqual(updated_company.ai_opener_secondary, "Secondary Opener")
|
|
print(" ✅ Openers correctly applied.")
|
|
|
|
print("\n--- ✅ PASSED: Final Hospital Logic Test. ---")
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|