CluPilotCloud/tests/Feature/Cancellation/ExportAnswerHasReadersTest.php

138 lines
5.7 KiB
PHP

<?php // tests/Feature/Cancellation/ExportAnswerHasReadersTest.php
use App\Livewire\Admin\Instances as AdminInstances;
use App\Livewire\Settings;
use App\Models\Customer;
use App\Models\Instance;
use App\Models\Order;
use App\Models\User;
use Livewire\Livewire;
/**
* Wer die Antwort auf die Exportfrage überhaupt zu sehen bekommt.
*
* Zwei Empfänger, die es vorher nicht gab: der Kunde auf seiner Vertragsseite
* — dort stand ein einziger Satz, der JEDEM den Export versprach, auch dem,
* der eine Sekunde vorher „Nein" gewählt hatte — und der Betreiber in der
* Konsole, wo `export_wish` gar nicht vorkam. Ein Ja landete in einer Spalte
* ohne Leser; die Frage im Kündigungsdialog war ein Formular ohne Empfänger.
*/
/**
* Ein Kunde, dessen Kündigung vorgemerkt ist — der Zustand, in dem
* ConfirmCancelPackage::cancelPackage() ihn auf die Vertragsseite umleitet.
* Eigene Fixture statt der aus DashboardCountdownTest, damit ein gezielter
* Lauf über nur diese Datei sie noch findet (siehe tests/Pest.php).
*
* @return array{0: User, 1: Instance}
*/
function kundeMitVorgemerkterKuendigung(?bool $exportWunsch): array
{
$user = User::factory()->create(['email' => 'vertrag@example.test', 'email_verified_at' => now()]);
$customer = Customer::factory()->create([
'email' => 'vertrag@example.test',
'user_id' => $user->id,
'status' => 'active',
]);
$order = Order::factory()->create(['customer_id' => $customer->id, 'plan' => 'team']);
$instance = Instance::factory()->create([
'customer_id' => $customer->id,
'order_id' => $order->id,
'plan' => 'team',
'status' => 'cancellation_scheduled',
'subdomain' => 'vertrag',
'cancel_requested_at' => now()->subDay(),
'service_ends_at' => now()->addDays(20),
'export_wish' => $exportWunsch,
]);
return [$user, $instance->refresh()];
}
it('verspricht keinen Export, wenn der Kunde gerade Nein gesagt hat', function () {
// K2: zwei richtige Bauteile, ein Bildschirm dazwischen, der beiden
// widersprach. Der Dialog schreibt korrekt `false` und leitet auf genau
// diese Seite um — und das Erste, was der Kunde dort las, war, dass er
// den Export bekommt.
[$user, $instance] = kundeMitVorgemerkterKuendigung(false);
Livewire::actingAs($user)->test(Settings::class, ['tab' => 'contract'])
->assertSee(__('settings.cancel_scheduled_body_no', [
'date' => $instance->service_ends_at->local()->isoFormat('LL'),
]))
->assertDontSee(__('settings.cancel_scheduled_body_yes', [
'date' => $instance->service_ends_at->local()->isoFormat('LL'),
]));
});
it('nennt den Export nur dem, der ihn wollte', function () {
[$user, $instance] = kundeMitVorgemerkterKuendigung(true);
Livewire::actingAs($user)->test(Settings::class, ['tab' => 'contract'])
->assertSee(__('settings.cancel_scheduled_body_yes', [
'date' => $instance->service_ends_at->local()->isoFormat('LL'),
]));
});
it('fragt auf der Vertragsseite nach, wenn niemand gefragt wurde', function () {
// `null` heißt: vor dieser Ausrollung gekündigt. Der Satz fragt dann,
// statt zu versprechen — und sagt, was passiert, wenn die Frage offen
// bleibt.
[$user, $instance] = kundeMitVorgemerkterKuendigung(null);
Livewire::actingAs($user)->test(Settings::class, ['tab' => 'contract'])
->assertSee(__('settings.cancel_scheduled_body_open', [
'date' => $instance->service_ends_at->local()->isoFormat('LL'),
]))
->assertDontSee(__('settings.cancel_scheduled_body_yes', [
'date' => $instance->service_ends_at->local()->isoFormat('LL'),
]));
});
it('zeigt dem Betreiber, wer einen Export bestellt hat und bis wann', function () {
// W1: ohne diesen Abschnitt hatte ein „Ja" in der ganzen Konsole keinen
// einzigen Leser — ein grep über app/ und die Konsolenansichten fand
// ausserhalb dieses Vorhabens keinen Treffer. Beides muss dastehen: wer,
// und wann dessen Laufzeit endet.
$customer = Customer::factory()->create(['name' => 'Exportkundin GmbH']);
$instance = Instance::factory()->create([
'customer_id' => $customer->id,
'status' => 'cancellation_scheduled',
'subdomain' => 'exportkundin',
'service_ends_at' => now()->addDays(9),
'export_wish' => true,
]);
Livewire::actingAs(admin(), 'operator')->test(AdminInstances::class)
->assertSee(__('admin.export_wish.title'))
->assertSee('Exportkundin GmbH')
->assertSee($instance->service_ends_at->local()->isoFormat('LL'));
});
it('fuehrt in der Konsole niemanden auf, der keinen Export wollte', function () {
// Ein Nein und ein unbeantwortetes Null sind beide keine Bestellung. Der
// Abschnitt erscheint gar nicht erst — ein dauerhaft leerer Kasten wird
// nach der zweiten Woche nicht mehr gelesen. Geprüft an der Überschrift
// und nicht am Kundennamen: der steht ohnehin in der Instanzliste
// darunter, und eine Zusicherung darauf wäre aus dem falschen Grund rot.
$customer = Customer::factory()->create(['name' => 'Neinkundin GmbH']);
Instance::factory()->create([
'customer_id' => $customer->id,
'status' => 'cancellation_scheduled',
'subdomain' => 'neinkundin',
'service_ends_at' => now()->addDays(9),
'export_wish' => false,
]);
Instance::factory()->create([
'status' => 'cancellation_scheduled',
'subdomain' => 'niegefragt',
'service_ends_at' => now()->addDays(9),
]);
Livewire::actingAs(admin(), 'operator')->test(AdminInstances::class)
->assertDontSee(__('admin.export_wish.title'));
});