]> git.mxchange.org Git - friendica.git/blob - tests/src/Security/PermissionSet/Repository/PermissionSetTest.php
Add yet another case to DateTimeFormat::fix
[friendica.git] / tests / src / Security / PermissionSet / Repository / PermissionSetTest.php
1 <?php
2 /**
3  * @copyright Copyright (C) 2010-2023, the Friendica project
4  *
5  * @license GNU AGPL version 3 or any later version
6  *
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.
11  *
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.
16  *
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/>.
19  *
20  */
21
22 namespace Friendica\Test\src\Security\PermissionSet\Repository;
23
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;
31 use Friendica\DI;
32
33 class PermissionSetTest extends FixtureTest
34 {
35         /** @var PermissionSetRepository */
36         private $repository;
37         /** @var PermissionSetFactory */
38         private $factory;
39
40         public function setUp(): void
41         {
42                 parent::setUp();
43
44                 $this->repository = DI::permissionSet();
45                 $this->factory    = DI::permissionSetFactory();
46         }
47
48         public function testSelectOneByIdPublic()
49         {
50                 $permissionSet = $this->repository->selectPublicForUser(1);
51
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);
59         }
60
61         /**
62          * Test create/update PermissionSets
63          */
64         public function testSaving()
65         {
66                 $permissionSet = $this->factory->createFromString(42, '', '<~>');
67
68                 $permissionSet = $this->repository->selectOrCreate($permissionSet);
69
70                 self::assertNotNull($permissionSet->id);
71
72                 $permissionSetSelected = $this->repository->selectOneById($permissionSet->id, 42);
73
74                 self::assertEquals($permissionSet, $permissionSetSelected);
75
76                 $newPermissionSet   = $permissionSet->withAllowedContacts(['1', '2']);
77                 $savedPermissionSet = $this->repository->save($newPermissionSet);
78
79                 self::assertNotNull($savedPermissionSet->id);
80                 self::assertNull($newPermissionSet->id);
81
82                 $permissionSetSavedSelected = $this->repository->selectOneById($savedPermissionSet->id, 42);
83
84                 self::assertEquals($savedPermissionSet, $permissionSetSavedSelected);
85         }
86
87         /**
88          * Asserts that the actual permissionset is equal to the expected permissionset
89          *   --> It skips the "id" fields
90          *
91          * @param PermissionSets $expected
92          * @param PermissionSets $actual
93          */
94         public static function assertEqualPermissionSets(PermissionSets $expected, PermissionSets $actual)
95         {
96                 self::assertEquals($expected->count(), $actual->count(), 'PermissionSets not even ' . PHP_EOL . 'expected: ' . print_r($expected, true) . 'actual: ' . print_r($actual, true));
97
98                 foreach ($expected as $outputPermissionSet) {
99                         self::assertCount(1, $actual->filter(function (PermissionSet $actualPermissionSet) use ($outputPermissionSet) {
100                                 return (
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
106                                 );
107                         }), 'PermissionSet not found: ' . print_r($outputPermissionSet, true));
108                 }
109         }
110
111         public function dataSet()
112         {
113                 return [
114                         'standard' => [
115                                 'group_member'   => [],
116                                 'permissionSets' => [
117                                         [
118                                                 'uid'       => 42,
119                                                 'allow_cid' => '<43>',
120                                                 'allow_gid' => '',
121                                                 'deny_cid'  => '<44>',
122                                                 'deny_gid'  => '',
123                                         ],
124                                         [
125                                                 'uid'       => 42,
126                                                 'allow_cid' => '',
127                                                 'allow_gid' => '',
128                                                 'deny_cid'  => '',
129                                                 'deny_gid'  => '',
130                                         ],
131                                         [
132                                                 'uid'       => 42,
133                                                 'allow_cid' => '<44>',
134                                                 'allow_gid' => '',
135                                                 'deny_cid'  => '',
136                                                 'deny_gid'  => '',
137                                         ],
138                                 ],
139                                 'assertions' => [
140                                         [
141                                                 'input' => [
142                                                         'cid' => 43,
143                                                         'uid' => 42,
144                                                 ],
145                                                 'output' => new PermissionSets([
146                                                         new PermissionSet(42, [43], [], [44], []),
147                                                         new PermissionSet(42, [], [], [], []),
148                                                 ]),
149                                         ],
150                                         [
151                                                 'input' => [
152                                                         'cid' => 44,
153                                                         'uid' => 42,
154                                                 ],
155                                                 'output' => new PermissionSets([
156                                                         new PermissionSet(42, [], [], [], []),
157                                                         new PermissionSet(42, [44], [], [], []),
158                                                 ]),
159                                         ],
160                                         [
161                                                 'input' => [
162                                                         'cid' => 47,
163                                                         'uid' => 42,
164                                                 ],
165                                                 'output' => new PermissionSets([
166                                                         new PermissionSet(42, [], [], [], []),
167                                                 ]),
168                                         ],
169                                 ],
170                         ],
171                         'empty' => [
172                                 'group_member'   => [],
173                                 'permissionSets' => [
174                                         [
175                                                 'uid'       => 42,
176                                                 'allow_cid' => '',
177                                                 'allow_gid' => '',
178                                                 'deny_cid'  => '',
179                                                 'deny_gid'  => '',
180                                         ],
181                                 ],
182                                 'assertions' => [
183                                         [
184                                                 'input' => [
185                                                         'cid' => 43,
186                                                         'uid' => 42,
187                                                 ],
188                                                 'output' => new PermissionSets([
189                                                         new PermissionSet(42, [], [], [], []),
190                                                 ]),
191                                         ],
192                                         [
193                                                 'input' => [
194                                                         'cid' => 44,
195                                                         'uid' => 42,
196                                                 ],
197                                                 'output' => new PermissionSets([
198                                                         new PermissionSet(42, [], [], [], []),
199                                                 ]),
200                                         ],
201                                         [
202                                                 'input' => [
203                                                         'cid' => 47,
204                                                         'uid' => 42,
205                                                 ],
206                                                 'output' => new PermissionSets([
207                                                         new PermissionSet(42, [], [], [], []),
208                                                 ]),
209                                         ],
210                                 ]
211                         ],
212                         'nothing' => [
213                                 'group_member'   => [],
214                                 'permissionSets' => [
215                                 ],
216                                 'assertions' => [
217                                         [
218                                                 'input' => [
219                                                         'cid' => 43,
220                                                         'uid' => 42,
221                                                 ],
222                                                 'output' => new PermissionSets(),
223                                         ],
224                                         [
225                                                 'input' => [
226                                                         'cid' => 44,
227                                                         'uid' => 42,
228                                                 ],
229                                                 'output' => new PermissionSets(),
230                                         ],
231                                         [
232                                                 'input' => [
233                                                         'cid' => 47,
234                                                         'uid' => 42,
235                                                 ],
236                                                 'output' => new PermissionSets(),
237                                         ],
238                                 ]
239                         ],
240                         'with_groups' => [
241                                 'group_member' => [
242                                         [
243                                                 'id'         => 1,
244                                                 'gid'        => 1,
245                                                 'contact-id' => 47,
246                                         ],
247                                         [
248                                                 'id'         => 2,
249                                                 'gid'        => 1,
250                                                 'contact-id' => 42,
251                                         ],
252                                         [
253                                                 'id'         => 3,
254                                                 'gid'        => 2,
255                                                 'contact-id' => 43,
256                                         ],
257                                 ],
258                                 'permissionSets' => [
259                                         [
260                                                 'uid'       => 42,
261                                                 'allow_cid' => '<43>',
262                                                 'allow_gid' => '<3>',
263                                                 'deny_cid'  => '<44>,<46>',
264                                                 'deny_gid'  => '',
265                                         ],
266                                         [
267                                                 'uid'       => 42,
268                                                 'allow_cid' => '',
269                                                 'allow_gid' => '',
270                                                 'deny_cid'  => '',
271                                                 'deny_gid'  => '<2>',
272                                         ],
273                                         [
274                                                 'uid'       => 42,
275                                                 'allow_cid' => '<44>',
276                                                 'allow_gid' => '',
277                                                 'deny_cid'  => '',
278                                                 'deny_gid'  => '',
279                                         ],
280                                         [
281                                                 'uid'       => 42,
282                                                 'allow_cid' => '',
283                                                 'allow_gid' => '',
284                                                 'deny_cid'  => '',
285                                                 'deny_gid'  => '<1>',
286                                         ],
287                                         [
288                                                 'uid'       => 42,
289                                                 'allow_cid' => '<45>',
290                                                 'allow_gid' => '',
291                                                 'deny_cid'  => '',
292                                                 'deny_gid'  => '<1><2>',
293                                         ],
294                                 ],
295                                 'assertions' => [
296                                         [
297                                                 'input' => [
298                                                         'cid' => 42,
299                                                         'uid' => 42,
300                                                 ],
301                                                 'output' => new PermissionSets([
302                                                         new PermissionSet(42, [], [], [], [2]),
303                                                 ]),
304                                         ],
305                                         [
306                                                 'input' => [
307                                                         'cid' => 43,
308                                                         'uid' => 42,
309                                                 ],
310                                                 'output' => new PermissionSets([
311                                                         new PermissionSet(42, [43], [3], [44, 46], []),
312                                                         new PermissionSet(42, [], [], [], [2]),
313                                                         new PermissionSet(42, [], [], [], [1]),
314                                                 ]),
315                                         ],
316                                         [
317                                                 'input' => [
318                                                         'cid' => 44,
319                                                         'uid' => 42,
320                                                 ],
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]),
326                                                 ]),
327                                         ],
328                                         [
329                                                 'input' => [
330                                                         'cid' => 45,
331                                                         'uid' => 42,
332                                                 ],
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]),
338                                                 ]),
339                                         ],
340                                         [
341                                                 'input' => [
342                                                         'cid' => 46,
343                                                         'uid' => 42,
344                                                 ],
345                                                 'output' => new PermissionSets([
346                                                         new PermissionSet(42, [], [], [], [2]),
347                                                         new PermissionSet(42, [], [], [], [1]),
348                                                 ]),
349                                         ],
350                                         [
351                                                 'input' => [
352                                                         'cid' => 47,
353                                                         'uid' => 42,
354                                                 ],
355                                                 'output' => new PermissionSets([
356                                                         new PermissionSet(42, [], [], [], [2]),
357                                                         new PermissionSet(42, [], [], [], [1]),
358                                                 ]),
359                                         ],
360                                 ],
361                         ],
362                 ];
363         }
364
365         /**
366          * @dataProvider dataSet
367          */
368         public function testSelectContactId(array $group_member, array $inputPermissionSets, array $assertions)
369         {
370                 /** @var Database $db */
371                 $db = $this->dice->create(Database::class);
372
373                 foreach ($group_member as $gmember) {
374                         $db->insert('group_member', $gmember, true);
375                 }
376
377                 foreach ($inputPermissionSets as $inputPermissionSet) {
378                         $db->insert('permissionset', $inputPermissionSet, true);
379                 }
380
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);
385                 }
386         }
387
388         public function testSelectOneByIdInvalid()
389         {
390                 self::expectException(PermissionSetNotFoundException::class);
391                 self::expectExceptionMessage('PermissionSet with id -1 for user 42 doesn\'t exist.');
392
393                 $this->repository->selectOneById(-1, 42);
394         }
395
396         /**
397          * @dataProvider dataSet
398          */
399         public function testSelectOneById(array $group_member, array $inputPermissionSets, array $assertions)
400         {
401                 if (count($inputPermissionSets) === 0) {
402                         self::markTestSkipped('Nothing to assert.');
403                 }
404
405                 /** @var Database $db */
406                 $db = $this->dice->create(Database::class);
407
408                 foreach ($inputPermissionSets as $inputPermissionSet) {
409                         $db->insert('permissionset', $inputPermissionSet);
410                         $id = $db->lastInsertId();
411
412                         self::assertInstanceOf(PermissionSet::class, $this->repository->selectOneById($id, $inputPermissionSet['uid']));
413                 }
414         }
415 }