actingAs($user); $tenant->makeCurrent(); Filament::setTenant($tenant, true); $connection = ProviderConnection::factory()->create([ 'tenant_id' => (int) $tenant->getKey(), 'provider' => 'microsoft', 'status' => 'connected', 'is_default' => true, ]); Livewire::test(EditProviderConnection::class, ['record' => $connection->getRouteKey()]) ->callAction('check_connection'); $run = OperationRun::query() ->where('tenant_id', (int) $tenant->getKey()) ->where('type', 'provider.connection.check') ->latest('id') ->first(); expect($run)->not->toBeNull() ->and($run?->outcome)->toBe('blocked') ->and($run?->context['reason_code'] ?? null)->toBe(ProviderReasonCodes::ProviderCredentialMissing); $notifications = collect(session('filament.notifications', [])); expect($notifications)->not->toBeEmpty(); $last = $notifications->last(); expect((string) ($last['body'] ?? ''))->toContain(ProviderReasonCodes::ProviderCredentialMissing); $labels = collect($last['actions'] ?? [])->pluck('label')->values()->all(); expect($labels)->toContain('Manage Provider Connections'); Queue::assertNothingPushed(); Queue::assertNotPushed(ProviderConnectionHealthCheckJob::class); }); it('Spec081 shows blocked guidance on tenant verify surface with manage-connections remediation link', function (): void { [$user, $tenant] = createUserWithTenant(role: 'operator'); $this->actingAs($user); $tenant->makeCurrent(); Filament::setTenant($tenant, true); Livewire::test(ViewTenant::class, ['record' => $tenant->getRouteKey()]) ->callAction('verify'); $notifications = collect(session('filament.notifications', [])); expect($notifications)->not->toBeEmpty(); $last = $notifications->last(); expect((string) ($last['title'] ?? ''))->toContain('Verification blocked'); expect((string) ($last['body'] ?? ''))->toContain(ProviderReasonCodes::ProviderConnectionMissing); $labels = collect($last['actions'] ?? [])->pluck('label')->values()->all(); expect($labels)->toContain('Manage Provider Connections'); });