CluPilotCloud/tests/Feature/Readiness/DeliveryChecksTest.php

93 lines
3.4 KiB
PHP

<?php
use App\Models\Mailbox;
use App\Models\MailTemplate;
use App\Models\Operator;
use App\Services\Secrets\SecretVault;
use App\Support\OperatingMode;
use App\Support\Readiness;
use App\Support\Readiness\Check;
function deliveryCheck(string $key): ?Check
{
return collect(Readiness::all())->firstWhere('key', $key);
}
/**
* `mail.default = log` heißt: die VM läuft, der Beleg ist geschrieben, und die
* Mail, die dem Kunden seine fertige Cloud ankündigt, liegt in einer Datei auf
* dem Server. Der Kunde erfährt nie, dass er eine Cloud hat. Kein Fehler
* taucht irgendwo auf.
*/
it('refuses to call an installation ready while mail goes to the log file', function () {
config()->set('mail.default', 'log');
expect(deliveryCheck('delivery.mailer_not_log')->satisfied)->toBeFalse();
});
it('accepts a real mailer', function () {
config()->set('mail.default', 'smtp');
expect(deliveryCheck('delivery.mailer_not_log')->satisfied)->toBeTrue();
});
it('needs at least one mailbox to send from', function () {
// Eine Migration seedet fünf Mailboxen (no-reply, support, billing,
// office, info) für jede Installation — auch für diese Suite. Auf den
// leeren Zustand zurückgesetzt, den dieser Test eigentlich prüft (siehe
// clearMailboxSeed() in Pest.php).
clearMailboxSeed();
// CompleteProvisioning verschickt CloudReady SYNCHRON und wirft, wenn
// MailboxResolver keine Mailbox findet — der letzte Schritt der
// Bereitstellung scheitert dann, nachdem die Maschine schon läuft und der
// Kunde schon bezahlt hat.
expect(deliveryCheck('delivery.mailbox')->satisfied)->toBeFalse();
Mailbox::factory()->create();
expect(deliveryCheck('delivery.mailbox')->satisfied)->toBeTrue();
});
it('treats missing reply templates as a warning, never as a blocker', function () {
// Eine Migration seedet einen Grundstock an Antwortvorlagen für jede
// Installation — auch für diese Suite. Geleert, um den leeren Zustand zu
// prüfen, den ein frisches Setup ohne diese Migration tatsächlich hätte.
MailTemplate::query()->delete();
expect(deliveryCheck('delivery.mail_templates')->satisfied)->toBeFalse();
expect(deliveryCheck('delivery.mail_templates')->severity)->toBe(Check::SEVERITY_WARNING);
MailTemplate::query()->create([
'name' => 'Test Template',
'subject' => 'Re: your question',
'body' => 'Thanks for reaching out.',
'sort' => 1,
'active' => true,
]);
expect(deliveryCheck('delivery.mail_templates')->satisfied)->toBeTrue();
});
it('treats a missing inbound mail password as a warning, never as a blocker', function () {
OperatingMode::set(OperatingMode::Live);
expect(deliveryCheck('delivery.inbound_password')->satisfied)->toBeFalse();
expect(deliveryCheck('delivery.inbound_password')->severity)->toBe(Check::SEVERITY_WARNING);
app(SecretVault::class)->put('inbound_mail.password', 'secret', Operator::factory()->create(), OperatingMode::Live);
expect(deliveryCheck('delivery.inbound_password')->satisfied)->toBeTrue();
});
it('names what breaks for every delivery check, not just what is missing', function () {
foreach ([
'delivery.mailer_not_log',
'delivery.mailbox',
'delivery.mail_templates',
'delivery.inbound_password',
] as $key) {
expect(deliveryCheck($key)->breaks)->not->toBe('');
}
});