create(); }); test('a list key opens the list page and grants nothing else', function () { $lister = staffWithPermissions([Permission::ManageClients->value, Permission::ManageGroups->value]); $client = User::factory()->client()->create(); $this->actingAs($lister)->get('/clients')->assertOk(); $this->actingAs($lister)->get('/groups')->assertOk(); $this->actingAs($lister)->patch("/clients/{$client->id}", ['name' => 'Renamed'])->assertForbidden(); $this->actingAs($lister)->delete("/clients/{$client->id}")->assertForbidden(); }); test('write permissions alone do not open the list pages', function () { // The inverse, and the one that surprises people: a role can be able to // change every client it can name while having no way to browse them. $writer = staffWithPermissions([ Permission::CreateClients->value, Permission::EditClients->value, Permission::DeleteClients->value, Permission::CreateGroups->value, Permission::EditGroups->value, Permission::DeleteGroups->value, ]); $this->actingAs($writer)->get('/clients')->assertForbidden(); $this->actingAs($writer)->get('/groups')->assertForbidden(); // But the create screens, reached directly, do work. $this->actingAs($writer)->get('/clients/create')->assertOk(); }); test('the labels describe what the keys actually gate', function () { expect(Permission::ManageClients->label())->toBe('View the client list') ->and(Permission::ManageGroups->label())->toBe('View the group list'); });