create(); Project::factory()->create(['name' => 'Private workspace']); $this->actingAs($user)->get(route('projects.index')) ->assertOk()->assertInertia(fn (Assert $page) => $page ->component('projects/Index') ->has('projects', 0) ->where('auth.permissions.projectCreate', false)); $this->syncGlobalPermissions($user, ['project:create']); $this->get(route('projects.index')) ->assertOk()->assertInertia(fn (Assert $page) => $page ->has('projects', 0) ->where('auth.permissions.projectCreate', true)); } #[DataProvider('projectRoles')] public function test_project_entry_actions_follow_effective_permissions(string $role, bool $teamAccess, bool $canManage): void { $user = User::factory()->create(); $project = Project::factory()->create(); $assignee = $user; if ($teamAccess) { $assignee = Team::factory()->create(); $assignee->users()->attach($user); } $this->syncProjectPermissions($project, $assignee, [$role]); $this->actingAs($user)->get(route('projects.show', $project)) ->assertOk()->assertInertia(fn (Assert $page) => $page ->component('projects/Show') ->where('project.id', $project->id) ->where('canManageAccess', $canManage) ->where('auth.permissions.projectCreate', false)); foreach (['projects.board.index', 'projects.backlog.index'] as $route) { $this->get(route($route, $project))->assertOk(); } foreach (['projects.settings.general', 'projects.settings.board', 'projects.settings.metadata', 'projects.settings.repositories', 'projects.settings.notifications', 'projects.access'] as $route) { $this->get(route($route, $project))->assertStatus($canManage ? 200 : 403); } } /** @return array */ public static function projectRoles(): array { return [ 'reader' => ['read', false, false], 'writer' => ['write', false, false], 'project admin' => ['admin', false, true], 'team reader' => ['read', true, false], 'team admin' => ['admin', true, true], ]; } public function test_project_overview_rendering_and_actions(): void { $process = new Process(['node', 'tests/Fixtures/project-overview.mjs'], base_path()); $process->setTimeout(60); $process->run(); $this->assertTrue($process->isSuccessful(), $process->getOutput().$process->getErrorOutput()); $this->assertStringContainsString('Project overview behavior checks passed.', $process->getOutput()); } }