Test für den Normalfall der Statusanzeige: "Im Verkauf"

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 <noreply@anthropic.com>
feat/neue-pakete
nexxo 2026-08-01 18:04:28 +02:00
parent 6314bb60fb
commit b95cae1669
1 changed files with 26 additions and 0 deletions

View File

@ -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