From b95cae16698e948f2ead5fa9adea7f76bbe9b265 Mon Sep 17 00:00:00 2001 From: nexxo Date: Sat, 1 Aug 2026 18:04:28 +0200 Subject: [PATCH] =?UTF-8?q?Test=20f=C3=BCr=20den=20Normalfall=20der=20Stat?= =?UTF-8?q?usanzeige:=20"Im=20Verkauf"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drei der vier Zustände waren belegt, der häufigste nicht. Eine reine assertSee() wäre nicht falsifizierbar gewesen: die Spaltenüberschrift "plans.live_version" übersetzt zufällig auf denselben Satz wie die Plakette "plans.on_sale" und stünde selbst dann auf der Seite, wenn keine Zeile die Plakette zeigte — deshalb über die Häufigkeit geprüft (Überschrift kommt genau einmal vor, mehr als das beweist eine echte Zeile). Mit einer Mutation (sellable-Prüfung stumpf auf false) probeweise als rot bestätigt, dann zurückgesetzt. Co-Authored-By: Claude Opus 5 --- tests/Feature/Admin/PlanAdminTest.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/Feature/Admin/PlanAdminTest.php b/tests/Feature/Admin/PlanAdminTest.php index 05234bd..26a3ea0 100644 --- a/tests/Feature/Admin/PlanAdminTest.php +++ b/tests/Feature/Admin/PlanAdminTest.php @@ -385,6 +385,32 @@ it('lists a withdrawn plan as withdrawn, not as missing', function () { ->assertSee(__('plans.withdrawn_badge')); }); +it('shows a normal sellable plan as on sale', function () { + // Der Normalfall — auf den meisten Zeilen der Fall — hatte bisher keinen + // eigenen Test: die drei anderen Zustände sind unten belegt, dieser nicht. + // Bräche $selling oder die erste Bedingung im match(true), verschwände ein + // verkäufliches Paket unbemerkt aus der Liste, und ausgerechnet der + // häufigste Zustand wäre der einzige ungeprüfte. + // + // Business hängt hier nicht zufällig im Verkauf: geprüft wird, dass es + // weder internal noch zurückgezogen ist und tatsächlich in sellable() + // steht — der echte Normalfall, kein Schalter extra dafür umgelegt. + $business = PlanFamily::query()->where('key', 'business')->sole(); + expect($business->internal)->toBeFalse() + ->and($business->sales_enabled)->toBeTrue() + ->and(array_keys(app(PlanCatalogue::class)->sellable()))->toContain('business'); + + $html = Livewire::actingAs(owner(), 'operator')->test(Plans::class)->html(); + + // assertSee(__('plans.on_sale')) allein bewiese nichts: die Spaltenüber- + // schrift ("plans.live_version") übersetzt zufällig auf denselben Satz + // "Im Verkauf" und stünde selbst dann auf der Seite, wenn keine einzige + // Zeile die Plakette zeigte. Die Überschrift kommt genau einmal vor — + // mehr als das beweist, dass mindestens eine Zeile die Plakette selbst + // trägt. + expect(substr_count($html, __('plans.on_sale')))->toBeGreaterThan(1); +}); + it('shows an internal plan as console-only, not as nothing available', function () { // Intern (`test`) ist internal=true mit einer laufenden Version — die // Liste fragte bisher nur "steht die Familie im Verkaufskatalog?" und