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

This commit is contained in:
upstream-mirror
2026-09-18 04:19:15 +05:00
commit 7cc7e6b4f3
10077 changed files with 900756 additions and 0 deletions

View 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', []],
];
}
}

View 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' => []
]
]
]
]
];
}
}

View 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());
}
}