markTestSkipped($message ?? "Fortify feature [{$feature}] is not enabled."); } } /** * @param array $permissions */ protected function syncGlobalPermissions(User $user, array $permissions): void { app(PermissionService::class)->sync( $user, null, $this->normalizePermissions($permissions, 'global'), ); } /** * @param array $permissions */ protected function syncProjectPermissions(Project $project, User|Team $assignee, array $permissions): void { app(PermissionService::class)->sync( $assignee, $project, $this->normalizePermissions($permissions, 'project'), ); } /** * @param array $permissions */ protected function syncTeamPermissions(Team $team, User $user, array $permissions): void { app(PermissionService::class)->sync( $user, $team, $this->normalizePermissions($permissions, 'team'), ); } protected function withApplicationKey(User $user, ?string $name = null): static { $plainTextKey = $this->createPlainTextApplicationKey($user, $name); return $this->withHeader('Authorization', "Bearer {$plainTextKey}"); } protected function createPlainTextApplicationKey(User $user, ?string $name = null): string { $plainTextKey = UserApplication::generatePlainTextKey(); UserApplication::query()->create([ 'key_hash' => UserApplication::hashKey($plainTextKey), 'name' => $name ?? 'Test application', 'user_id' => $user->id, ]); return $plainTextKey; } /** * @param array $permissions * @return array */ private function normalizePermissions(array $permissions, string $scope): array { return collect($permissions) ->map(function (Permission|string $permission) use ($scope): string { if ($permission instanceof Permission) { return $permission->value; } return match ($scope) { 'global' => match ($permission) { 'admin', 'global:admin' => Permission::GlobalAdmin->value, 'create', 'project:create' => Permission::ProjectCreate->value, default => $permission, }, 'project' => match ($permission) { 'admin', 'delete', 'project:admin' => Permission::ProjectAdmin->value, 'edit' => Permission::ProjectAdmin->value, 'create', 'project:write', 'write' => Permission::ProjectWrite->value, 'project:read', 'read', 'view' => Permission::ProjectRead->value, default => $permission, }, 'team' => match ($permission) { 'admin', 'team:admin' => Permission::TeamAdmin->value, 'invite', 'team:invite' => Permission::TeamInvite->value, 'manage', 'team:manage' => Permission::TeamManage->value, default => $permission, }, default => $permission, }; }) ->unique() ->values() ->all(); } }