create(); $project = Project::factory()->create([ 'key' => 'CORE', ]); BoardColumn::factory()->for($project)->create([ 'name' => 'Todo', 'position' => 1, ]); $this->syncProjectPermissions($project, $user, ['edit']); $this->actingAs($user) ->get(route('projects.settings.board', $project)) ->assertOk() ->assertInertia(fn (Assert $page) => $page ->component('projects/settings/Board') ->where('project.id', $project->id) ->where('boardColumns.0.name', 'Todo'), ); } /** * Ensure users without edit permission cannot view board settings. */ public function test_users_without_edit_permission_cannot_view_board_settings(): void { $user = User::factory()->create(); $project = Project::factory()->create(); $this->actingAs($user) ->get(route('projects.settings.board', $project)) ->assertForbidden(); } /** * Ensure authorized users can create board columns. */ public function test_users_with_edit_permission_can_create_board_columns(): void { $user = User::factory()->create(); $project = Project::factory()->create([ 'key' => 'CORE', ]); $this->syncProjectPermissions($project, $user, ['edit']); $this->actingAs($user) ->post(route('projects.settings.board.columns.store', $project), [ 'name' => 'In Review', ]) ->assertRedirect(route('projects.settings.board', $project)) ->assertSessionHas('status', 'In Review was added to the board workflow.'); $this->assertDatabaseHas('board_columns', [ 'project_id' => $project->id, 'name' => 'In Review', 'position' => 1, ]); } /** * Ensure authorized users can rename and reorder board columns. */ public function test_users_with_edit_permission_can_update_and_reorder_board_columns(): void { $user = User::factory()->create(); $project = Project::factory()->create(); $firstColumn = BoardColumn::factory()->for($project)->create([ 'name' => 'Todo', 'position' => 1, ]); $secondColumn = BoardColumn::factory()->for($project)->create([ 'name' => 'In Progress', 'position' => 2, ]); $thirdColumn = BoardColumn::factory()->for($project)->create([ 'name' => 'Done', 'position' => 3, ]); $this->syncProjectPermissions($project, $user, ['edit']); $this->actingAs($user) ->patch(route('projects.settings.board.columns.update', [$project, $thirdColumn]), [ 'name' => 'Ready for QA', 'position' => 1, ]) ->assertRedirect(route('projects.settings.board', $project)) ->assertSessionHas('status', 'Ready for QA was updated.'); $firstColumn->refresh(); $secondColumn->refresh(); $thirdColumn->refresh(); $this->assertSame(2, $firstColumn->position); $this->assertSame(3, $secondColumn->position); $this->assertSame(1, $thirdColumn->position); $this->assertSame('Ready for QA', $thirdColumn->name); } /** * Ensure deleting a column normalizes the remaining order. */ public function test_deleting_a_board_column_normalizes_remaining_positions(): void { $user = User::factory()->create(); $project = Project::factory()->create(); $firstColumn = BoardColumn::factory()->for($project)->create([ 'name' => 'Todo', 'position' => 1, ]); $secondColumn = BoardColumn::factory()->for($project)->create([ 'name' => 'In Progress', 'position' => 2, ]); $thirdColumn = BoardColumn::factory()->for($project)->create([ 'name' => 'Done', 'position' => 3, ]); $this->syncProjectPermissions($project, $user, ['edit']); $this->actingAs($user) ->delete(route('projects.settings.board.columns.destroy', [$project, $secondColumn])) ->assertRedirect(route('projects.settings.board', $project)) ->assertSessionHas('status', 'In Progress was removed from the board workflow.'); $firstColumn->refresh(); $thirdColumn->refresh(); $this->assertSame(1, $firstColumn->position); $this->assertSame(2, $thirdColumn->position); $this->assertDatabaseMissing('board_columns', [ 'id' => $secondColumn->id, ]); } }