More updates to stop using dev or alpha or beta versions.
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Route / RoleAccessCheckTest.php
1 <?php
2
3 namespace Drupal\Tests\Core\Route;
4
5 use Drupal\Core\Access\AccessResult;
6 use Drupal\Core\Cache\Context\CacheContextsManager;
7 use Drupal\Core\DependencyInjection\Container;
8 use Drupal\Core\Session\UserSession;
9 use Drupal\Tests\UnitTestCase;
10 use Drupal\user\Access\RoleAccessCheck;
11 use Symfony\Component\Routing\Route;
12 use Symfony\Component\Routing\RouteCollection;
13
14 /**
15  * @coversDefaultClass \Drupal\user\Access\RoleAccessCheck
16  * @group Access
17  * @group Route
18  */
19 class RoleAccessCheckTest extends UnitTestCase {
20
21   /**
22    * Generates the test route collection.
23    *
24    * @return \Symfony\Component\Routing\RouteCollection
25    *   Returns the test route collection.
26    */
27   protected function getTestRouteCollection() {
28     $route_collection = new RouteCollection();
29     $route_collection->add('role_test_1', new Route('/role_test_1',
30       [
31         '_controller' => '\Drupal\router_test\TestControllers::test1',
32       ],
33       [
34         '_role' => 'role_test_1',
35       ]
36     ));
37     $route_collection->add('role_test_2', new Route('/role_test_2',
38       [
39         '_controller' => '\Drupal\router_test\TestControllers::test1',
40       ],
41       [
42         '_role' => 'role_test_2',
43       ]
44     ));
45     $route_collection->add('role_test_3', new Route('/role_test_3',
46       [
47         '_controller' => '\Drupal\router_test\TestControllers::test1',
48       ],
49       [
50         '_role' => 'role_test_1,role_test_2',
51       ]
52     ));
53     // Ensure that trimming the values works on "OR" conjunctions.
54     $route_collection->add('role_test_4', new Route('/role_test_4',
55       [
56         '_controller' => '\Drupal\router_test\TestControllers::test1',
57       ],
58       [
59         '_role' => 'role_test_1 , role_test_2',
60       ]
61     ));
62     $route_collection->add('role_test_5', new Route('/role_test_5',
63       [
64         '_controller' => '\Drupal\router_test\TestControllers::test1',
65       ],
66       [
67         '_role' => 'role_test_1+role_test_2',
68       ]
69     ));
70     // Ensure that trimming the values works on "AND" conjunctions.
71     $route_collection->add('role_test_6', new Route('/role_test_6',
72       [
73         '_controller' => '\Drupal\router_test\TestControllers::test1',
74       ],
75       [
76         '_role' => 'role_test_1 + role_test_2',
77       ]
78     ));
79
80     return $route_collection;
81   }
82
83   /**
84    * Provides data for the role access test.
85    *
86    * @see \Drupal\Tests\Core\Route\RouterRoleTest::testRoleAccess
87    */
88   public function roleAccessProvider() {
89     // Setup two different roles used in the test.
90     $rid_1 = 'role_test_1';
91     $rid_2 = 'role_test_2';
92
93     // Setup one user with the first role, one with the second, one with both
94     // and one final without any of these two roles.
95
96     $account_1 = new UserSession([
97       'uid' => 1,
98       'roles' => [$rid_1],
99     ]);
100
101     $account_2 = new UserSession([
102       'uid' => 2,
103       'roles' => [$rid_2],
104     ]);
105
106     $account_12 = new UserSession([
107       'uid' => 3,
108       'roles' => [$rid_1, $rid_2],
109     ]);
110
111     $account_none = new UserSession([
112       'uid' => 1,
113       'roles' => [],
114     ]);
115
116     // Setup expected values; specify which paths can be accessed by which user.
117     return [
118       ['role_test_1', [$account_1, $account_12], [$account_2, $account_none]],
119       ['role_test_2', [$account_2, $account_12], [$account_1, $account_none]],
120       ['role_test_3', [$account_12], [$account_1, $account_2, $account_none]],
121       ['role_test_4', [$account_12], [$account_1, $account_2, $account_none]],
122       ['role_test_5', [$account_1, $account_2, $account_12], []],
123       ['role_test_6', [$account_1, $account_2, $account_12], []],
124     ];
125   }
126
127   /**
128    * Tests role requirements on routes.
129    *
130    * @param string $path
131    *   The path to check access for.
132    * @param array $grant_accounts
133    *   A list of accounts which should have access to the given path.
134    * @param array $deny_accounts
135    *   A list of accounts which should not have access to the given path.
136    *
137    * @see \Drupal\Tests\Core\Route\RouterRoleTest::getTestRouteCollection
138    * @see \Drupal\Tests\Core\Route\RouterRoleTest::roleAccessProvider
139    *
140    * @dataProvider roleAccessProvider
141    */
142   public function testRoleAccess($path, $grant_accounts, $deny_accounts) {
143     $cache_contexts_manager = $this->prophesize(CacheContextsManager::class);
144     $cache_contexts_manager->assertValidTokens()->willReturn(TRUE);
145     $cache_contexts_manager->reveal();
146     $container = new Container();
147     $container->set('cache_contexts_manager', $cache_contexts_manager);
148     \Drupal::setContainer($container);
149
150     $role_access_check = new RoleAccessCheck();
151     $collection = $this->getTestRouteCollection();
152
153     foreach ($grant_accounts as $account) {
154       $message = sprintf('Access granted for user with the roles %s on path: %s', implode(', ', $account->getRoles()), $path);
155       $this->assertEquals(AccessResult::allowed()->addCacheContexts(['user.roles']), $role_access_check->access($collection->get($path), $account), $message);
156     }
157
158     // Check all users which don't have access.
159     foreach ($deny_accounts as $account) {
160       $message = sprintf('Access denied for user %s with the roles %s on path: %s', $account->id(), implode(', ', $account->getRoles()), $path);
161       $has_access = $role_access_check->access($collection->get($path), $account);
162       $this->assertEquals(AccessResult::neutral()->addCacheContexts(['user.roles']), $has_access, $message);
163     }
164   }
165
166 }