Mercurial > hg > cmmr2012-drupal-site
comparison core/modules/media/tests/src/Functional/MediaAccessTest.php @ 5:12f9dff5fda9 tip
Update to Drupal core 8.7.1
author | Chris Cannam |
---|---|
date | Thu, 09 May 2019 15:34:47 +0100 |
parents | a9cd425dd02b |
children |
comparison
equal
deleted
inserted
replaced
4:a9cd425dd02b | 5:12f9dff5fda9 |
---|---|
1 <?php | 1 <?php |
2 | 2 |
3 namespace Drupal\Tests\media\Functional; | 3 namespace Drupal\Tests\media\Functional; |
4 | 4 |
5 use Drupal\field\Entity\FieldConfig; | |
6 use Drupal\field\Entity\FieldStorageConfig; | |
5 use Drupal\media\Entity\Media; | 7 use Drupal\media\Entity\Media; |
6 use Drupal\Tests\system\Functional\Cache\AssertPageCacheContextsAndTagsTrait; | 8 use Drupal\Tests\system\Functional\Cache\AssertPageCacheContextsAndTagsTrait; |
7 use Drupal\user\Entity\Role; | 9 use Drupal\user\Entity\Role; |
8 use Drupal\user\RoleInterface; | 10 use Drupal\user\RoleInterface; |
9 | 11 |
36 /** | 38 /** |
37 * Test some access control functionality. | 39 * Test some access control functionality. |
38 */ | 40 */ |
39 public function testMediaAccess() { | 41 public function testMediaAccess() { |
40 $assert_session = $this->assertSession(); | 42 $assert_session = $this->assertSession(); |
41 | |
42 $media_type = $this->createMediaType('test'); | 43 $media_type = $this->createMediaType('test'); |
44 | |
45 \Drupal::configFactory() | |
46 ->getEditable('media.settings') | |
47 ->set('standalone_url', TRUE) | |
48 ->save(TRUE); | |
49 | |
50 $this->container->get('router.builder')->rebuild(); | |
43 | 51 |
44 // Create media. | 52 // Create media. |
45 $media = Media::create([ | 53 $media = Media::create([ |
46 'bundle' => $media_type->id(), | 54 'bundle' => $media_type->id(), |
47 'name' => 'Unnamed', | 55 'name' => 'Unnamed', |
70 | 78 |
71 $this->drupalLogin($this->nonAdminUser); | 79 $this->drupalLogin($this->nonAdminUser); |
72 /** @var \Drupal\user\RoleInterface $role */ | 80 /** @var \Drupal\user\RoleInterface $role */ |
73 $role = Role::load(RoleInterface::AUTHENTICATED_ID); | 81 $role = Role::load(RoleInterface::AUTHENTICATED_ID); |
74 | 82 |
75 // Test 'view media' permission. | |
76 user_role_revoke_permissions($role->id(), ['view media']); | 83 user_role_revoke_permissions($role->id(), ['view media']); |
77 $this->drupalGet('media/' . $media->id()); | |
78 $this->assertCacheContext('user.permissions'); | |
79 $assert_session->statusCodeEquals(403); | |
80 $access_result = $media->access('view', NULL, TRUE); | |
81 $this->assertSame("The 'view media' permission is required and the media item must be published.", $access_result->getReason()); | |
82 $this->grantPermissions($role, ['view media']); | |
83 $this->drupalGet('media/' . $media->id()); | |
84 $this->assertCacheContext('user.permissions'); | |
85 $assert_session->statusCodeEquals(200); | |
86 | 84 |
87 // Test 'create BUNDLE media' permission. | 85 // Test 'create BUNDLE media' permission. |
88 $this->drupalGet('media/add/' . $media_type->id()); | 86 $this->drupalGet('media/add/' . $media_type->id()); |
89 $this->assertCacheContext('user.permissions'); | 87 $this->assertCacheContext('user.permissions'); |
90 $assert_session->statusCodeEquals(403); | 88 $assert_session->statusCodeEquals(403); |
93 $this->drupalGet('media/add/' . $media_type->id()); | 91 $this->drupalGet('media/add/' . $media_type->id()); |
94 $this->assertCacheContext('user.permissions'); | 92 $this->assertCacheContext('user.permissions'); |
95 $assert_session->statusCodeEquals(200); | 93 $assert_session->statusCodeEquals(200); |
96 user_role_revoke_permissions($role->id(), $permissions); | 94 user_role_revoke_permissions($role->id(), $permissions); |
97 $role = Role::load(RoleInterface::AUTHENTICATED_ID); | 95 $role = Role::load(RoleInterface::AUTHENTICATED_ID); |
96 | |
97 // Verify the author can not view the unpublished media item without | |
98 // 'view own unpublished media' permission. | |
99 $this->grantPermissions($role, ['view media']); | |
100 $this->drupalGet('media/' . $user_media->id()); | |
101 $this->assertNoCacheContext('user'); | |
102 $this->assertCacheContext('user.permissions'); | |
103 $assert_session->statusCodeEquals(200); | |
104 $user_media->setUnpublished()->save(); | |
105 $this->drupalGet('media/' . $user_media->id()); | |
106 $this->assertCacheContext('user.permissions'); | |
107 $assert_session->statusCodeEquals(403); | |
108 $access_result = $user_media->access('view', NULL, TRUE); | |
109 $this->assertSame("The user must be the owner and the 'view own unpublished media' permission is required when the media item is unpublished.", $access_result->getReason()); | |
110 $this->grantPermissions($role, ['view own unpublished media']); | |
111 $this->drupalGet('media/' . $user_media->id()); | |
112 $this->assertCacheContext('user'); | |
113 $assert_session->statusCodeEquals(200); | |
98 | 114 |
99 // Test 'create media' permission. | 115 // Test 'create media' permission. |
100 $this->drupalGet('media/add/' . $media_type->id()); | 116 $this->drupalGet('media/add/' . $media_type->id()); |
101 $this->assertCacheContext('user.permissions'); | 117 $this->assertCacheContext('user.permissions'); |
102 $assert_session->statusCodeEquals(403); | 118 $assert_session->statusCodeEquals(403); |
169 $assert_session->pageTextContains($this->nonAdminUser->getDisplayName()); | 185 $assert_session->pageTextContains($this->nonAdminUser->getDisplayName()); |
170 $assert_session->linkByHrefExists('/media/' . $media->id()); | 186 $assert_session->linkByHrefExists('/media/' . $media->id()); |
171 $assert_session->linkByHrefExists('/media/' . $user_media->id()); | 187 $assert_session->linkByHrefExists('/media/' . $user_media->id()); |
172 } | 188 } |
173 | 189 |
190 /** | |
191 * Test view access control on the canonical page. | |
192 */ | |
193 public function testCanonicalMediaAccess() { | |
194 $media_type = $this->createMediaType('test'); | |
195 $assert_session = $this->assertSession(); | |
196 | |
197 \Drupal::configFactory() | |
198 ->getEditable('media.settings') | |
199 ->set('standalone_url', TRUE) | |
200 ->save(TRUE); | |
201 | |
202 $this->container->get('router.builder')->rebuild(); | |
203 | |
204 // Create media. | |
205 $media = Media::create([ | |
206 'bundle' => $media_type->id(), | |
207 'name' => 'Unnamed', | |
208 ]); | |
209 $media->save(); | |
210 $user_media = Media::create([ | |
211 'bundle' => $media_type->id(), | |
212 'name' => 'Unnamed', | |
213 'uid' => $this->nonAdminUser->id(), | |
214 ]); | |
215 $user_media->save(); | |
216 | |
217 $this->drupalLogin($this->nonAdminUser); | |
218 /** @var \Drupal\user\RoleInterface $role */ | |
219 $role = Role::load(RoleInterface::AUTHENTICATED_ID); | |
220 | |
221 user_role_revoke_permissions($role->id(), ['view media']); | |
222 | |
223 $this->drupalGet('media/' . $media->id()); | |
224 $this->assertCacheContext('user.permissions'); | |
225 $assert_session->statusCodeEquals(403); | |
226 $access_result = $media->access('view', NULL, TRUE); | |
227 $this->assertSame("The 'view media' permission is required when the media item is published.", $access_result->getReason()); | |
228 $this->grantPermissions($role, ['view media']); | |
229 $this->drupalGet('media/' . $media->id()); | |
230 $this->assertCacheContext('user.permissions'); | |
231 $assert_session->statusCodeEquals(200); | |
232 } | |
233 | |
234 /** | |
235 * Tests unpublished media access. | |
236 */ | |
237 public function testUnpublishedMediaUserAccess() { | |
238 \Drupal::configFactory() | |
239 ->getEditable('media.settings') | |
240 ->set('standalone_url', TRUE) | |
241 ->save(TRUE); | |
242 | |
243 $this->container->get('router.builder')->rebuild(); | |
244 | |
245 $assert_session = $this->assertSession(); | |
246 $media_type = $this->createMediaType('test'); | |
247 $permissions = [ | |
248 'view media', | |
249 'view own unpublished media', | |
250 ]; | |
251 $user_one = $this->drupalCreateUser($permissions); | |
252 $user_two = $this->drupalCreateUser($permissions); | |
253 | |
254 // Create media as user one. | |
255 $user_media = Media::create([ | |
256 'bundle' => $media_type->id(), | |
257 'name' => 'Unnamed', | |
258 'uid' => $user_one->id(), | |
259 ]); | |
260 $user_media->setUnpublished()->save(); | |
261 | |
262 // Make sure user two can't access unpublished media. | |
263 $this->drupalLogin($user_two); | |
264 $this->drupalGet('media/' . $user_media->id()); | |
265 $assert_session->statusCodeEquals(403); | |
266 $this->assertCacheContext('user'); | |
267 $this->drupalLogout(); | |
268 | |
269 // Make sure user one can access own unpublished media. | |
270 $this->drupalLogin($user_one); | |
271 $this->drupalGet('media/' . $user_media->id()); | |
272 $assert_session->statusCodeEquals(200); | |
273 $this->assertCacheContext('user'); | |
274 } | |
275 | |
276 /** | |
277 * Tests media access of anonymous user. | |
278 */ | |
279 public function testMediaAnonymousUserAccess() { | |
280 \Drupal::configFactory() | |
281 ->getEditable('media.settings') | |
282 ->set('standalone_url', TRUE) | |
283 ->save(TRUE); | |
284 | |
285 $this->container->get('router.builder')->rebuild(); | |
286 | |
287 $assert_session = $this->assertSession(); | |
288 $media_type = $this->createMediaType('test'); | |
289 | |
290 // Create media as anonymous user. | |
291 $user_media = Media::create([ | |
292 'bundle' => $media_type->id(), | |
293 'name' => 'Unnamed', | |
294 'uid' => 0, | |
295 ]); | |
296 $user_media->save(); | |
297 | |
298 $role = Role::load(RoleInterface::ANONYMOUS_ID); | |
299 $this->grantPermissions($role, ['view media', 'view own unpublished media']); | |
300 $this->drupalLogout(); | |
301 | |
302 // Make sure anonymous users can access published media. | |
303 $user_media->setPublished()->save(); | |
304 $this->drupalGet('media/' . $user_media->id()); | |
305 $assert_session->statusCodeEquals(200); | |
306 | |
307 // Make sure anonymous users can not access unpublished media | |
308 // even though role has 'view own unpublished media' permission. | |
309 $user_media->setUnpublished()->save(); | |
310 $this->drupalGet('media/' . $user_media->id()); | |
311 $assert_session->statusCodeEquals(403); | |
312 $this->assertCacheContext('user'); | |
313 } | |
314 | |
315 /** | |
316 * Tests access for embedded medias. | |
317 */ | |
318 public function testReferencedRendering() { | |
319 \Drupal::configFactory() | |
320 ->getEditable('media.settings') | |
321 ->set('standalone_url', TRUE) | |
322 ->save(TRUE); | |
323 | |
324 $this->container->get('router.builder')->rebuild(); | |
325 | |
326 // Create a media type and a entity reference to itself. | |
327 $media_type = $this->createMediaType('test'); | |
328 | |
329 FieldStorageConfig::create([ | |
330 'field_name' => 'field_reference', | |
331 'entity_type' => 'media', | |
332 'type' => 'entity_reference', | |
333 'settings' => [ | |
334 'target_type' => 'media', | |
335 ], | |
336 ])->save(); | |
337 | |
338 FieldConfig::create([ | |
339 'field_name' => 'field_reference', | |
340 'entity_type' => 'media', | |
341 'bundle' => $media_type->id(), | |
342 ])->save(); | |
343 | |
344 $author = $this->drupalCreateUser([ | |
345 'view media', | |
346 'view own unpublished media', | |
347 ]); | |
348 $other_user = $this->drupalCreateUser([ | |
349 'view media', | |
350 'view own unpublished media', | |
351 ]); | |
352 $view_user = $this->drupalCreateUser(['view media']); | |
353 | |
354 $child_title = 'Child media'; | |
355 $media_child = Media::create([ | |
356 'name' => $child_title, | |
357 'bundle' => $media_type->id(), | |
358 'uid' => $author->id(), | |
359 ]); | |
360 $media_child->setUnpublished()->save(); | |
361 | |
362 $media_parent = Media::create([ | |
363 'name' => 'Parent media', | |
364 'bundle' => $media_type->id(), | |
365 'field_reference' => $media_child->id(), | |
366 ]); | |
367 $media_parent->save(); | |
368 | |
369 entity_get_display('media', $media_type->id(), 'full') | |
370 ->set('content', []) | |
371 ->setComponent('title', ['type' => 'string']) | |
372 ->setComponent('field_reference', [ | |
373 'type' => 'entity_reference_label', | |
374 ]) | |
375 ->save(); | |
376 | |
377 $assert_session = $this->assertSession(); | |
378 | |
379 // The author of the child media items should have access to both the parent | |
380 // and child. | |
381 $this->drupalLogin($author); | |
382 $this->drupalGet($media_parent->toUrl()); | |
383 $this->assertCacheContext('user'); | |
384 $assert_session->pageTextContains($child_title); | |
385 | |
386 // Other users with the 'view own unpublished media' permission should not | |
387 // be able to see the unpublished child media item. The 'user' cache context | |
388 // should be added in this case. | |
389 $this->drupalLogin($other_user); | |
390 $this->drupalGet($media_parent->toUrl()); | |
391 $this->assertCacheContext('user'); | |
392 $assert_session->pageTextNotContains($child_title); | |
393 | |
394 // User with just the 'view media' permission should not be able to see the | |
395 // child media item. The 'user' cache context should not be added in this | |
396 // case. | |
397 $this->drupalLogin($view_user); | |
398 $this->drupalGet($media_parent->toUrl()); | |
399 $this->assertNoCacheContext('user'); | |
400 $assert_session->pageTextNotContains($child_title); | |
401 } | |
402 | |
174 } | 403 } |