87 lines
3.0 KiB
PHP
87 lines
3.0 KiB
PHP
<?php // tests/Feature/Cancellation/RemindEndingServicesTest.php
|
|
|
|
use App\Mail\ServiceEndingSoonMail;
|
|
use App\Models\Instance;
|
|
use Illuminate\Support\Facades\Mail;
|
|
|
|
it('erinnert sieben Tage vor dem Ende', function () {
|
|
Mail::fake();
|
|
$instance = Instance::factory()->create([
|
|
'status' => 'cancellation_scheduled',
|
|
'service_ends_at' => now()->addDays(6),
|
|
]);
|
|
|
|
$this->artisan('clupilot:remind-ending-services')->assertSuccessful();
|
|
|
|
Mail::assertQueued(ServiceEndingSoonMail::class);
|
|
expect($instance->fresh()->export_reminded_at)->not->toBeNull();
|
|
});
|
|
|
|
it('erinnert nicht zweimal', function () {
|
|
// Ein täglicher Zeitplan würde die Erinnerung sonst an jedem der
|
|
// restlichen Tage erneut schicken. Eine Erinnerung im Sechserpack liest
|
|
// sich als Mahnung.
|
|
Mail::fake();
|
|
Instance::factory()->create([
|
|
'status' => 'cancellation_scheduled',
|
|
'service_ends_at' => now()->addDays(6),
|
|
'export_reminded_at' => now()->subHour(),
|
|
]);
|
|
|
|
$this->artisan('clupilot:remind-ending-services')->assertSuccessful();
|
|
|
|
Mail::assertNothingQueued();
|
|
});
|
|
|
|
it('erinnert nicht, wenn das Ende noch weit weg ist', function () {
|
|
Mail::fake();
|
|
Instance::factory()->create([
|
|
'status' => 'cancellation_scheduled',
|
|
'service_ends_at' => now()->addDays(30),
|
|
]);
|
|
|
|
$this->artisan('clupilot:remind-ending-services')->assertSuccessful();
|
|
|
|
Mail::assertNothingQueued();
|
|
});
|
|
|
|
it('erinnert eine Instanz, die gar nicht gekündigt wurde, nicht', function () {
|
|
Mail::fake();
|
|
Instance::factory()->create(['status' => 'active', 'service_ends_at' => now()->addDays(6)]);
|
|
|
|
$this->artisan('clupilot:remind-ending-services')->assertSuccessful();
|
|
|
|
Mail::assertNothingQueued();
|
|
});
|
|
|
|
it('erinnert auch dann, wenn das Ende schon in wenigen Stunden ist', function () {
|
|
// Der wichtigste Fall und der, den ein "genau sieben Tage"-Vergleich
|
|
// verfehlt: eine Instanz, die zwischen zwei Läufen durchgerutscht ist,
|
|
// oder eine, die mit kurzer Frist gekündigt wurde. Lieber spät erinnern
|
|
// als gar nicht — ab dem Laufzeitende kommt der Kunde nicht mehr hinein.
|
|
Mail::fake();
|
|
Instance::factory()->create([
|
|
'status' => 'cancellation_scheduled',
|
|
'service_ends_at' => now()->addHours(3),
|
|
]);
|
|
|
|
$this->artisan('clupilot:remind-ending-services')->assertSuccessful();
|
|
|
|
Mail::assertQueued(ServiceEndingSoonMail::class);
|
|
});
|
|
|
|
it('trägt in der Mail das Datum und den Weg zum Selbst-Herunterladen', function () {
|
|
$instance = Instance::factory()->create([
|
|
'status' => 'cancellation_scheduled',
|
|
'service_ends_at' => now()->addDays(6),
|
|
'export_wish' => false,
|
|
]);
|
|
|
|
$text = (new ServiceEndingSoonMail($instance))->render();
|
|
|
|
// Kein roher Schlüssel, und die zwei Dinge, um die es geht: ab wann ist
|
|
// zu, und wie komme ich vorher an meine Sachen.
|
|
expect($text)->not->toContain('service_ending.')
|
|
->and($text)->toContain($instance->service_ends_at->local()->isoFormat('LL'));
|
|
});
|