totalGb() + max(0, $planDisk - $planQuota) + ($allowance->packDiskGb() - $allowance->packGb()); expect($target)->toBe(106); }); // Den Schritt selbst fahren: reservedRun() (aus CustomerStepsTest.php) baut ein // 'start'-Paket (100 GB Kontingent, 120 GB Platte — 20 GB Kopfraum des Pakets). // Drei Blöcke zu 20 GB nutzbar / 22 GB belegt kommen direkt als // SubscriptionAddon-Zeile dazu, statt über BookAddon zu buchen — das würde // einen Lieferlauf anstoßen und Stripe befragen, was hier nichts zur Sache tut; // gefragt ist nur, was ResizeVirtualMachine aus einer bereits gebuchten Zeile // macht. // // Ziel: 100 (Kontingent) + 60 (drei Blöcke à 20) + 20 (Kopfraum des Pakets, // 120-100) + 6 (Kopfraum der Blöcke, 66-60 belegt) = 186 GB. it('vergrößert die Platte um Paket- und Block-Kopfraum, und nur einmal', function () { $s = fakeServices(); ['run' => $run, 'instance' => $instance, 'order' => $order] = reservedRun(); SubscriptionAddon::create([ 'subscription_id' => $order->subscription->id, 'addon_key' => AddonCatalogue::STORAGE, 'price_cents' => 1000, 'currency' => 'EUR', 'quantity' => 3, 'booked_at' => now(), 'pack_gb' => 20, 'pack_disk_gb' => 22, ]); expect(app(ResizeVirtualMachine::class)->execute($run)->type)->toBe('advance') ->and($s['pve']->resizeCalls)->toContain('101:scsi0:186G') ->and($instance->fresh()->disk_gb)->toBe(186); // Wiederholungslauf: das Ziel ist absolut, nicht '+…', also darf ein // zweiter Durchlauf nicht noch einmal vergrößern. $s['pve']->resizeCalls = []; expect(app(ResizeVirtualMachine::class)->execute($run->fresh())->type)->toBe('advance') ->and($s['pve']->resizeCalls)->toBe([]) ->and($instance->fresh()->disk_gb)->toBe(186); });