actingAs($owner); Filament::setTenant($tenant, true); Livewire::test(EnvironmentDiagnostics::class) ->assertSee('All good') ->assertActionHidden('bootstrapOwner') ->assertActionHidden('mergeDuplicateMemberships'); }); it('keeps owner bootstrap hidden because workspace roles own role recovery', function () { [$manager, $tenant] = createUserWithTenant(role: 'manager'); $this->actingAs($manager); Filament::setTenant($tenant, true); expect(ManagedEnvironmentMembership::query() ->where('managed_environment_id', (int) $tenant->getKey()) ->where('role', 'owner') ->count())->toBe(0); Livewire::test(EnvironmentDiagnostics::class) ->assertDontSee('Missing owner') ->assertActionHidden('bootstrapOwner'); }); it('shows duplicate-scope repair as disabled for readonly members', function () { [$readonly, $tenant] = createUserWithTenant(role: 'readonly'); $this->actingAs($readonly); Filament::setTenant($tenant, true); Schema::table('managed_environment_memberships', function (Blueprint $table): void { $table->dropUnique(['managed_environment_id', 'user_id']); }); ManagedEnvironmentMembership::query()->create([ 'managed_environment_id' => (int) $tenant->getKey(), 'user_id' => (int) $readonly->getKey(), 'role' => 'readonly', 'source' => 'manual', 'created_by_user_id' => (int) $readonly->getKey(), ]); Livewire::test(EnvironmentDiagnostics::class) ->assertActionVisible('mergeDuplicateMemberships') ->assertActionDisabled('mergeDuplicateMemberships') ->assertActionExists('mergeDuplicateMemberships', function (Action $action): bool { return $action->getTooltip() === UiTooltips::INSUFFICIENT_PERMISSION; }); }); it('merges duplicate memberships for the current user (diagnostics repair)', function () { [$owner, $tenant] = createUserWithTenant(role: 'owner'); $this->actingAs($owner); Filament::setTenant($tenant, true); // Intentionally create a broken state by temporarily dropping the current uniqueness enforcement. Schema::table('managed_environment_memberships', function (Blueprint $table): void { $table->dropUnique(['managed_environment_id', 'user_id']); }); ManagedEnvironmentMembership::query()->create([ 'managed_environment_id' => (int) $tenant->getKey(), 'user_id' => (int) $owner->getKey(), 'role' => 'readonly', 'source' => 'manual', 'created_by_user_id' => (int) $owner->getKey(), ]); expect(ManagedEnvironmentMembership::query() ->where('managed_environment_id', (int) $tenant->getKey()) ->where('user_id', (int) $owner->getKey()) ->count())->toBeGreaterThan(1); Livewire::test(EnvironmentDiagnostics::class) ->assertActionVisible('mergeDuplicateMemberships') ->assertActionEnabled('mergeDuplicateMemberships') ->mountAction('mergeDuplicateMemberships') ->callMountedAction() ->assertSuccessful(); expect(ManagedEnvironmentMembership::query() ->where('managed_environment_id', (int) $tenant->getKey()) ->where('user_id', (int) $owner->getKey()) ->count())->toBe(1); expect(AuditLog::query() ->where('managed_environment_id', (int) $tenant->getKey()) ->where('action', AuditActionId::TenantMembershipDuplicatesMerged->value) ->exists())->toBeTrue(); }); });