Spaces:
Paused
Paused
| """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, | |
| ) | |
| 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 | |