CluPilotCloud/tests/Feature/Billing/ExtraBackupsNotSoldTest.php

89 lines
3.8 KiB
PHP

<?php
use App\Livewire\Billing;
use App\Models\Customer;
use App\Models\Instance;
use App\Models\Order;
use App\Models\User;
use Livewire\Livewire;
/**
* Der zweite Sicherungsort liefert nicht — siehe App\Support\OpenWork::all()
* — aus demselben Riegel wie Office (tests/Feature/Billing/OfficeNotSoldTest.php),
* an derselben Stelle erweitert: AddonCatalogue::saleRefusal() weist jetzt
* auch `extra_backups` ab, solange AddonCatalogue::EXTRA_BACKUPS_ON_SALE
* false ist, und wird hier an denselben zwei Enden geprüft — der Kauf selbst
* (am Formular vorbei, nicht nur "der Knopf fehlt") und die Karte, die ihn
* anbieten würde.
*
* Eigene Datei statt eines Anhängsels an OfficeNotSoldTest.php: die beiden
* Module werden aus verschiedenen Gründen gesperrt (Office fehlt ganz, hier
* fehlt nur der zweite ORT) und mit verschiedenen Sätzen abgewiesen — zwei
* Module, zwei Prüfungen. Nur die Prüfung, dass die ÜBRIGEN Module unberührt
* bleiben, sitzt weiterhin allein in OfficeNotSoldTest.php, um nicht
* zweimal geprüft zu werden.
*/
function backupsShopper(string $plan = 'team'): array
{
$customer = Customer::factory()->create();
$user = User::factory()->create(['email' => $customer->email]);
$order = Order::factory()->withSubscription()->for($customer)->create(['plan' => $plan]);
$instance = Instance::factory()->for($customer)->create([
'order_id' => $order->id,
'plan' => $plan,
'status' => 'active',
]);
$order->subscription->update(['instance_id' => $instance->id]);
// purchase() refuses outright without a Stripe key for the active mode
// (Task 5) — the refusal this test is about must not be masked by that
// earlier one.
withStripeSecret();
return [$customer, $user];
}
it('weist eine Buchung von extra_backups am Formular vorbei ab, solange der zweite Ort fehlt', function () {
// Absichtlich NICHT über einen fehlenden Knopf geprüft: das würde nur
// zeigen, dass die Anzeige geschlossen ist. Dieser Aufruf geht am
// Formular vorbei — genau der Weg, den ein zweites Browser-Fenster, eine
// alte Sitzung oder ein direkter Aufruf des Komponentennamens auch nähme.
[$customer, $user] = backupsShopper('team');
Livewire::actingAs($user)->test(Billing::class)
->call('purchase', 'addon', 'extra_backups')
->assertDispatched('notify', message: __('billing.addon_second_location_not_on_sale', [
'module' => __('billing.addon.extra_backups.name'),
]));
// Kein Auftrag, also nichts, das später fälschlich zur Buchung würde.
expect(Order::query()->where('customer_id', $customer->id)->where('type', 'addon')->exists())->toBeFalse();
});
it('zeigt die Sicherungsort-Karte im Portal nicht mehr an, solange sie ohnehin abgewiesen würde', function () {
[, $user] = backupsShopper('team');
Livewire::actingAs($user)->test(Billing::class)
->assertDontSee(__('billing.addon.extra_backups.name'));
});
it('weist eine andere Meldung ab als Office, weil hier nur der zweite Ort fehlt', function () {
// Der eigentliche Punkt der Erweiterung: nicht derselbe Satz mit
// ausgetauschtem Modulnamen, sondern ein anderer Grund. Wer nach dem
// zweiten Ort fragt, soll erfahren, dass seine Daten sehr wohl täglich
// gesichert werden — nur eben noch an einem Ort.
[, $user] = backupsShopper('team');
$officeMessage = __('billing.addon_not_on_sale', [
'module' => __('billing.addon.collabora_pro.name'),
]);
Livewire::actingAs($user)->test(Billing::class)
->call('purchase', 'addon', 'extra_backups')
->assertDispatched('notify', message: __('billing.addon_second_location_not_on_sale', [
'module' => __('billing.addon.extra_backups.name'),
]))
->assertNotDispatched('notify', message: $officeMessage);
});