create(); $this->assertNotNull($boardColumn->project); $this->assertSame(1, $boardColumn->position); } /** * Ensure projects expose board columns ordered by position. */ public function test_project_board_columns_are_returned_in_position_order(): void { $project = Project::factory()->create(); BoardColumn::factory()->for($project)->create([ 'name' => 'Done', 'position' => 3, ]); BoardColumn::factory()->for($project)->create([ 'name' => 'Todo', 'position' => 1, ]); BoardColumn::factory()->for($project)->create([ 'name' => 'In Progress', 'position' => 2, ]); $this->assertSame( ['Todo', 'In Progress', 'Done'], $project->fresh()->boardColumns->pluck('name')->all(), ); } /** * Ensure board columns expose tickets ordered by descending sequence number. */ public function test_board_column_tickets_are_returned_in_sequence_order(): void { $project = Project::factory()->create([ 'key' => 'CORE', ]); app(InitializeProjectTicketMetadata::class)->handle($project); $priority = TicketPriority::factory()->for($project)->create([ 'name' => 'Medium', 'position' => 1, ]); $boardColumn = BoardColumn::factory()->for($project)->create([ 'name' => 'Doing', 'position' => 1, ]); Ticket::factory()->create([ 'board_column_id' => $boardColumn->id, 'project_id' => $project->id, 'sequence_number' => 1, 'ticket_key' => 'CORE-1', 'ticket_priority_id' => $priority->id, 'ticket_type_id' => $project->ticketTypes()->firstOrFail()->id, 'title' => 'First ticket', ]); Ticket::factory()->create([ 'board_column_id' => $boardColumn->id, 'project_id' => $project->id, 'sequence_number' => 2, 'ticket_key' => 'CORE-2', 'ticket_priority_id' => $priority->id, 'ticket_type_id' => $project->ticketTypes()->firstOrFail()->id, 'title' => 'Second ticket', ]); $this->assertSame( ['CORE-2', 'CORE-1'], $boardColumn->fresh()->tickets->pluck('ticket_key')->all(), ); } /** * Ensure the board column seeder creates starter workflow columns for seeded projects. */ public function test_board_column_seeder_creates_default_columns_for_projects(): void { $this->seed([ ProjectSeeder::class, BoardColumnSeeder::class, ]); $coreProject = Project::query()->where('key', 'CORE')->firstOrFail(); $this->assertDatabaseHas('board_columns', [ 'project_id' => $coreProject->id, 'name' => 'Todo', 'position' => 1, ]); $this->assertDatabaseHas('board_columns', [ 'project_id' => $coreProject->id, 'name' => 'In Progress', 'position' => 2, ]); $this->assertDatabaseHas('board_columns', [ 'project_id' => $coreProject->id, 'name' => 'Done', 'position' => 3, ]); } }