"""Tests for Fitz-enz metric calculations.""" import pytest from hr_env.server.data_gen import generate_company from hr_env.server.metrics import ( compute_all_metrics, compute_employee_value, compute_five_indexes, compute_hcva, compute_hcroi, compute_qips, ) @pytest.fixture def company(): return generate_company(seed=42, size=300) class TestHCVA: def test_positive_for_normal_company(self, company): hcva = compute_hcva(company) assert hcva > 0, f"HCVA should be positive, got {hcva}" def test_scales_with_revenue(self, company): hcva_base = compute_hcva(company) company.base_revenue *= 2 hcva_high = compute_hcva(company) assert hcva_high > hcva_base class TestHCROI: def test_greater_than_one(self, company): hcroi = compute_hcroi(company) # Revenue should exceed employment cost for a healthy company assert hcroi > 0.5, f"HCROI should be > 0.5, got {hcroi}" def test_decreases_with_salary_inflation(self, company): hcroi_base = compute_hcroi(company) for emp in company.all_active_employees: emp.salary *= 2 hcroi_inflated = compute_hcroi(company) assert hcroi_inflated < hcroi_base class TestQIPS: def test_returns_all_components(self, company): qips = compute_qips(company) assert "quality" in qips assert "innovation" in qips assert "productivity" in qips assert "service" in qips assert "composite" in qips def test_composite_in_range(self, company): qips = compute_qips(company) assert 0 <= qips["composite"] <= 1.0 def test_all_components_in_range(self, company): qips = compute_qips(company) for key in ["quality", "innovation", "productivity", "service"]: assert 0 <= qips[key] <= 1.0, f"{key} = {qips[key]} out of range" class TestFiveIndexes: def test_zero_with_no_previous(self): indexes = compute_five_indexes({"employment_cost": 1000}, None) assert all(v == 0.0 for v in indexes.values()) def test_detects_cost_increase(self): prev = {"employment_cost": 1000, "time_to_fill": 30, "headcount": 100, "avg_performance": 3.0, "avg_engagement": 70} curr = {"employment_cost": 1200, "time_to_fill": 30, "headcount": 100, "avg_performance": 3.0, "avg_engagement": 70} indexes = compute_five_indexes(curr, prev) assert indexes["cost"] > 0 # Cost increased def test_detects_quality_improvement(self): prev = {"employment_cost": 1000, "time_to_fill": 30, "headcount": 100, "avg_performance": 3.0, "avg_engagement": 70} curr = {"employment_cost": 1000, "time_to_fill": 30, "headcount": 100, "avg_performance": 3.5, "avg_engagement": 70} indexes = compute_five_indexes(curr, prev) assert indexes["quality"] > 0 class TestEmployeeValue: def test_in_range(self, company): ev = compute_employee_value(company) assert 0 <= ev <= 1.0 def test_increases_with_better_scores(self, company): ev_base = compute_employee_value(company) for emp in company.all_active_employees: emp.performance_score = 5.0 emp.promotability = 1.0 emp.transferability = 1.0 emp.retainability = 1.0 ev_perfect = compute_employee_value(company) assert ev_perfect > ev_base class TestAllMetrics: def test_returns_all_keys(self, company): metrics = compute_all_metrics(company) assert "hcva" in metrics assert "hcroi" in metrics assert "qips" in metrics assert "five_indexes" in metrics assert "employee_value" in metrics assert "snapshot" in metrics