ef9f648f4954176632b81cabc2deee81c82554e9
[yaffs-website] / web / core / modules / media / tests / src / Functional / MediaAccessTest.php
1 <?php
2
3 namespace Drupal\Tests\media\Functional;
4
5 use Drupal\media\Entity\Media;
6 use Drupal\Tests\system\Functional\Cache\AssertPageCacheContextsAndTagsTrait;
7 use Drupal\user\Entity\Role;
8 use Drupal\user\RoleInterface;
9
10 /**
11  * Basic access tests for Media.
12  *
13  * @group media
14  */
15 class MediaAccessTest extends MediaFunctionalTestBase {
16
17   use AssertPageCacheContextsAndTagsTrait;
18
19   /**
20    * {@inheritdoc}
21    */
22   public static $modules = [
23     'block',
24     'media_test_source',
25   ];
26
27   /**
28    * {@inheritdoc}
29    */
30   protected function setUp() {
31     parent::setUp();
32     // This is needed to provide the user cache context for a below assertion.
33     $this->drupalPlaceBlock('local_tasks_block');
34   }
35
36   /**
37    * Test some access control functionality.
38    */
39   public function testMediaAccess() {
40     $assert_session = $this->assertSession();
41
42     $media_type = $this->createMediaType();
43
44     // Create media.
45     $media = Media::create([
46       'bundle' => $media_type->id(),
47       'name' => 'Unnamed',
48     ]);
49     $media->save();
50     $user_media = Media::create([
51       'bundle' => $media_type->id(),
52       'name' => 'Unnamed',
53       'uid' => $this->nonAdminUser->id(),
54     ]);
55     $user_media->save();
56
57     // We are logged in as admin, so test 'administer media' permission.
58     $this->drupalGet('media/add/' . $media_type->id());
59     $this->assertCacheContext('user.permissions');
60     $assert_session->statusCodeEquals(200);
61     $this->drupalGet('media/' . $user_media->id());
62     $this->assertCacheContext('user.permissions');
63     $assert_session->statusCodeEquals(200);
64     $this->drupalGet('media/' . $user_media->id() . '/edit');
65     $this->assertCacheContext('user.permissions');
66     $assert_session->statusCodeEquals(200);
67     $this->drupalGet('media/' . $user_media->id() . '/delete');
68     $this->assertCacheContext('user.permissions');
69     $assert_session->statusCodeEquals(200);
70
71     $this->drupalLogin($this->nonAdminUser);
72     /** @var \Drupal\user\RoleInterface $role */
73     $role = Role::load(RoleInterface::AUTHENTICATED_ID);
74
75     // Test 'view media' permission.
76     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
87     // Test 'create BUNDLE media' permission.
88     $this->drupalGet('media/add/' . $media_type->id());
89     $this->assertCacheContext('user.permissions');
90     $assert_session->statusCodeEquals(403);
91     $permissions = ['create ' . $media_type->id() . ' media'];
92     $this->grantPermissions($role, $permissions);
93     $this->drupalGet('media/add/' . $media_type->id());
94     $this->assertCacheContext('user.permissions');
95     $assert_session->statusCodeEquals(200);
96     user_role_revoke_permissions($role->id(), $permissions);
97     $role = Role::load(RoleInterface::AUTHENTICATED_ID);
98
99     // Test 'create media' permission.
100     $this->drupalGet('media/add/' . $media_type->id());
101     $this->assertCacheContext('user.permissions');
102     $assert_session->statusCodeEquals(403);
103     $permissions = ['create media'];
104     $this->grantPermissions($role, $permissions);
105     $this->drupalGet('media/add/' . $media_type->id());
106     $this->assertCacheContext('user.permissions');
107     $assert_session->statusCodeEquals(200);
108     user_role_revoke_permissions($role->id(), $permissions);
109     $role = Role::load(RoleInterface::AUTHENTICATED_ID);
110
111     // Test 'edit own BUNDLE media' and 'delete own BUNDLE media' permissions.
112     $this->drupalGet('media/' . $user_media->id() . '/edit');
113     $this->assertCacheContext('user.permissions');
114     $assert_session->statusCodeEquals(403);
115     $this->drupalGet('media/' . $user_media->id() . '/delete');
116     $this->assertCacheContext('user.permissions');
117     $assert_session->statusCodeEquals(403);
118     $permissions = [
119       'edit own ' . $user_media->bundle() . ' media',
120       'delete own ' . $user_media->bundle() . ' media',
121     ];
122     $this->grantPermissions($role, $permissions);
123     $this->drupalGet('media/' . $user_media->id() . '/edit');
124     $this->assertCacheContext('user');
125     $assert_session->statusCodeEquals(200);
126     $this->drupalGet('media/' . $user_media->id() . '/delete');
127     $this->assertCacheContext('user');
128     $assert_session->statusCodeEquals(200);
129     user_role_revoke_permissions($role->id(), $permissions);
130     $role = Role::load(RoleInterface::AUTHENTICATED_ID);
131
132     // Test 'edit any BUNDLE media' and 'delete any BUNDLE media' permissions.
133     $this->drupalGet('media/' . $media->id() . '/edit');
134     $this->assertCacheContext('user.permissions');
135     $assert_session->statusCodeEquals(403);
136     $this->drupalGet('media/' . $media->id() . '/delete');
137     $this->assertCacheContext('user.permissions');
138     $assert_session->statusCodeEquals(403);
139     $permissions = [
140       'edit any ' . $media->bundle() . ' media',
141       'delete any ' . $media->bundle() . ' media',
142     ];
143     $this->grantPermissions($role, $permissions);
144     $this->drupalGet('media/' . $media->id() . '/edit');
145     $this->assertCacheContext('user.permissions');
146     $assert_session->statusCodeEquals(200);
147     $this->drupalGet('media/' . $media->id() . '/delete');
148     $this->assertCacheContext('user.permissions');
149     $assert_session->statusCodeEquals(200);
150
151     // Test the 'access media overview' permission.
152     $this->grantPermissions($role, ['access content overview']);
153     $this->drupalGet('admin/content');
154     $assert_session->linkByHrefNotExists('/admin/content/media');
155     $this->assertCacheContext('user');
156
157     // Create a new role, which implicitly checks if the permission exists.
158     $mediaOverviewRole = $this->createRole(['access content overview', 'access media overview']);
159     $this->nonAdminUser->addRole($mediaOverviewRole);
160     $this->nonAdminUser->save();
161
162     $this->drupalGet('admin/content');
163     $assert_session->linkByHrefExists('/admin/content/media');
164     $this->clickLink('Media');
165     $this->assertCacheContext('user.permissions');
166     $assert_session->statusCodeEquals(200);
167     $assert_session->elementExists('css', '.view-media');
168     $assert_session->pageTextContains($this->loggedInUser->getDisplayName());
169     $assert_session->pageTextContains($this->nonAdminUser->getDisplayName());
170     $assert_session->linkByHrefExists('/media/' . $media->id());
171     $assert_session->linkByHrefExists('/media/' . $user_media->id());
172   }
173
174 }