create(); $allowed = Tenant::factory()->active()->create(['name' => 'Allowed']); $onboarding = Tenant::factory()->onboarding()->create([ 'workspace_id' => (int) $allowed->workspace_id, 'name' => 'Onboarding', ]); $archived = Tenant::factory()->archived()->create([ 'workspace_id' => (int) $allowed->workspace_id, 'name' => 'Archived', ]); $user->tenants()->syncWithoutDetaching([ $allowed->getKey() => ['role' => 'readonly'], $onboarding->getKey() => ['role' => 'readonly'], $archived->getKey() => ['role' => 'readonly'], ]); /** @var \Filament\Panel $panel */ $panel = app(PanelRegistry::class)->get('admin'); $tenants = $user->getTenants($panel); expect($tenants)->toHaveCount(1); expect($tenants->first()?->getKey())->toBe($allowed->getKey()); expect($tenants->contains(fn (Tenant $tenant): bool => $tenant->name === 'Onboarding'))->toBeFalse(); expect($tenants->contains(fn (Tenant $tenant): bool => $tenant->name === 'Archived'))->toBeFalse(); }); it('returns no tenants for users without active tenant memberships', function (): void { $user = User::factory()->create(); $draft = Tenant::factory()->draft()->create(['name' => 'Draft']); $archived = Tenant::factory()->archived()->create([ 'workspace_id' => (int) $draft->workspace_id, 'name' => 'Archived', ]); $user->tenants()->syncWithoutDetaching([ $draft->getKey() => ['role' => 'readonly'], $archived->getKey() => ['role' => 'readonly'], ]); /** @var \Filament\Panel $panel */ $panel = app(PanelRegistry::class)->get('admin'); expect($user->getTenants($panel))->toHaveCount(0); }); it('rejects selecting non-active memberships as tenant context', function (): void { $user = User::factory()->create(); $active = Tenant::factory()->active()->create(['name' => 'Allowed']); $onboarding = Tenant::factory()->onboarding()->create([ 'workspace_id' => (int) $active->workspace_id, 'name' => 'Onboarding', ]); $archived = Tenant::factory()->archived()->create([ 'workspace_id' => (int) $active->workspace_id, 'name' => 'Archived', ]); $user->tenants()->syncWithoutDetaching([ $active->getKey() => ['role' => 'readonly'], $onboarding->getKey() => ['role' => 'readonly'], $archived->getKey() => ['role' => 'readonly'], ]); session()->put(WorkspaceContext::SESSION_KEY, (int) $active->workspace_id); Livewire::actingAs($user) ->test(ChooseTenant::class) ->call('selectTenant', $onboarding->getKey()) ->assertStatus(404); Livewire::actingAs($user) ->test(ChooseTenant::class) ->call('selectTenant', $archived->getKey()) ->assertStatus(404); }); it('returns no tenant global-search results when the user lacks any active tenant membership', function (): void { $user = User::factory()->create(); $draft = Tenant::factory()->draft()->create(['name' => 'Search Draft']); $onboarding = Tenant::factory()->onboarding()->create([ 'workspace_id' => (int) $draft->workspace_id, 'name' => 'Search Onboarding', ]); $archived = Tenant::factory()->archived()->create([ 'workspace_id' => (int) $draft->workspace_id, 'name' => 'Search Archived', ]); $user->tenants()->syncWithoutDetaching([ $draft->getKey() => ['role' => 'readonly'], $onboarding->getKey() => ['role' => 'readonly'], $archived->getKey() => ['role' => 'readonly'], ]); $this->actingAs($user); Filament::setCurrentPanel('admin'); Filament::setTenant(null, true); Filament::bootCurrentPanel(); session()->put(WorkspaceContext::SESSION_KEY, (int) $draft->workspace_id); expect(TenantResource::getGlobalSearchResults('Search'))->toHaveCount(0); }); it('does not render onboarding or archived tenants in the header selector on workspace pages', function (): void { $activeTenant = Tenant::factory()->active()->create(['name' => 'Header Active Tenant']); [$user, $activeTenant] = createUserWithTenant(tenant: $activeTenant, role: 'owner'); $onboardingTenant = Tenant::factory()->onboarding()->create([ 'workspace_id' => (int) $activeTenant->workspace_id, 'name' => 'Header Onboarding Tenant', ]); $archivedTenant = Tenant::factory()->archived()->create([ 'workspace_id' => (int) $activeTenant->workspace_id, 'name' => 'Header Archived Tenant', ]); createUserWithTenant(tenant: $onboardingTenant, user: $user, role: 'owner', ensureDefaultMicrosoftProviderConnection: false); createUserWithTenant(tenant: $archivedTenant, user: $user, role: 'owner', ensureDefaultMicrosoftProviderConnection: false); Filament::setTenant(null, true); $this->actingAs($user) ->withSession([WorkspaceContext::SESSION_KEY => (int) $activeTenant->workspace_id]) ->get(route('admin.operations.index')) ->assertSuccessful() ->assertSee('Header Active Tenant') ->assertDontSee('Header Onboarding Tenant') ->assertDontSee('Header Archived Tenant') ->assertSee('No tenant selected'); });