hcm21 / tests /test_metrics.py
ParetoOptimal's picture
Initial release: HCM:21 HR Productivity Measurement Environment
8697ae6
Raw
History Blame Contribute Delete
3.77 kB
"""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