File size: 3,770 Bytes
8697ae6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"""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