Refactor employee name handling to utilize workfeed_employee_name_formatter for improved name resolution and fallback logic
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user