create([ 'key' => 'core', ]); $this->assertSame('CORE', $project->fresh()->key); } /** * Ensure the project seeder creates the expected starter projects. */ public function test_project_seeder_creates_projects(): void { $this->seed(ProjectSeeder::class); $this->assertDatabaseHas('projects', [ 'name' => 'Core Platform', 'key' => 'CORE', ]); $this->assertDatabaseHas('projects', [ 'name' => 'Authentication', 'key' => 'AUTH', ]); $this->assertDatabaseHas('projects', [ 'name' => 'Operations', 'key' => 'OPS', ]); } /** * Ensure projects expose their board columns in the configured order. */ public function test_projects_have_an_ordered_board_columns_relationship(): 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 the default database seeding can include project board columns. */ public function test_board_column_seeder_adds_columns_to_seeded_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, ]); } /** * Ensure projects expose ticket metadata relationships after seeding. */ public function test_projects_expose_ticket_metadata_relationships(): void { $this->seed([ ProjectSeeder::class, ProjectTicketMetadataSeeder::class, ]); $coreProject = Project::query()->where('key', 'CORE')->firstOrFail(); $this->assertSame( ['Task', 'Release', 'Bug'], $coreProject->ticketTypes->pluck('name')->all(), ); $this->assertSame( ['Low', 'Medium', 'High'], $coreProject->ticketPriorities->pluck('name')->all(), ); $this->assertSame( ['Driver'], $coreProject->ticketFieldDefinitions->pluck('label')->all(), ); } /** * Ensure projects expose tickets ordered by descending sequence number. */ public function test_projects_expose_tickets_ordered_by_sequence_number_desc(): void { $this->seed([ ProjectSeeder::class, ProjectTicketMetadataSeeder::class, TicketSeeder::class, ]); $coreProject = Project::query()->where('key', 'CORE')->firstOrFail(); $this->assertSame( ['CORE-2', 'CORE-1'], $coreProject->tickets->pluck('ticket_key')->all(), ); } /** * Ensure projects expose linked repository connections in a stable order. */ public function test_projects_expose_repository_connections_in_name_order(): void { $project = Project::factory()->create(); $project->repositoryConnections()->create([ 'base_url' => 'https://git.example.test', 'owner_name' => 'core-team', 'provider' => 'gitea', 'provider_repository_id' => '502', 'repository_full_name' => 'core-team/platform', 'repository_name' => 'platform', 'repository_url' => 'https://git.example.test/core-team/platform', ]); $project->repositoryConnections()->create([ 'base_url' => 'https://git.example.test', 'owner_name' => 'core-team', 'provider' => 'gitea', 'provider_repository_id' => '501', 'repository_full_name' => 'core-team/kanbangit', 'repository_name' => 'kanbangit', 'repository_url' => 'https://git.example.test/core-team/kanbangit', ]); $this->assertSame( ['core-team/kanbangit', 'core-team/platform'], $project->fresh()->repositoryConnections->pluck('repository_full_name')->all(), ); } /** * Ensure repository connection seeding adds starter repositories to seeded projects. */ public function test_repository_connection_seeder_adds_repositories_to_seeded_projects(): void { $this->seed([ ProjectSeeder::class, RepositoryConnectionSeeder::class, ]); $coreProject = Project::query()->where('key', 'CORE')->firstOrFail(); $this->assertDatabaseHas('repository_connections', [ 'project_id' => $coreProject->id, 'provider' => 'gitea', 'provider_repository_id' => '501', 'repository_full_name' => 'core-team/kanbangit', ]); } }