snapshot of https://github.com/espocrm/espocrm.git (master, 2026-09-18; blobs > 131072B omitted)
Some checks failed
Test / Test on PHP 8.3 (push) Failing after 5s
Test / Test on PHP 8.4 (push) Failing after 4s
Test / Test on PHP 8.5 (push) Failing after 3s
TypeScript static analysis / TypeScript check (push) Failing after 14s
Test Integration on MySQL / Test on PHP 8.3 (push) Failing after 2s
Test Integration on MySQL / Test on PHP 8.5 (push) Failing after 0s
Test Integration on PostgreSQL / Test on PHP 8.4 fix (push) Failing after 1s
Test Integration on PostgreSQL / Test on PHP 8.4 master (push) Failing after 1s
Some checks failed
Test / Test on PHP 8.3 (push) Failing after 5s
Test / Test on PHP 8.4 (push) Failing after 4s
Test / Test on PHP 8.5 (push) Failing after 3s
TypeScript static analysis / TypeScript check (push) Failing after 14s
Test Integration on MySQL / Test on PHP 8.3 (push) Failing after 2s
Test Integration on MySQL / Test on PHP 8.5 (push) Failing after 0s
Test Integration on PostgreSQL / Test on PHP 8.4 fix (push) Failing after 1s
Test Integration on PostgreSQL / Test on PHP 8.4 master (push) Failing after 1s
This commit is contained in:
65
tests/unit/Espo/Core/Acl/Map/DefaultCacheKeyProviderTest.php
Normal file
65
tests/unit/Espo/Core/Acl/Map/DefaultCacheKeyProviderTest.php
Normal file
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM – Open Source CRM application.
|
||||
* Copyright (C) 2014-2026 EspoCRM, Inc.
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* The interactive user interfaces in modified source and object code versions
|
||||
* of this program must display Appropriate Legal Notices, as required under
|
||||
* Section 5 of the GNU Affero General Public License version 3.
|
||||
*
|
||||
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
|
||||
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
|
||||
************************************************************************/
|
||||
|
||||
namespace tests\unit\Espo\Core\Acl\Map;
|
||||
|
||||
use Espo\Core\Acl\Map\DefaultCacheKeyProvider;
|
||||
use Espo\Entities\User;
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class DefaultCacheKeyProviderTest extends TestCase
|
||||
{
|
||||
#[DataProvider('provider')]
|
||||
public function testKey(string $expected, string $userId, ?array $scopes = null): void
|
||||
{
|
||||
$user = $this->createMock(User::class);
|
||||
|
||||
$user->expects(self::any())
|
||||
->method('getId')
|
||||
->willReturn($userId);
|
||||
|
||||
$user->expects(self::any())
|
||||
->method('getScopes')
|
||||
->willReturn($scopes);
|
||||
|
||||
$provider = new DefaultCacheKeyProvider($user);
|
||||
|
||||
$this->assertEquals($expected, $provider->get());
|
||||
}
|
||||
|
||||
public static function provider(): array
|
||||
{
|
||||
return [
|
||||
['aclMap/01', '01', null],
|
||||
['aclMap/01/37f6e5e382faedc68e0769892e78d8d3', '01', ['Admin', 'Global']],
|
||||
['aclMap/01/99aa06d3014798d86001c324468d497f', '01', []],
|
||||
];
|
||||
}
|
||||
}
|
||||
427
tests/unit/Espo/Core/Acl/Map/MapTest.php
Normal file
427
tests/unit/Espo/Core/Acl/Map/MapTest.php
Normal file
@@ -0,0 +1,427 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM – Open Source CRM application.
|
||||
* Copyright (C) 2014-2026 EspoCRM, Inc.
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* The interactive user interfaces in modified source and object code versions
|
||||
* of this program must display Appropriate Legal Notices, as required under
|
||||
* Section 5 of the GNU Affero General Public License version 3.
|
||||
*
|
||||
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
|
||||
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
|
||||
************************************************************************/
|
||||
|
||||
namespace tests\unit\Espo\Core\Acl\Map;
|
||||
|
||||
use Espo\Core\Acl\FieldData;
|
||||
use Espo\Core\Acl\Map\CacheKeyProvider;
|
||||
use Espo\Core\Acl\Map\DataBuilder;
|
||||
use Espo\Core\Acl\Map\Map;
|
||||
use Espo\Core\Acl\Map\MetadataProvider;
|
||||
use Espo\Core\Acl\ScopeData;
|
||||
use Espo\Core\Acl\Table;
|
||||
use Espo\Core\Utils\Cache\DataCacheAccess;
|
||||
use Espo\Core\Utils\Config\SystemConfig;
|
||||
use Espo\Core\Utils\DataCache;
|
||||
use Espo\Core\Utils\FieldUtil;
|
||||
|
||||
use Espo\Core\Utils\Log;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use stdClass;
|
||||
|
||||
class MapTest extends TestCase
|
||||
{
|
||||
private $fieldUtil;
|
||||
private $table;
|
||||
private $metadataProvider;
|
||||
private $cacheKeyProvider;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->fieldUtil = $this->createMock(FieldUtil::class);
|
||||
$this->table = $this->createMock(Table::class);
|
||||
$this->metadataProvider = $this->createMock(MetadataProvider::class);
|
||||
$this->cacheKeyProvider = $this->createMock(CacheKeyProvider::class);
|
||||
|
||||
}
|
||||
|
||||
private function mockTableData(array $scopeData, array $fieldData, array $permissionData): void
|
||||
{
|
||||
$returnMap1 = [];
|
||||
|
||||
foreach ($scopeData as $scope => $item) {
|
||||
$returnMap1[] = [$scope, ScopeData::fromRaw($item)];
|
||||
}
|
||||
|
||||
$this->table
|
||||
->expects($this->any())
|
||||
->method('getScopeData')
|
||||
->willReturnMap($returnMap1);
|
||||
|
||||
$returnMap2 = [];
|
||||
|
||||
foreach ($fieldData as $scope => $item1) {
|
||||
foreach ($item1 as $field => $item2) {
|
||||
$returnMap2[] = [$scope, $field, FieldData::fromRaw($item2)];
|
||||
}
|
||||
}
|
||||
|
||||
$this->table
|
||||
->expects($this->any())
|
||||
->method('getFieldData')
|
||||
->willReturnMap($returnMap2);
|
||||
|
||||
$returnMap3 = [];
|
||||
|
||||
foreach ($permissionData as $permission => $level) {
|
||||
$returnMap3[] = [$permission, $level];
|
||||
}
|
||||
|
||||
$this->table
|
||||
->expects($this->any())
|
||||
->method('getPermissionLevel')
|
||||
->willReturnMap($returnMap3);
|
||||
}
|
||||
|
||||
public function testMap1(): void
|
||||
{
|
||||
$dataBuilder = new DataBuilder($this->metadataProvider, $this->fieldUtil);
|
||||
|
||||
$this->metadataProvider
|
||||
->expects($this->any())
|
||||
->method('getScopeList')
|
||||
->willReturn(['Test1', 'Test2', 'Test3', 'Test4', 'Test5']);
|
||||
|
||||
$this->metadataProvider
|
||||
->expects($this->any())
|
||||
->method('getPermissionList')
|
||||
->willReturn(['assignment', 'portal']);
|
||||
|
||||
$this->metadataProvider
|
||||
->expects($this->any())
|
||||
->method('isScopeEntity')
|
||||
->willReturnMap([
|
||||
['Test1', true],
|
||||
['Test2', true],
|
||||
['Test3', true],
|
||||
['Test4', true],
|
||||
['Test5', false],
|
||||
]);
|
||||
|
||||
$this->metadataProvider
|
||||
->expects($this->any())
|
||||
->method('getScopeFieldList')
|
||||
->willReturnMap([
|
||||
['Test1', ['field1', 'field2', 'field3', 'field4']],
|
||||
['Test2', ['field1']],
|
||||
['Test3', []],
|
||||
['Test4', []],
|
||||
['Test5', []],
|
||||
]);
|
||||
|
||||
$this->fieldUtil
|
||||
->expects($this->any())
|
||||
->method('getAttributeList')
|
||||
->willReturnMap([
|
||||
['Test1', 'field1', ['attr1a', 'attr1b']],
|
||||
['Test1', 'field2', ['field2']],
|
||||
['Test1', 'field3', ['field3']],
|
||||
['Test1', 'field4', ['field4']],
|
||||
['Test2', 'field1', ['field1']],
|
||||
]);
|
||||
|
||||
$this->mockTableData(
|
||||
[
|
||||
'Test1' => (object) [
|
||||
Table::ACTION_CREATE => Table::LEVEL_YES,
|
||||
Table::ACTION_READ => Table::LEVEL_TEAM,
|
||||
],
|
||||
'Test2' => (object) [
|
||||
Table::ACTION_CREATE => Table::LEVEL_YES,
|
||||
Table::ACTION_READ => Table::LEVEL_TEAM,
|
||||
Table::ACTION_EDIT => Table::LEVEL_OWN,
|
||||
],
|
||||
'Test3' => false,
|
||||
'Test4' => true,
|
||||
'Test5' => true,
|
||||
],
|
||||
[
|
||||
'Test1' => [
|
||||
'field1' => (object) [
|
||||
Table::ACTION_READ => Table::LEVEL_YES,
|
||||
Table::ACTION_EDIT => Table::LEVEL_NO,
|
||||
],
|
||||
'field2' => (object) [
|
||||
Table::ACTION_READ => Table::LEVEL_NO,
|
||||
Table::ACTION_EDIT => Table::LEVEL_YES,
|
||||
],
|
||||
'field3' => (object) [
|
||||
Table::ACTION_READ => Table::LEVEL_NO,
|
||||
Table::ACTION_EDIT => Table::LEVEL_NO,
|
||||
],
|
||||
'field4' => (object) [
|
||||
Table::ACTION_READ => Table::LEVEL_YES,
|
||||
Table::ACTION_EDIT => Table::LEVEL_YES,
|
||||
],
|
||||
],
|
||||
'Test2' => [
|
||||
'field1' => (object) [
|
||||
Table::ACTION_READ => Table::LEVEL_NO,
|
||||
Table::ACTION_EDIT => Table::LEVEL_NO,
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
'assignment' => Table::LEVEL_YES,
|
||||
'portal' => Table::LEVEL_NO,
|
||||
],
|
||||
);
|
||||
|
||||
$expectedData = $this->getExpectedRawData();
|
||||
|
||||
$this->cacheKeyProvider->method('get')
|
||||
->willReturn('key');
|
||||
|
||||
$dataCacheAccess = new DataCacheAccess(
|
||||
dataCache: $this->createMock(DataCache::class),
|
||||
systemConfig: $this->createMock(SystemConfig::class),
|
||||
log: $this->createMock(Log::class),
|
||||
);
|
||||
|
||||
$map = new Map(
|
||||
table: $this->table,
|
||||
dataBuilder: $dataBuilder,
|
||||
cacheKeyProvider: $this->cacheKeyProvider,
|
||||
dataCacheAccess: $dataCacheAccess,
|
||||
);
|
||||
|
||||
$this->assertEquals($expectedData, $map->getData());
|
||||
|
||||
$this->assertEquals(
|
||||
['field2', 'field3'],
|
||||
$map->getScopeForbiddenFieldList('Test1', Table::ACTION_READ)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
['field1', 'field3'],
|
||||
$map->getScopeForbiddenFieldList('Test1', Table::ACTION_EDIT)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
['field2', 'field3'],
|
||||
$map->getScopeForbiddenAttributeList('Test1', Table::ACTION_READ)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
['attr1a', 'attr1b', 'field3'],
|
||||
$map->getScopeForbiddenAttributeList('Test1', Table::ACTION_EDIT)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
['attr1a', 'attr1b', 'field3'],
|
||||
$map->getScopeForbiddenAttributeList('Test1', Table::ACTION_EDIT)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
['field1'],
|
||||
$map->getScopeForbiddenFieldList('Test2', Table::ACTION_READ)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
['field1'],
|
||||
$map->getScopeForbiddenFieldList('Test2', Table::ACTION_READ)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
[],
|
||||
$map->getScopeForbiddenFieldList('Test3', Table::ACTION_READ)
|
||||
);
|
||||
}
|
||||
|
||||
private function getExpectedRawData(): stdClass
|
||||
{
|
||||
return (object) [
|
||||
'table' => (object) [
|
||||
'Test1' => (object) [
|
||||
'read' => 'team',
|
||||
'stream' => 'no',
|
||||
'edit' => 'no',
|
||||
'delete' => 'no',
|
||||
'create' => 'yes'
|
||||
],
|
||||
'Test2' => (object) [
|
||||
'read' => 'team',
|
||||
'stream' => 'no',
|
||||
'edit' => 'own',
|
||||
'delete' => 'no',
|
||||
'create' => 'yes'
|
||||
],
|
||||
'Test3' => false,
|
||||
'Test4' => true,
|
||||
'Test5' => true
|
||||
],
|
||||
'fieldTable' => (object) [
|
||||
'Test1' => (object) [
|
||||
'field1' => (object) [
|
||||
'read' => 'yes',
|
||||
'edit' => 'no'
|
||||
],
|
||||
'field2' => (object) [
|
||||
'read' => 'no',
|
||||
'edit' => 'yes'
|
||||
],
|
||||
'field3' => (object) [
|
||||
'read' => 'no',
|
||||
'edit' => 'no'
|
||||
]
|
||||
],
|
||||
'Test2' => (object) [
|
||||
'field1' => (object) [
|
||||
'read' => 'no',
|
||||
'edit' => 'no'
|
||||
]
|
||||
],
|
||||
'Test3' => (object) [],
|
||||
'Test4' => (object) []
|
||||
],
|
||||
'assignmentPermission' => 'yes',
|
||||
'portalPermission' => 'no',
|
||||
'fieldTableQuickAccess' => (object) [
|
||||
'Test1' => (object) [
|
||||
'attributes' => (object) [
|
||||
'read' => (object) [
|
||||
'yes' => [
|
||||
'attr1a',
|
||||
'attr1b'
|
||||
],
|
||||
'no' => [
|
||||
'field2',
|
||||
'field3'
|
||||
]
|
||||
],
|
||||
'edit' => (object) [
|
||||
'yes' => [
|
||||
'field2'
|
||||
],
|
||||
'no' => [
|
||||
'attr1a',
|
||||
'attr1b',
|
||||
'field3'
|
||||
]
|
||||
]
|
||||
],
|
||||
'fields' => (object) [
|
||||
'read' => (object) [
|
||||
'yes' => [
|
||||
'field1'
|
||||
],
|
||||
'no' => [
|
||||
'field2',
|
||||
'field3'
|
||||
]
|
||||
],
|
||||
'edit' => (object) [
|
||||
'yes' => [
|
||||
'field2'
|
||||
],
|
||||
'no' => [
|
||||
'field1',
|
||||
'field3'
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
'Test2' => (object) [
|
||||
'attributes' => (object) [
|
||||
'read' => (object) [
|
||||
'yes' => [],
|
||||
'no' => [
|
||||
'field1'
|
||||
]
|
||||
],
|
||||
'edit' => (object) [
|
||||
'yes' => [],
|
||||
'no' => [
|
||||
'field1'
|
||||
]
|
||||
]
|
||||
],
|
||||
'fields' => (object) [
|
||||
'read' => (object) [
|
||||
'yes' => [],
|
||||
'no' => [
|
||||
'field1'
|
||||
]
|
||||
],
|
||||
'edit' => (object) [
|
||||
'yes' => [],
|
||||
'no' => [
|
||||
'field1'
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
'Test3' => (object) [
|
||||
'attributes' => (object) [
|
||||
'read' => (object) [
|
||||
'yes' => [],
|
||||
'no' => []
|
||||
],
|
||||
'edit' => (object) [
|
||||
'yes' => [],
|
||||
'no' => []
|
||||
]
|
||||
],
|
||||
'fields' => (object) [
|
||||
'read' => (object) [
|
||||
'yes' => [],
|
||||
'no' => []
|
||||
],
|
||||
'edit' => (object) [
|
||||
'yes' => [],
|
||||
'no' => []
|
||||
]
|
||||
]
|
||||
],
|
||||
'Test4' => (object) [
|
||||
'attributes' => (object) [
|
||||
'read' => (object) [
|
||||
'yes' => [],
|
||||
'no' => []
|
||||
],
|
||||
'edit' => (object) [
|
||||
'yes' => [],
|
||||
'no' => []
|
||||
]
|
||||
],
|
||||
'fields' => (object) [
|
||||
'read' => (object) [
|
||||
'yes' => [],
|
||||
'no' => []
|
||||
],
|
||||
'edit' => (object) [
|
||||
'yes' => [],
|
||||
'no' => []
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
58
tests/unit/Espo/Core/Acl/Map/MetadataProviderTest.php
Normal file
58
tests/unit/Espo/Core/Acl/Map/MetadataProviderTest.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
/************************************************************************
|
||||
* This file is part of EspoCRM.
|
||||
*
|
||||
* EspoCRM – Open Source CRM application.
|
||||
* Copyright (C) 2014-2026 EspoCRM, Inc.
|
||||
* Website: https://www.espocrm.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* The interactive user interfaces in modified source and object code versions
|
||||
* of this program must display Appropriate Legal Notices, as required under
|
||||
* Section 5 of the GNU Affero General Public License version 3.
|
||||
*
|
||||
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
|
||||
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
|
||||
************************************************************************/
|
||||
|
||||
namespace tests\unit\Espo\Core\Acl\Map;
|
||||
|
||||
use Espo\Core\Acl\Map\MetadataProvider;
|
||||
use Espo\Core\Acl\Permission;
|
||||
use Espo\Core\Utils\Metadata;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class MetadataProviderTest extends TestCase
|
||||
{
|
||||
private $metadata;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->metadata = $this->createMock(Metadata::class);
|
||||
}
|
||||
|
||||
public function testGetPermissionList(): void
|
||||
{
|
||||
$provider = new MetadataProvider($this->metadata);
|
||||
|
||||
$this->metadata
|
||||
->expects($this->once())
|
||||
->method('get')
|
||||
->with(['app', 'acl', 'valuePermissionList'])
|
||||
->willReturn(['assignmentPermission', 'portalPermission']);
|
||||
|
||||
$this->assertEquals([Permission::ASSIGNMENT, 'portal'], $provider->getPermissionList());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user