75 lines
3.0 KiB
PHP
75 lines
3.0 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;
|
|
|
|
function billingSetup(string $plan = 'start'): array
|
|
{
|
|
$user = User::factory()->create(['email' => 'k@billing.test', 'is_admin' => false]);
|
|
$customer = Customer::factory()->create(['email' => 'k@billing.test']);
|
|
$order = Order::factory()->create(['customer_id' => $customer->id, 'plan' => $plan]);
|
|
Instance::factory()->create(['customer_id' => $customer->id, 'order_id' => $order->id, 'plan' => $plan, 'status' => 'active']);
|
|
|
|
// Several of these tests call Billing::purchase(), which since Task 5
|
|
// refuses outright without a Stripe key for the active mode.
|
|
withStripeSecret();
|
|
|
|
return compact('user', 'customer');
|
|
}
|
|
|
|
it('gates billing to authenticated users', function () {
|
|
$this->get(route('billing'))->assertRedirect('/login');
|
|
});
|
|
|
|
it('shows the current plan and offers upgrades', function () {
|
|
['user' => $user] = billingSetup('start');
|
|
|
|
Livewire::actingAs($user)->test(Billing::class)
|
|
->assertSee(__('billing.plan.start'))
|
|
->assertSee(__('billing.plan.team')) // upgrade card
|
|
->assertSee(__('billing.storage_title'));
|
|
});
|
|
|
|
it('records an upgrade purchase intent', function () {
|
|
['user' => $user, 'customer' => $customer] = billingSetup('start');
|
|
|
|
Livewire::actingAs($user)->test(Billing::class)->call('purchase', 'upgrade', 'team');
|
|
|
|
$order = Order::query()->where('customer_id', $customer->id)->where('type', 'upgrade')->first();
|
|
expect($order)->not->toBeNull()
|
|
->and($order->plan)->toBe('team')
|
|
->and($order->status)->toBe('pending')
|
|
->and($order->amount_cents)->toBe(17900);
|
|
});
|
|
|
|
it('records a storage and an addon purchase intent', function () {
|
|
['user' => $user, 'customer' => $customer] = billingSetup('start');
|
|
|
|
Livewire::actingAs($user)->test(Billing::class)->call('purchase', 'storage');
|
|
Livewire::actingAs($user)->test(Billing::class)->call('purchase', 'addon', 'priority_support');
|
|
|
|
expect(Order::query()->where('customer_id', $customer->id)->where('type', 'storage')->exists())->toBeTrue();
|
|
$addon = Order::query()->where('customer_id', $customer->id)->where('type', 'addon')->first();
|
|
expect($addon?->addon_key)->toBe('priority_support');
|
|
});
|
|
|
|
it('rejects a downgrade disguised as an upgrade', function () {
|
|
['user' => $user, 'customer' => $customer] = billingSetup('business');
|
|
|
|
Livewire::actingAs($user)->test(Billing::class)->call('purchase', 'upgrade', 'start');
|
|
|
|
expect(Order::query()->where('customer_id', $customer->id)->where('type', 'upgrade')->exists())->toBeFalse();
|
|
});
|
|
|
|
it('rejects an unknown addon key', function () {
|
|
['user' => $user, 'customer' => $customer] = billingSetup('start');
|
|
|
|
Livewire::actingAs($user)->test(Billing::class)->call('purchase', 'addon', 'ghost');
|
|
|
|
expect(Order::query()->where('customer_id', $customer->id)->where('type', 'addon')->exists())->toBeFalse();
|
|
});
|