. */ namespace App\Tests\Services\UserSystem; use App\Entity\UserSystem\PermissionData; use App\Security\Interfaces\HasPermissionsInterface; use App\Services\UserSystem\PermissionSchemaUpdater; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class TestPermissionHolder implements HasPermissionsInterface { public function __construct(private readonly PermissionData $perm_data) { } public function getPermissions(): PermissionData { return $this->perm_data; } } class PermissionSchemaUpdaterTest extends WebTestCase { /** * @var PermissionSchemaUpdater */ protected $service; public function setUp(): void { self::bootKernel(); $this->service = self::getContainer()->get(PermissionSchemaUpdater::class); } public function testIsSchemaUpdateNeeded(): void { $perm_data = new PermissionData(); $perm_data->setSchemaVersion(0); $user = new TestPermissionHolder($perm_data); //With schema version 0, an update should be needed self::assertTrue($this->service->isSchemaUpdateNeeded($user)); //With a very high scheme number no update should be needed $perm_data->setSchemaVersion(123456); self::assertFalse($this->service->isSchemaUpdateNeeded($user)); } public function testUpgradeSchema(): void { $perm_data = new PermissionData(); $perm_data->setSchemaVersion(0); $user = new TestPermissionHolder($perm_data); //With schema version 0, an update should be done and the schema version should be updated self::assertTrue($this->service->upgradeSchema($user)); self::assertSame(PermissionData::CURRENT_SCHEMA_VERSION, $user->getPermissions()->getSchemaVersion()); //If we redo it with the same schema version, no update should be done self::assertFalse($this->service->upgradeSchema($user)); } public function testUpgradeSchemaToVersion1(): void { $perm_data = new PermissionData(); $perm_data->setSchemaVersion(0); $perm_data->setPermissionValue('parts', 'edit', PermissionData::ALLOW); $user = new TestPermissionHolder($perm_data); //Do an upgrade and afterward the move, add, and withdraw permissions should be set to ALLOW self::assertTrue($this->service->upgradeSchema($user, 1)); self::assertEquals(PermissionData::ALLOW, $user->getPermissions()->getPermissionValue('parts_stock', 'move')); self::assertEquals(PermissionData::ALLOW, $user->getPermissions()->getPermissionValue('parts_stock', 'add')); self::assertEquals(PermissionData::ALLOW, $user->getPermissions()->getPermissionValue('parts_stock', 'withdraw')); } public function testUpgradeSchemaToVersion2(): void { $perm_data = new PermissionData(); $perm_data->setSchemaVersion(1); $perm_data->setPermissionValue('devices', 'read', PermissionData::ALLOW); $perm_data->setPermissionValue('devices', 'edit', PermissionData::INHERIT); $perm_data->setPermissionValue('devices', 'delete', PermissionData::DISALLOW); $user = new TestPermissionHolder($perm_data); //After the upgrade all operations should be available under the name "projects" with the same values self::assertTrue($this->service->upgradeSchema($user, 2)); self::assertEquals(PermissionData::ALLOW, $user->getPermissions()->getPermissionValue('projects', 'read')); self::assertEquals(PermissionData::INHERIT, $user->getPermissions()->getPermissionValue('projects', 'edit')); self::assertEquals(PermissionData::DISALLOW, $user->getPermissions()->getPermissionValue('projects', 'delete')); } public function testUpgradeSchemaToVersion3(): void { $perm_data = new PermissionData(); $perm_data->setSchemaVersion(2); $perm_data->setPermissionValue('system', 'server_infos', PermissionData::ALLOW); $user = new TestPermissionHolder($perm_data); //After the upgrade the server.show_updates should be set to ALLOW self::assertTrue($this->service->upgradeSchema($user, 3)); self::assertSame(PermissionData::ALLOW, $user->getPermissions()->getPermissionValue('system', 'show_updates')); } }