[2f988f42] fix(company-explorer): Implement robust quantitative potential and atomic opener generation\n\n- Refactored ClassificationService for two-stage metric extraction (direct area and proxy).- Enhanced MetricParser for targeted value matching and robust number parsing.- Implemented persona-specific 'Atomic Opener' generation using segmented pains.- Fixed logging configuration and Pydantic response models.- Added dedicated debugging script and updated documentation (GEMINI.md, MIGRATION_PLAN.md).
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user