Refactor employee name handling to utilize workfeed_employee_name_formatter for improved name resolution and fallback logic

This commit is contained in:
Jeppe Bundgaard
2026-05-18 10:59:23 +02:00
parent f53b99ad94
commit 3261ed8414
9 changed files with 714 additions and 131 deletions
@@ -182,7 +182,46 @@ it('extracts weather employee identity from supported shift payload shapes', fun
]);
});
it('uses an unknown employee label when no employee name is available', function (): void {
it('prefers canonical workfeed employee schema fields over generic employee names', function (): void {
$route = new moduleWeatherAPIRoute();
$identity = weather_route_invoke_private($route, 'extractWorkfeedEmployeeIdentity', [
(object)[
'employee' => (object)[
'id' => 'emp_4',
'firstname' => 'Dana',
'lastname' => 'Scully',
'name' => 'Wrong Name',
],
'employeeName' => 'Also Wrong',
],
]);
expect($identity)->toBe([
'id' => 'emp_4',
'name' => 'Dana Scully',
]);
});
it('does not use workfeed schema name fields as employee ids', function (): void {
$route = new moduleWeatherAPIRoute();
$identity = weather_route_invoke_private($route, 'extractWorkfeedEmployeeIdentity', [
(object)[
'employee' => (object)[
'firstname' => 'Fox',
'lastname' => 'Mulder',
],
],
]);
expect($identity)->toBe([
'id' => null,
'name' => 'Fox Mulder',
]);
});
it('returns a null employee name when no workfeed employee name is available', function (): void {
$route = new moduleWeatherAPIRoute();
$identity = weather_route_invoke_private($route, 'extractWorkfeedEmployeeIdentity', [
@@ -193,10 +232,66 @@ it('uses an unknown employee label when no employee name is available', function
expect($identity)->toBe([
'id' => 'emp_99',
'name' => 'Unknown employee',
'name' => null,
]);
});
it('resolves missing workfeed employee names from the employees endpoint', function (): void {
$route = new moduleWeatherAPIRoute();
$workfeed = new class extends workfeed {
public function __construct()
{
}
public function listEmployees(array $filters = []): array|object
{
return [
(object)[
'id' => 'emp_42',
'firstname' => 'Jane',
'lastname' => 'Doe',
],
];
}
public function getEmployee(string $id): object
{
return (object)[];
}
};
$resolvedNames = [];
$employees = weather_route_invoke_private($route, 'resolveMissingWorkfeedEmployeeNames', [[
[
'employee_id' => 'emp_42',
'employee_name' => null,
'hours' => 1.0,
],
], null, &$resolvedNames, $workfeed]);
expect($employees)->toBe([[
'employee_id' => 'emp_42',
'employee_name' => 'Jane Doe',
'hours' => 1.0,
]]);
});
it('filters employee hour rows that cannot be resolved to a workfeed schema name', function (): void {
$route = new moduleWeatherAPIRoute();
$resolvedNames = [];
$employees = weather_route_invoke_private($route, 'resolveMissingWorkfeedEmployeeNames', [[
[
'employee_id' => 'emp_missing',
'employee_name' => null,
'hours' => 1.0,
],
], null, &$resolvedNames, null]);
expect($employees)->toBe([]);
});
it('resolves employee display name from cache when shift payload lacks a name', function (): void {
$route = new moduleWeatherAPIRoute();