set('billing.enforce_booking', true); }); test('without the enforce flag everyone counts as booked', function () { config()->set('billing.enforce_booking', false); expect(User::factory()->create()->hasActiveBooking())->toBeTrue(); }); test('a user without any booking is rejected when the gate is enforced', function () { expect(User::factory()->create()->hasActiveBooking())->toBeFalse(); }); test('an active cashier subscription counts as booking', function () { $user = User::factory()->create(); $user->subscriptions()->create([ 'type' => 'default', 'stripe_id' => 'sub_test_123', 'stripe_status' => 'active', 'stripe_price' => 'price_test', 'quantity' => 1, ]); expect($user->hasActiveBooking())->toBeTrue(); }); test('a paid unconsumed single purchase counts as booking', function () { $user = User::factory()->create(); SinglePurchase::factory()->paid()->create(['user_id' => $user->id]); expect($user->hasActiveBooking())->toBeTrue(); }); test('a consumed single purchase does not count as booking', function () { $user = User::factory()->create(); SinglePurchase::factory()->consumed()->create(['user_id' => $user->id]); expect($user->hasActiveBooking())->toBeFalse(); }); test('an active legacy payment agreement counts as booking (manual circle)', function () { $user = User::factory()->create(); UserPaymentOption::factory()->create([ 'user_id' => $user->id, 'payment_option_id' => PaymentOption::factory()->create()->id, 'status' => UserPaymentOptionStatus::Active->value, 'stripe_subscription_id' => null, ]); expect($user->hasActiveBooking())->toBeTrue(); }); test('a cancelled legacy agreement does not count as booking', function () { $user = User::factory()->create(); UserPaymentOption::factory()->create([ 'user_id' => $user->id, 'payment_option_id' => PaymentOption::factory()->create()->id, 'status' => UserPaymentOptionStatus::Cancelled->value, 'stripe_subscription_id' => null, ]); expect($user->hasActiveBooking())->toBeFalse(); });