api/tests/Feature/UserFilamentRoleTest.php

105 lines
3.0 KiB
PHP

<?php
use App\Enums\UserRole;
use App\Filament\Resources\Users\Pages\EditUser;
use App\Filament\Resources\Users\Pages\ListUsers;
use App\Filament\Resources\Users\Pages\ViewUser;
use App\Models\User;
use Filament\Facades\Filament;
use Filament\Forms\Components\Select;
use Filament\Infolists\Components\TextEntry;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;
uses(RefreshDatabase::class);
beforeEach(function () {
app()->setLocale('fr');
Filament::setCurrentPanel(Filament::getPanel('dashboard'));
});
it('exposes translated user roles in filament user screens', function () {
$admin = User::factory()->create([
'role' => UserRole::ADMIN,
]);
$user = User::factory()->create([
'role' => UserRole::MODERATOR,
]);
$this->actingAs($admin);
$expectedOptions = [
'user' => 'Utilisateur',
'admin' => 'Administrateur',
'moderator' => 'Modérateur',
];
Livewire::test(EditUser::class, ['record' => $user->getKey()])
->assertFormFieldExists(
'role',
null,
fn (Select $field): bool => $field->getLabel() === 'Rôle'
&& $field->getOptions() === $expectedOptions,
);
Livewire::test(ViewUser::class, ['record' => $user->getKey()])
->assertSchemaComponentExists(
'role',
'infolist',
fn (TextEntry $entry): bool => $entry->getLabel() === 'Rôle',
);
Livewire::test(ListUsers::class)
->assertTableColumnExists(
'role',
fn (TextColumn $column): bool => $column->getLabel() === 'Rôle',
)
->assertTableFilterExists(
'role',
fn (SelectFilter $filter): bool => $filter->getLabel() === 'Rôle'
&& $filter->getOptions() === $expectedOptions,
);
});
it('changes a user role by id with the artisan command', function () {
$user = User::factory()->create([
'role' => UserRole::USER,
]);
$this->artisan('user:change-role', [
'userId' => $user->getKey(),
'role' => UserRole::ADMIN->value,
])
->expectsOutput("User {$user->getKey()} role changed to admin.")
->assertExitCode(0);
expect($user->fresh()->role)->toBe(UserRole::ADMIN);
});
it('rejects an invalid user role', function () {
$user = User::factory()->create([
'role' => UserRole::USER,
]);
$this->artisan('user:change-role', [
'userId' => $user->getKey(),
'role' => 'owner',
])
->expectsOutput('Invalid role. Available roles: user, admin, moderator.')
->assertExitCode(1);
expect($user->fresh()->role)->toBe(UserRole::USER);
});
it('rejects an unknown user id', function () {
$this->artisan('user:change-role', [
'userId' => '01J00000000000000000000000',
'role' => UserRole::ADMIN->value,
])
->expectsOutput('User not found.')
->assertExitCode(1);
});