create(); $this->actingAs($user) ->get(route('filament.admin.resources.policies.index', filamentTenantRouteParams($unauthorizedTenant))) ->assertNotFound(); }); test('tenant portfolio lists only tenants the user can access', function () { $user = User::factory()->create(); $this->actingAs($user); $authorizedTenant = Tenant::factory()->create([ 'tenant_id' => 'tenant-portfolio-authorized', 'name' => 'Authorized Tenant', ]); $unauthorizedTenant = Tenant::factory()->create([ 'tenant_id' => 'tenant-portfolio-unauthorized', 'name' => 'Unauthorized Tenant', ]); $user->tenants()->syncWithoutDetaching([ $authorizedTenant->getKey() => ['role' => 'owner'], ]); $this->get(route('filament.admin.resources.tenants.index', filamentTenantRouteParams($authorizedTenant))) ->assertOk() ->assertSee($authorizedTenant->name) ->assertDontSee($unauthorizedTenant->name); }); test('tenant portfolio bulk sync dispatches one job per eligible tenant', function () { Bus::fake(); $user = User::factory()->create(); $this->actingAs($user); $tenantA = Tenant::factory()->create(['tenant_id' => 'tenant-bulk-a']); $tenantB = Tenant::factory()->create(['tenant_id' => 'tenant-bulk-b']); $user->tenants()->syncWithoutDetaching([ $tenantA->getKey() => ['role' => 'owner'], $tenantB->getKey() => ['role' => 'operator'], ]); Filament::setTenant($tenantA, true); Livewire::test(ListTenants::class) ->assertTableBulkActionVisible('syncSelected') ->callTableBulkAction('syncSelected', collect([$tenantA, $tenantB])); Bus::assertDispatchedTimes(BulkTenantSyncJob::class, 1); $this->assertDatabaseHas('bulk_operation_runs', [ 'tenant_id' => $tenantA->id, 'user_id' => $user->id, 'resource' => 'tenant', 'action' => 'sync', 'total_items' => 2, ]); }); test('tenant portfolio bulk sync is hidden for readonly users', function () { $user = User::factory()->create(); $this->actingAs($user); $tenant = Tenant::factory()->create(['tenant_id' => 'tenant-bulk-readonly']); $user->tenants()->syncWithoutDetaching([ $tenant->getKey() => ['role' => 'readonly'], ]); Filament::setTenant($tenant, true); Livewire::test(ListTenants::class) ->assertTableBulkActionHidden('syncSelected'); }); test('tenant set event updates user tenant preference last used timestamp', function () { [$user, $tenant] = createUserWithTenant(); TenantSet::dispatch($tenant, $user); $this->assertDatabaseHas('user_tenant_preferences', [ 'user_id' => $user->id, 'tenant_id' => $tenant->id, ]); });