'sk_test_simulated','services.stripe.webhook_secret'=>'whsec_audit']); $mock = new class implements Stripe\HttpClient\ClientInterface { public array $requests=[]; public function request($method,$absUrl,$headers,$params,$hasFile,$apiMode='v1',$maxNetworkRetries=null) { $this->requests[]=$params; $id='cs_simulated_'.count($this->requests); return [json_encode(['id'=>$id,'object'=>'checkout.session','url'=>'https://checkout.stripe.com/'.$id]),200,[]]; } }; Stripe\ApiRequestor::setHttpClient($mock); try { $defaults=(new ReflectionMethod(App\Http\Controllers\BillingController::class,'defaultPlans')); $defaults->setAccessible(true); foreach($defaults->invoke(new App\Http\Controllers\BillingController()) as $data) { $plan=Plan::create($data); $user=User::factory()->create(['credits'=>2,'pet_limit'=>1,'extra_pet_slots'=>0,'plan_slug'=>'free']); $this->actingAs($user); $response=$this->withSession(['_token'=>'audit_csrf'])->post(route('billing.checkout',$plan), ['_token'=>'audit_csrf']); $response->assertRedirect(); if ($plan->price_cents===0) { $this->assertSame('free',$user->fresh()->plan_slug); $this->assertSame(5,$user->fresh()->credits); $this->assertSame(1,$user->fresh()->totalPetLimit()); } else { $params=end($mock->requests); $this->assertSame($plan->slug==='premium'?'subscription':'payment',$params['mode']); $this->assertSame($plan->price_cents,$params['line_items'][0]['price_data']['unit_amount']); $payment=$user->payments()->firstOrFail(); $this->assertSame('pending',$payment->status); $this->assertSame(2,$user->fresh()->credits); $payload=json_encode(['id'=>'evt_'.$plan->slug,'type'=>'checkout.session.completed','data'=>['object'=>['id'=>$payment->stripe_checkout_session_id,'payment_status'=>'paid']]]); $timestamp=time(); $sig=hash_hmac('sha256',$timestamp.'.'.$payload,'whsec_audit'); for($i=0;$i<2;$i++) $this->call('POST',route('stripe.webhook'),[],[],[],['HTTP_STRIPE_SIGNATURE'=>"t=$timestamp,v1=$sig"],$payload)->assertOk(); $user->refresh(); $this->assertSame('paid',$payment->fresh()->status); if($plan->type==='credit_topup') $this->assertSame(12,$user->credits); elseif($plan->type==='pet_topup') $this->assertSame(2,$user->totalPetLimit()); else { $this->assertSame($plan->slug,$user->plan_slug); $this->assertSame($plan->pet_limit,$user->totalPetLimit()); $this->assertSame($plan->credits,$user->credits); $this->assertSame($plan->slug==='ltv',$user->ltv_active); } } fwrite(STDOUT,"Verified: {$plan->name}\n"); } } finally { Stripe\ApiRequestor::setHttpClient(new Stripe\HttpClient\CurlClient()); } } }