create(); $this->assertContains( $ticketFieldDefinition->field_type, TicketFieldDefinition::FIELD_TYPES, ); } /** * Ensure the metadata seeder creates project field definitions. */ public function test_metadata_seeder_creates_ticket_field_definitions(): void { $this->seed([ ProjectSeeder::class, ProjectTicketMetadataSeeder::class, ]); $coreProject = Project::query()->where('key', 'CORE')->firstOrFail(); $this->assertDatabaseHas('ticket_field_definitions', [ 'project_id' => $coreProject->id, 'label' => 'Assignee', 'field_type' => 'user', 'position' => 1, ]); $this->assertDatabaseHas('ticket_field_definitions', [ 'project_id' => $coreProject->id, 'label' => 'Story Points', 'field_type' => 'number', 'position' => 2, ]); } /** * Ensure ticket field definitions expose their related ticket values. */ public function test_ticket_field_definition_exposes_related_ticket_values(): void { $project = Project::factory()->create([ 'key' => 'CORE', ]); app(InitializeProjectTicketMetadata::class)->handle($project); $priority = TicketPriority::factory()->for($project)->create([ 'name' => 'Medium', 'position' => 1, ]); $ticket = Ticket::factory()->create([ 'project_id' => $project->id, 'ticket_priority_id' => $priority->id, 'ticket_type_id' => $project->ticketTypes()->firstOrFail()->id, ]); $fieldDefinition = TicketFieldDefinition::factory()->for($project)->create([ 'field_type' => 'number', 'label' => 'Story Points', 'position' => 1, ]); $fieldValue = TicketFieldValue::factory()->create([ 'ticket_field_definition_id' => $fieldDefinition->id, 'ticket_id' => $ticket->id, 'value_number' => 5, 'value_user_id' => null, ]); $this->assertSame( [$fieldValue->id], $fieldDefinition->fresh()->ticketFieldValues->modelKeys(), ); } }