url(); if (str_contains($url, '/customers') && $request->method() === 'POST' && ! str_contains($url, '/portal-sessions')) { return Http::response([ 'data' => ['id' => 'cus_123'], ], 200); } if (str_contains($url, '/portal-sessions') && $request->method() === 'POST') { return Http::response([ 'data' => [ 'urls' => [ 'general' => [ 'overview' => 'https://portal.example/overview', ], ], ], ], 200); } return Http::response([], 404); }); $this->tenant->forceFill(['paddle_customer_id' => null])->save(); $response = $this->authenticatedRequest('POST', '/api/v1/tenant/billing/portal'); $response->assertOk(); $response->assertJsonPath('url', 'https://portal.example/overview'); Http::assertSent(function (Request $request): bool { $url = $request->url(); return $request->hasHeader('Paddle-Version', '1') && str_contains($url, '/portal-sessions') && $request->body() === '{}'; }); $this->assertDatabaseHas('tenants', [ 'id' => $this->tenant->id, 'paddle_customer_id' => 'cus_123', ]); } public function test_tenant_can_reuse_existing_paddle_customer_when_customer_already_exists(): void { Http::fake(function (Request $request) { $url = $request->url(); if (str_contains($url, '/customers') && $request->method() === 'POST' && ! str_contains($url, '/portal-sessions')) { return Http::response([ 'error' => [ 'type' => 'request_error', 'code' => 'customer_already_exists', 'message' => 'Customer already exists.', ], ], 409); } if (str_contains($url, '/customers') && $request->method() === 'GET') { return Http::response([ 'data' => [ ['id' => 'cus_existing'], ], ], 200); } if (str_contains($url, '/portal-sessions') && $request->method() === 'POST') { return Http::response([ 'data' => [ 'urls' => [ 'general' => [ 'overview' => 'https://portal.example/overview', ], ], ], ], 200); } return Http::response([], 404); }); $this->tenant->forceFill(['paddle_customer_id' => null])->save(); $response = $this->authenticatedRequest('POST', '/api/v1/tenant/billing/portal'); $response->assertOk(); $response->assertJsonPath('url', 'https://portal.example/overview'); $this->assertDatabaseHas('tenants', [ 'id' => $this->tenant->id, 'paddle_customer_id' => 'cus_existing', ]); } }