Files
enterprise-addons/esg_hr/tests/test_employee_report.py
T

75 lines
3.3 KiB
Python

from odoo.tests.common import TransactionCase
class TestEmployeeReport(TransactionCase):
def test_leadership_level(self):
"""
Leadership Level represents the maximum number of levels of subordinates under a given employee.
For instance, given the following diagram of an employee hierarchy:
┌──────────┐
│Employee 1│
┌───────┴────┬─────┴───────┐
│ │ │
┌────▼─────┐ ┌────▼─────┐ ┌─────▼────┐
│Employee 2│ │Employee 3│ │Employee 4│
└────┬─────┘ └──────────┘ └──────────┘
│
┌────▼─────┐
│Employee 5│
└──────────┘
We have the following values for leadership level:
- Employee 1: 2
- Employee 2: 1
- Employees 3, 4 and 5: 0
In case of cycles, the maximum depth will be the one that can be reached
without encountering the same employee again.
"""
employee_1 = self.env["hr.employee"].create({
"name": "Employee 1",
})
employee_2, employee_3, employee_4 = self.env["hr.employee"].create([{
"name": f"Employee {n}",
"parent_id": employee_1.id,
} for n in range(2, 5)])
employee_5 = self.env["hr.employee"].create({
"name": "Employee 5",
"parent_id": employee_2.id,
})
for employee, expected_leadership_level in [
(employee_1, 2),
(employee_2, 1),
(employee_3, 0),
(employee_5, 0),
]:
report_record = self.env["esg.employee.report"].browse(employee.id)
self.assertEqual(report_record.leadership_level, expected_leadership_level)
# Add a cycle
employee_1.parent_id = employee_4.id
self.env.cr.flush()
self.env["esg.employee.report"]._invalidate_cache()
self.env["hr.employee"]._invalidate_cache()
for employee, expected_leadership_level in [
(employee_1, 2), # Longest path is unchaged since the cycle is only 1 -> 4 -> 1 (depth of one)
(employee_4, 3), # Since the longest path is now 4 -> 1 -> 2 -> 5
]:
report_record = self.env["esg.employee.report"].browse(employee.id)
self.assertEqual(report_record.leadership_level, expected_leadership_level)
# Make employees their own manager
employee_1.parent_id = employee_1.id
employee_4.parent_id = employee_4.id
self.env.cr.flush()
self.env["esg.employee.report"]._invalidate_cache()
self.env["hr.employee"]._invalidate_cache()
for employee, expected_leadership_level in [
(employee_1, 2), # Longest path still unchanged
(employee_4, 0), # Employee 4 is now isolated from the rest of the hierarchy
]:
report_record = self.env["esg.employee.report"].browse(employee.id)
self.assertEqual(report_record.leadership_level, expected_leadership_level)