CluPilotCloud/tests/Feature/Readiness/HeartbeatTest.php

51 lines
1.7 KiB
PHP

<?php
use App\Provisioning\Jobs\RecordProvisioningHeartbeat;
use App\Support\Readiness;
use App\Support\Readiness\Check;
use App\Support\Settings;
function operationCheck(string $key): ?Check
{
return collect(Readiness::all())->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();
});