feat: admin-managed roles and hotel codes

This commit is contained in:
Björn Fromme
2026-08-10 10:07:24 +02:00
parent 124c0af0f5
commit 6c1073e41c
19 changed files with 718 additions and 34 deletions
+81
View File
@@ -0,0 +1,81 @@
<?php
declare(strict_types=1);
namespace App\Tests\Form\Admin;
use App\Entity\User;
use App\Form\Admin\UserType;
use App\Security\Role;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Forms;
class UserTypeTest extends TestCase
{
public function testStoredRolesArePreselectedWithoutTheImplicitRoleUser(): void
{
$user = (new User('[email protected]'))->setRoles([Role::TEAMER]);
self::assertSame([Role::TEAMER], $this->createForm($user)->get('roles')->getData());
}
public function testSubmittingRolesDoesNotStoreTheImplicitRoleUser(): void
{
$user = (new User('[email protected]'))->setRoles([Role::TEAMER]);
$form = $this->createForm($user);
$form->submit(['roles' => [Role::TEAMER, Role::GROUPS_MANAGER], 'hotelCodes' => []]);
self::assertTrue($form->isSynchronized());
// getRoles() prepends ROLE_USER; it must not have been persisted a second time.
self::assertSame(['ROLE_USER', Role::TEAMER, Role::GROUPS_MANAGER], $user->getRoles());
}
public function testClearingEveryCheckboxEmptiesTheAssignment(): void
{
$user = (new User('[email protected]'))
->setRoles([Role::TEAMER])
->setHotelCodes(['SSL'])
;
$form = $this->createForm($user);
$form->submit([]);
self::assertTrue($form->isSynchronized());
self::assertSame(['ROLE_USER'], $user->getRoles());
self::assertSame([], $user->getHotelCodes());
}
public function testHotelCodeMissingFromTheCatalogSurvivesAnEdit(): void
{
$user = (new User('[email protected]'))->setHotelCodes(['SSL', 'XYZ']);
$form = $this->createForm($user);
$form->submit(['roles' => [], 'hotelCodes' => ['SSL', 'XYZ']]);
self::assertTrue($form->isSynchronized());
self::assertSame(['SSL', 'XYZ'], $user->getHotelCodes());
}
public function testHotelCodesAreOfferedAlphabetically(): void
{
$user = (new User('[email protected]'))->setHotelCodes(['ASB']);
$choices = $this->createForm($user)->get('hotelCodes')->getConfig()->getOption('choices');
self::assertSame(['ASB', 'DKS', 'SSL'], array_values($choices));
}
/**
* @return FormInterface<User>
*/
private function createForm(User $user): FormInterface
{
return Forms::createFormFactoryBuilder()
->addType(new UserType(['SSL' => 'SSL', 'DKS' => 'DKS']))
->getFormFactory()
->create(UserType::class, $user)
;
}
}
@@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
namespace App\Tests\Form\Model\Filter;
use App\Form\Model\Filter\UserFilterDto;
use App\Security\Role;
use PHPUnit\Framework\TestCase;
class UserFilterDtoTest extends TestCase
{
public function testTheRoleChipShowsTheLabelRatherThanTheRoleName(): void
{
$filter = new UserFilterDto();
$filter->role = Role::GROUPS_ADMIN;
$chip = $filter->activeFilters()[0];
self::assertSame('Rolle', $chip->label);
self::assertSame('Preisrechner Admin', $chip->value);
self::assertSame(['role'], $chip->removeKeys);
}
public function testAnUnknownRoleIsShownVerbatim(): void
{
$filter = new UserFilterDto();
$filter->role = 'ROLE_LEGACY';
self::assertSame('ROLE_LEGACY', $filter->activeFilters()[0]->value);
}
public function testNoRoleMeansNoChip(): void
{
self::assertSame([], (new UserFilterDto())->activeFilters());
}
}