@@ -1312,4 +1312,79 @@ public function testCreateRelationDocumentWithoutUpdatePermission(): void
13121312 $ database ->deleteCollection ('childRelationTest ' );
13131313 }
13141314
1315+ public function testDocumentPermissionRolesAreMatchedExactly (): void
1316+ {
1317+ /** @var Database $database */
1318+ $ database = $ this ->getDatabase ();
1319+ $ authorization = $ database ->getAuthorization ();
1320+ $ collection = 'perm_exact_ ' . uniqid ();
1321+
1322+ $ database ->createCollection ($ collection , permissions: [
1323+ Permission::create (Role::any ()),
1324+ ], documentSecurity: true );
1325+ $ database ->createAttribute ($ collection , 'amount ' , Database::VAR_INTEGER , 0 , true );
1326+
1327+ $ authorization ->skip (function () use ($ database , $ collection ): void {
1328+ $ database ->createDocument ($ collection , new Document ([
1329+ '$id ' => 'alice0 ' ,
1330+ '$permissions ' => [Permission::read (Role::user ('alice0 ' ))],
1331+ 'amount ' => 10 ,
1332+ ]));
1333+ $ database ->createDocument ($ collection , new Document ([
1334+ '$id ' => 'alice9 ' ,
1335+ '$permissions ' => [Permission::read (Role::user ('alice9 ' ))],
1336+ 'amount ' => 20 ,
1337+ ]));
1338+ $ database ->createDocument ($ collection , new Document ([
1339+ '$id ' => 'mass ' ,
1340+ '$permissions ' => [Permission::read (Role::user ('a3f9c1e0b2d4a6f8c1e0 ' ))],
1341+ 'amount ' => 30 ,
1342+ ]));
1343+ $ database ->createDocument ($ collection , new Document ([
1344+ '$id ' => 'literal ' ,
1345+ '$permissions ' => [Permission::read (Role::user ('alice. ' ))],
1346+ 'amount ' => 40 ,
1347+ ]));
1348+ });
1349+
1350+ $ authorization ->cleanRoles ();
1351+ $ authorization ->addRole (Role::user ('alice. ' )->toString ());
1352+
1353+ $ this ->assertSame (['literal ' ], $ this ->documentIds ($ database ->find ($ collection )));
1354+ $ this ->assertSame (1 , $ database ->count ($ collection ));
1355+ $ this ->assertSame (40 , (int ) $ database ->sum ($ collection , 'amount ' ));
1356+ $ this ->assertTrue ($ database ->getDocument ($ collection , 'alice0 ' )->isEmpty ());
1357+ $ this ->assertSame ('literal ' , $ database ->getDocument ($ collection , 'literal ' )->getId ());
1358+
1359+ $ authorization ->cleanRoles ();
1360+ $ authorization ->addRole (Role::user ('a ' . \str_repeat ('. ' , 19 ))->toString ());
1361+
1362+ $ this ->assertSame ([], $ this ->documentIds ($ database ->find ($ collection )));
1363+ $ this ->assertSame (0 , $ database ->count ($ collection ));
1364+ $ this ->assertSame (0 , (int ) $ database ->sum ($ collection , 'amount ' ));
1365+ $ this ->assertTrue ($ database ->getDocument ($ collection , 'mass ' )->isEmpty ());
1366+
1367+ $ authorization ->cleanRoles ();
1368+ $ authorization ->addRole (Role::user ('alice0 ' )->toString ());
1369+
1370+ $ this ->assertSame (['alice0 ' ], $ this ->documentIds ($ database ->find ($ collection )));
1371+ $ this ->assertSame (1 , $ database ->count ($ collection ));
1372+ $ this ->assertSame (10 , (int ) $ database ->sum ($ collection , 'amount ' ));
1373+ $ this ->assertSame ('alice0 ' , $ database ->getDocument ($ collection , 'alice0 ' )->getId ());
1374+
1375+ $ database ->deleteCollection ($ collection );
1376+ }
1377+
1378+ /**
1379+ * @param array<Document> $documents
1380+ * @return list<string>
1381+ */
1382+ private function documentIds (array $ documents ): array
1383+ {
1384+ return \array_values (\array_map (
1385+ static fn (Document $ document ): string => $ document ->getId (),
1386+ $ documents ,
1387+ ));
1388+ }
1389+
13151390}
0 commit comments