feat: revenue cat
This commit is contained in:
@@ -1,20 +1,16 @@
|
||||
<?php
|
||||
|
||||
use App\Actions\ReviewIdentityVerification;
|
||||
use App\Enums\BillingProductPurpose;
|
||||
use App\Enums\IdentityVerificationStatus;
|
||||
use App\Enums\PaymentTransactionStatus;
|
||||
use App\Enums\UserRole;
|
||||
use App\Filament\Resources\IdentityVerificationRequests\Pages\ListIdentityVerificationRequests;
|
||||
use App\Listeners\HandleStripeWebhook;
|
||||
use App\Models\BillingProduct;
|
||||
use App\Models\IdentityVerificationRequest;
|
||||
use App\Models\PaymentTransaction;
|
||||
use App\Models\User;
|
||||
use App\Policies\IdentityVerificationRequestPolicy;
|
||||
use Filament\Facades\Filament;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Laravel\Sanctum\Sanctum;
|
||||
use Livewire\Livewire;
|
||||
@@ -168,46 +164,34 @@ it('lets an administrator approve the identity request from filament', function
|
||||
->and($user->fresh()->account_verified_at)->not->toBeNull();
|
||||
});
|
||||
|
||||
it('grants lifetime certification entitlement from the paid Stripe webhook once', function () {
|
||||
$user = User::factory()->create([
|
||||
'stripe_id' => 'cus_certification',
|
||||
]);
|
||||
$product = BillingProduct::create([
|
||||
'name' => 'Certification',
|
||||
'purpose' => BillingProductPurpose::CERTIFICATION,
|
||||
'amount' => 1999,
|
||||
'currency' => 'eur',
|
||||
'stripe_price_id' => 'price_certification',
|
||||
]);
|
||||
$event = (object) [
|
||||
'payload' => [
|
||||
'id' => 'evt_certification',
|
||||
'type' => 'checkout.session.completed',
|
||||
'data' => [
|
||||
'object' => [
|
||||
'id' => 'cs_certification',
|
||||
'mode' => 'payment',
|
||||
'payment_status' => 'paid',
|
||||
'customer' => $user->stripe_id,
|
||||
'payment_intent' => 'pi_certification',
|
||||
'amount_total' => 1999,
|
||||
'currency' => 'eur',
|
||||
'metadata' => [
|
||||
'billing_product_id' => $product->getKey(),
|
||||
'billing_product_purpose' => BillingProductPurpose::CERTIFICATION->value,
|
||||
it('grants the lifetime certification entitlement from RevenueCat without a trial', function () {
|
||||
config()->set('billing.revenuecat.secret_key', 'rc-secret');
|
||||
config()->set('billing.revenuecat.certification_entitlement', 'certification');
|
||||
$user = User::factory()->create();
|
||||
$purchaseDate = now()->subDay()->startOfSecond();
|
||||
Sanctum::actingAs($user);
|
||||
|
||||
Http::fake([
|
||||
"api.revenuecat.com/v1/subscribers/{$user->id}" => Http::response([
|
||||
'subscriber' => [
|
||||
'entitlements' => [
|
||||
'certification' => [
|
||||
'expires_date' => null,
|
||||
'grace_period_expires_date' => null,
|
||||
'product_identifier' => 'lifetime',
|
||||
'purchase_date' => $purchaseDate->toISOString(),
|
||||
],
|
||||
],
|
||||
'subscriptions' => [],
|
||||
],
|
||||
],
|
||||
];
|
||||
]),
|
||||
]);
|
||||
|
||||
$listener = app(HandleStripeWebhook::class);
|
||||
$listener->handle($event);
|
||||
$firstPurchaseDate = $user->fresh()->certification_purchased_at;
|
||||
$listener->handle($event);
|
||||
$this->postJson('/api/billing/sync')
|
||||
->assertOk()
|
||||
->assertJsonPath('data.certificationPurchased', true)
|
||||
->assertJsonPath('data.analysisAccessLevel', 'free');
|
||||
|
||||
expect($firstPurchaseDate)->not->toBeNull()
|
||||
->and($user->fresh()->certification_purchased_at?->equalTo($firstPurchaseDate))->toBeTrue()
|
||||
->and(PaymentTransaction::query()->count())->toBe(1)
|
||||
->and(PaymentTransaction::query()->sole()->status)->toBe(PaymentTransactionStatus::PAID);
|
||||
expect($user->fresh()->certification_purchased_at?->equalTo($purchaseDate))->toBeTrue()
|
||||
->and($user->fresh()->subscription_is_trial)->toBeFalse();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user