3 * @copyright Copyright (C) 2010-2023, the Friendica project
5 * @license GNU AGPL version 3 or any later version
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 namespace Friendica\Test\src\Security\PermissionSet\Repository;
24 use Friendica\Database\Database;
25 use Friendica\Security\PermissionSet\Collection\PermissionSets;
26 use Friendica\Security\PermissionSet\Exception\PermissionSetNotFoundException;
27 use Friendica\Security\PermissionSet\Repository\PermissionSet as PermissionSetRepository;
28 use Friendica\Security\PermissionSet\Entity\PermissionSet;
29 use Friendica\Security\PermissionSet\Factory\PermissionSet as PermissionSetFactory;
30 use Friendica\Test\FixtureTest;
33 class PermissionSetTest extends FixtureTest
35 /** @var PermissionSetRepository */
37 /** @var PermissionSetFactory */
40 public function setUp(): void
44 $this->repository = DI::permissionSet();
45 $this->factory = DI::permissionSetFactory();
48 public function testSelectOneByIdPublic()
50 $permissionSet = $this->repository->selectPublicForUser(1);
52 $this->assertInstanceOf(PermissionSet::class, $permissionSet);
53 self::assertEmpty($permissionSet->allow_cid);
54 self::assertEmpty($permissionSet->allow_gid);
55 self::assertEmpty($permissionSet->deny_cid);
56 self::assertEmpty($permissionSet->deny_gid);
57 self::assertEmpty(PermissionSetRepository::PUBLIC, $permissionSet->id);
58 self::assertEquals(1, $permissionSet->uid);
62 * Test create/update PermissionSets
64 public function testSaving()
66 $permissionSet = $this->factory->createFromString(42, '', '<~>');
68 $permissionSet = $this->repository->selectOrCreate($permissionSet);
70 self::assertNotNull($permissionSet->id);
72 $permissionSetSelected = $this->repository->selectOneById($permissionSet->id, 42);
74 self::assertEquals($permissionSet, $permissionSetSelected);
76 $newPermissionSet = $permissionSet->withAllowedContacts(['1', '2']);
77 $savedPermissionSet = $this->repository->save($newPermissionSet);
79 self::assertNotNull($savedPermissionSet->id);
80 self::assertNull($newPermissionSet->id);
82 $permissionSetSavedSelected = $this->repository->selectOneById($savedPermissionSet->id, 42);
84 self::assertEquals($savedPermissionSet, $permissionSetSavedSelected);
88 * Asserts that the actual permissionset is equal to the expected permissionset
89 * --> It skips the "id" fields
91 * @param PermissionSets $expected
92 * @param PermissionSets $actual
94 public static function assertEqualPermissionSets(PermissionSets $expected, PermissionSets $actual)
96 self::assertEquals($expected->count(), $actual->count(), 'PermissionSets not even ' . PHP_EOL . 'expected: ' . print_r($expected, true) . 'actual: ' . print_r($actual, true));
98 foreach ($expected as $outputPermissionSet) {
99 self::assertCount(1, $actual->filter(function (PermissionSet $actualPermissionSet) use ($outputPermissionSet) {
101 $actualPermissionSet->uid == $outputPermissionSet->uid &&
102 $actualPermissionSet->allow_cid == $outputPermissionSet->allow_cid &&
103 $actualPermissionSet->allow_gid == $outputPermissionSet->allow_gid &&
104 $actualPermissionSet->deny_cid == $outputPermissionSet->deny_cid &&
105 $actualPermissionSet->deny_gid == $outputPermissionSet->deny_gid
107 }), 'PermissionSet not found: ' . print_r($outputPermissionSet, true));
111 public function dataSet()
115 'group_member' => [],
116 'permissionSets' => [
119 'allow_cid' => '<43>',
121 'deny_cid' => '<44>',
133 'allow_cid' => '<44>',
145 'output' => new PermissionSets([
146 new PermissionSet(42, [43], [], [44], []),
147 new PermissionSet(42, [], [], [], []),
155 'output' => new PermissionSets([
156 new PermissionSet(42, [], [], [], []),
157 new PermissionSet(42, [44], [], [], []),
165 'output' => new PermissionSets([
166 new PermissionSet(42, [], [], [], []),
172 'group_member' => [],
173 'permissionSets' => [
188 'output' => new PermissionSets([
189 new PermissionSet(42, [], [], [], []),
197 'output' => new PermissionSets([
198 new PermissionSet(42, [], [], [], []),
206 'output' => new PermissionSets([
207 new PermissionSet(42, [], [], [], []),
213 'group_member' => [],
214 'permissionSets' => [
222 'output' => new PermissionSets(),
229 'output' => new PermissionSets(),
236 'output' => new PermissionSets(),
258 'permissionSets' => [
261 'allow_cid' => '<43>',
262 'allow_gid' => '<3>',
263 'deny_cid' => '<44>,<46>',
275 'allow_cid' => '<44>',
289 'allow_cid' => '<45>',
292 'deny_gid' => '<1><2>',
301 'output' => new PermissionSets([
302 new PermissionSet(42, [], [], [], [2]),
310 'output' => new PermissionSets([
311 new PermissionSet(42, [43], [3], [44, 46], []),
312 new PermissionSet(42, [], [], [], [2]),
313 new PermissionSet(42, [], [], [], [1]),
321 'output' => new PermissionSets([
322 new PermissionSet(42, [], [], [], [2]),
323 new PermissionSet(42, [44], [], [], []),
324 new PermissionSet(42, [], [], [], [1]),
325 new PermissionSet(42, [45], [], [], [1, 2]),
333 'output' => new PermissionSets([
334 new PermissionSet(42, [], [], [], [2]),
335 new PermissionSet(42, [44], [], [], []),
336 new PermissionSet(42, [], [], [], [1]),
337 new PermissionSet(42, [45], [], [], [1, 2]),
345 'output' => new PermissionSets([
346 new PermissionSet(42, [], [], [], [2]),
347 new PermissionSet(42, [], [], [], [1]),
355 'output' => new PermissionSets([
356 new PermissionSet(42, [], [], [], [2]),
357 new PermissionSet(42, [], [], [], [1]),
366 * @dataProvider dataSet
368 public function testSelectContactId(array $group_member, array $inputPermissionSets, array $assertions)
370 /** @var Database $db */
371 $db = $this->dice->create(Database::class);
373 foreach ($group_member as $gmember) {
374 $db->insert('group_member', $gmember, true);
377 foreach ($inputPermissionSets as $inputPermissionSet) {
378 $db->insert('permissionset', $inputPermissionSet, true);
381 foreach ($assertions as $assertion) {
382 $permissionSets = $this->repository->selectByContactId($assertion['input']['cid'], $assertion['input']['uid']);
383 self::assertInstanceOf(PermissionSets::class, $permissionSets);
384 self::assertEqualPermissionSets($assertion['output'], $permissionSets);
388 public function testSelectOneByIdInvalid()
390 self::expectException(PermissionSetNotFoundException::class);
391 self::expectExceptionMessage('PermissionSet with id -1 for user 42 doesn\'t exist.');
393 $this->repository->selectOneById(-1, 42);
397 * @dataProvider dataSet
399 public function testSelectOneById(array $group_member, array $inputPermissionSets, array $assertions)
401 if (count($inputPermissionSets) === 0) {
402 self::markTestSkipped('Nothing to assert.');
405 /** @var Database $db */
406 $db = $this->dice->create(Database::class);
408 foreach ($inputPermissionSets as $inputPermissionSet) {
409 $db->insert('permissionset', $inputPermissionSet);
410 $id = $db->lastInsertId();
412 self::assertInstanceOf(PermissionSet::class, $this->repository->selectOneById($id, $inputPermissionSet['uid']));