firstWhere('key', $key); } /** * „Ohne Worker passiert schlicht nichts, ohne Fehlermeldung." Genau dieser * Zustand war in der Konsole bisher nicht von „alles ruhig" zu unterscheiden. * * Zwei getrennte Herzschläge, weil Zeitplaner und Warteschlangen-Worker * getrennt ausfallen: der Zeitplaner kann laufen und Aufträge einstellen, die * niemand abholt. */ it('reports a missing heartbeat as not satisfied', function () { expect(operationCheck('operation.scheduler')->satisfied)->toBeFalse(); }); it('accepts a fresh heartbeat', function () { Settings::set('heartbeat.scheduler', now()->toIso8601String()); expect(operationCheck('operation.scheduler')->satisfied)->toBeTrue(); }); it('rejects a heartbeat older than five minutes', function () { Settings::set('heartbeat.scheduler', now()->subMinutes(6)->toIso8601String()); expect(operationCheck('operation.scheduler')->satisfied)->toBeFalse(); }); it('proves the worker, not just the scheduler', function () { // Der Zeitplaner läuft, der Bereitstellungs-Worker nicht: der eine // Herzschlag ist frisch, der andere nicht. Settings::set('heartbeat.scheduler', now()->toIso8601String()); expect(operationCheck('operation.scheduler')->satisfied)->toBeTrue(); expect(operationCheck('operation.queue_provisioning')->satisfied)->toBeFalse(); }); it('records the worker heartbeat when the job runs', function () { (new RecordProvisioningHeartbeat)->handle(); expect(operationCheck('operation.queue_provisioning')->satisfied)->toBeTrue(); });