7 class ContentPermissionsApiTest extends TestCase
11 protected string $baseEndpoint = '/api/content-permissions';
13 public function test_user_roles_manage_permission_needed_for_all_endpoints()
15 $page = $this->entities->page();
17 ['get', "/api/content-permissions/page/{$page->id}"],
18 ['put', "/api/content-permissions/page/{$page->id}"],
20 $editor = $this->users->editor();
22 $this->actingAs($editor, 'api');
23 foreach ($endpointMap as [$method, $uri]) {
24 $resp = $this->json($method, $uri);
25 $resp->assertStatus(403);
26 $resp->assertJson($this->permissionErrorResponse());
29 $this->permissions->grantUserRolePermissions($editor, ['restrictions-manage-all']);
31 foreach ($endpointMap as [$method, $uri]) {
32 $resp = $this->json($method, $uri);
33 $this->assertNotEquals(403, $resp->getStatusCode());
37 public function test_read_endpoint_shows_expected_detail()
39 $page = $this->entities->page();
40 $owner = $this->users->newUser();
41 $role = $this->users->createRole();
42 $this->permissions->addEntityPermission($page, ['view', 'delete'], $role);
43 $this->permissions->changeEntityOwner($page, $owner);
44 $this->permissions->setFallbackPermissions($page, ['update', 'create']);
46 $this->actingAsApiAdmin();
47 $resp = $this->getJson($this->baseEndpoint . "/page/{$page->id}");
50 $resp->assertExactJson([
52 'id' => $owner->id, 'name' => $owner->name, 'slug' => $owner->slug,
54 'role_permissions' => [
56 'role_id' => $role->id,
63 'display_name' => $role->display_name,
67 'fallback_permissions' => [
68 'inheriting' => false,
77 public function test_read_endpoint_shows_expected_detail_when_items_are_empty()
79 $page = $this->entities->page();
80 $page->permissions()->delete();
81 $page->owned_by = null;
84 $this->actingAsApiAdmin();
85 $resp = $this->getJson($this->baseEndpoint . "/page/{$page->id}");
88 $resp->assertExactJson([
90 'role_permissions' => [],
91 'fallback_permissions' => [
101 public function test_update_endpoint_can_change_owner()
103 $page = $this->entities->page();
104 $newOwner = $this->users->newUser();
106 $this->actingAsApiAdmin();
107 $resp = $this->putJson($this->baseEndpoint . "/page/{$page->id}", [
108 'owner_id' => $newOwner->id,
112 $resp->assertExactJson([
113 'owner' => ['id' => $newOwner->id, 'name' => $newOwner->name, 'slug' => $newOwner->slug],
114 'role_permissions' => [],
115 'fallback_permissions' => [
116 'inheriting' => true,
125 public function test_update_can_set_role_permissions()
127 $page = $this->entities->page();
128 $page->owned_by = null;
130 $newRoleA = $this->users->createRole();
131 $newRoleB = $this->users->createRole();
133 $this->actingAsApiAdmin();
134 $resp = $this->putJson($this->baseEndpoint . "/page/{$page->id}", [
135 'role_permissions' => [
136 ['role_id' => $newRoleA->id, 'view' => true, 'create' => false, 'update' => false, 'delete' => false],
137 ['role_id' => $newRoleB->id, 'view' => true, 'create' => false, 'update' => true, 'delete' => true],
142 $resp->assertExactJson([
144 'role_permissions' => [
146 'role_id' => $newRoleA->id,
152 'id' => $newRoleA->id,
153 'display_name' => $newRoleA->display_name,
157 'role_id' => $newRoleB->id,
163 'id' => $newRoleB->id,
164 'display_name' => $newRoleB->display_name,
168 'fallback_permissions' => [
169 'inheriting' => true,
178 public function test_update_can_set_fallback_permissions()
180 $page = $this->entities->page();
181 $page->owned_by = null;
184 $this->actingAsApiAdmin();
185 $resp = $this->putJson($this->baseEndpoint . "/page/{$page->id}", [
186 'fallback_permissions' => [
187 'inheriting' => false,
196 $resp->assertExactJson([
198 'role_permissions' => [],
199 'fallback_permissions' => [
200 'inheriting' => false,
209 public function test_update_can_clear_roles_permissions()
211 $page = $this->entities->page();
212 $this->permissions->addEntityPermission($page, ['view'], $this->users->createRole());
213 $page->owned_by = null;
216 $this->actingAsApiAdmin();
217 $resp = $this->putJson($this->baseEndpoint . "/page/{$page->id}", [
218 'role_permissions' => [],
222 $resp->assertExactJson([
224 'role_permissions' => [],
225 'fallback_permissions' => [
226 'inheriting' => true,
235 public function test_update_can_clear_fallback_permissions()
237 $page = $this->entities->page();
238 $this->permissions->setFallbackPermissions($page, ['view', 'update']);
239 $page->owned_by = null;
242 $this->actingAsApiAdmin();
243 $resp = $this->putJson($this->baseEndpoint . "/page/{$page->id}", [
244 'fallback_permissions' => [
245 'inheriting' => true,
250 $resp->assertExactJson([
252 'role_permissions' => [],
253 'fallback_permissions' => [
254 'inheriting' => true,
263 public function test_update_can_both_provide_owner_and_fallback_permissions()
265 $user = $this->users->viewer();
266 $page = $this->entities->page();
267 $page->owned_by = null;
270 $this->actingAsApiAdmin();
271 $resp = $this->putJson($this->baseEndpoint . "/page/{$page->id}", [
272 "owner_id" => $user->id,
273 'fallback_permissions' => [
274 'inheriting' => false,
283 $this->assertDatabaseHas('pages', ['id' => $page->id, 'owned_by' => $user->id]);
284 $this->assertDatabaseHas('entity_permissions', [
285 'entity_id' => $page->id,
286 'entity_type' => 'page',