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); });