$event->level, 'message' => $event->message, 'context' => $event->context, ]; }); $package = Package::factory()->reseller()->create(); TenantPackage::factory()->create([ 'tenant_id' => $this->tenant->id, 'package_id' => $package->id, 'lemonsqueezy_subscription_id' => 'sub_123', 'active' => true, ]); $subscriptions = Mockery::mock(LemonSqueezySubscriptionService::class); $subscriptions->shouldReceive('retrieve') ->once() ->with('sub_123') ->andThrow(new LemonSqueezyException('Not found', 404, [ 'errors' => [ [ 'code' => 'entity_not_found', 'detail' => 'Not found', ], ], 'meta' => [ 'request_id' => 'req_123', ], ])); $this->instance(LemonSqueezySubscriptionService::class, $subscriptions); $response = $this->authenticatedRequest('POST', '/api/v1/tenant/billing/portal'); $response->assertStatus(502) ->assertJson([ 'message' => 'Failed to fetch Lemon Squeezy subscription portal URL.', ]); $matched = collect($logged)->contains(function (array $entry): bool { return $entry['level'] === 'warning' && $entry['message'] === 'Failed to fetch Lemon Squeezy subscription portal URL' && ($entry['context']['tenant_id'] ?? null) === $this->tenant->id && ($entry['context']['lemonsqueezy_status'] ?? null) === 404 && (($entry['context']['lemonsqueezy_error']['code'] ?? null) === 'entity_not_found'); }); $this->assertTrue($matched); } }