Files
api/services/nginx/app/tests/Unit/Selfserve/SelfserveOpeningRelayActivationCronTest.php
T
Jeppe B da0113e3ed Auto-disable department self-serve at opening (#323)
Auto-disable department self-serve at opening
2026-07-28 18:03:05 +02:00

61 lines
4.0 KiB
PHP

<?php
it('registers an opening-time self-serve cleaner relay activation cron', function (): void {
$tasks = require app_path('modules/selfserve/cron/tasks.php');
expect($tasks)->toHaveCount(1);
expect($tasks[0]['id'])->toBe('selfserve.activate_opening_cleaner_relays');
expect($tasks[0]['legacy_name'])->toBe('SelfserveOpeningRelayActivationCron');
expect($tasks[0]['handler'])->toBe('SelfserveOpeningRelayActivationCron');
expect($tasks[0]['name'])->toContain('disable department self-serve');
expect($tasks[0]['description'])->toContain('every configured lane relay');
expect($tasks[0]['schedule'])->toBe(['type' => 'interval', 'seconds' => 60]);
});
it('disables department self-serve and restores staffed relay defaults after department opening time', function (): void {
$cronContent = file_get_contents(app_path('cron/Cron.php'));
expect($cronContent)->not->toBeFalse();
expect($cronContent)->toContain('function SelfserveOpeningRelayActivationCron(): array');
expect($cronContent)->toContain("new DateTimeZone('Europe/Copenhagen')");
expect($cronContent)->toContain('department_time_bookings_opening_hours');
expect($cronContent)->toContain("dv.variable = 'selfserve_enabled'");
expect($cronContent)->toContain("->set('selfserve_enabled', 'false')");
expect($cronContent)->toContain('use objects\department_variables_o;');
expect($cronContent)->toContain('selfserveActivateStaffedDefaultRelaysForDepartment');
expect($cronContent)->toContain('$nowSeconds >= $opensAtSeconds && $nowSeconds < $closesAtSeconds');
expect($cronContent)->toContain('selfserveOpeningCleanerRelayOvernightCarryoverActive');
expect($cronContent)->toContain('$previousDate = $now->modify(\'-1 day\')');
expect($cronContent)->not->toContain('if (selfserveOpeningCleanerRelayActivationAlreadyHandled($cacheKey))');
expect($cronContent)->not->toContain('if (!$departmentLane->isSelfServeEnabled())');
expect($cronContent)->toContain('throw $throwable;');
expect($cronContent)->toContain('department_variables_o::withSelfServeTransitionLock');
expect(strpos($cronContent, 'selfserveActivateStaffedDefaultRelaysForDepartment($departmentId)'))
->toBeLessThan(strpos($cronContent, 'selfserveDisableDepartmentSelfServeForOpening($departmentId)'));
expect($cronContent)->toContain('setMachineProgramPickerRelayStatusForDepartmentOperation(true)');
expect($cronContent)->toContain('setMachineCleanerRelayStatusForDepartmentOperation(true)');
expect($cronContent)->toContain('setMachineRelayStatusForDepartmentOperation(true)');
expect($cronContent)->toContain('selfserve:opening-cleaner-relays:');
});
it('exposes next self-serve auto deactivation metadata from the department endpoint', function (): void {
$routeContent = file_get_contents(app_path('routes/departmentsRoute.php'));
$openingHoursContent = file_get_contents(app_path('objects/department_time_bookings_opening_hours_o.php'));
expect($routeContent)->not->toBeFalse();
expect($openingHoursContent)->not->toBeFalse();
expect($routeContent)->toContain('buildDepartmentSelfServeEnabledPayload');
expect($routeContent)->toContain('selectExistingByDepartment($departmentId)');
expect($routeContent)->toContain("'auto_deactivation'");
expect($routeContent)->toContain("'label' => \$nextDeactivationAt === null");
expect($routeContent)->toContain("'NEVER'");
expect($openingHoursContent)->toContain('function getNextOpeningStart(DateTimeImmutable $now): ?DateTimeImmutable');
expect($openingHoursContent)->toContain('$openingStart === null');
expect($openingHoursContent)->toContain('$openingEnd === null');
expect($openingHoursContent)->toContain('$openingStart === $openingEnd');
expect($openingHoursContent)->toContain('$dayOffset <= 7');
expect($openingHoursContent)->toContain('$previousWeekdayName');
expect($openingHoursContent)->toContain('return $now;');
expect(file_get_contents(app_path('openapi.yaml')))->toContain('auto_deactivation:');
});