89 lines
3.8 KiB
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);
|
|
});
|