seedLookupData(); $user = $this->user(['name' => 'Mark Requester']); Livewire::actingAs($user) ->test(TicketCreate::class) ->set('subject', 'Warehouse printer does not print labels') ->set('body', '

The printer fails every time a dispatch label is generated.

') ->set('priority_id', $fixtures['high']->id) ->set('category_id', $fixtures['category']->id) ->set('team_id', $fixtures['team']->id) ->set('project_id', $fixtures['project']->id) ->call('save') ->assertHasNoErrors() ->assertRedirect(); $this->assertDatabaseHas('helpdesk_tickets', [ 'user_id' => $user->id, 'subject' => 'Warehouse printer does not print labels', 'priority_id' => $fixtures['high']->id, 'category_id' => $fixtures['category']->id, 'team_id' => $fixtures['team']->id, 'project_id' => $fixtures['project']->id, ]); } public function test_ticket_create_does_not_validate_before_submit(): void { $this->seedLookupData(); $user = $this->user(); Livewire::actingAs($user) ->test(TicketCreate::class) ->set('subject', 'Draft ticket title only') ->assertHasNoErrors(); } public function test_ticket_create_validates_required_fields(): void { $this->seedLookupData(); $user = $this->user(); Livewire::actingAs($user) ->test(TicketCreate::class) ->call('save') ->assertHasErrors(['subject' => 'required', 'body' => 'required', 'priority_id' => 'required']); } public function test_ticket_index_shows_only_visible_tickets_for_standard_user(): void { $fixtures = $this->seedLookupData(); $owner = $this->user(['name' => 'Owner User']); $other = $this->user(['name' => 'Other User']); $visible = $this->ticket(['owner' => $owner, 'status_id' => $fixtures['open']->id, 'priority_id' => $fixtures['normal']->id, 'subject' => 'Visible ticket']); $this->ticket(['owner' => $other, 'status_id' => $fixtures['open']->id, 'priority_id' => $fixtures['normal']->id, 'subject' => 'Hidden ticket']); Livewire::actingAs($owner) ->test(TicketIndex::class) ->assertSee($visible->reference) ->assertSee('Visible ticket') ->assertDontSee('Hidden ticket'); } public function test_agent_sees_assigned_ticket_and_admin_sees_all_tickets(): void { $fixtures = $this->seedLookupData(); $agent = $this->agent(['name' => 'Assigned Agent']); $admin = $this->admin(['name' => 'Admin User']); $owner = $this->user(); $assigned = $this->ticket(['owner' => $owner, 'agent' => $agent, 'status_id' => $fixtures['open']->id, 'priority_id' => $fixtures['normal']->id, 'subject' => 'Assigned ticket']); $unassigned = $this->ticket(['owner' => $this->user(), 'status_id' => $fixtures['open']->id, 'priority_id' => $fixtures['normal']->id, 'subject' => 'Another ticket']); Livewire::actingAs($agent) ->test(TicketIndex::class) ->assertSee($assigned->reference) ->assertDontSee($unassigned->reference); Livewire::actingAs($admin) ->test(TicketIndex::class) ->assertSee($assigned->reference) ->assertSee($unassigned->reference); } public function test_index_filters_by_search_priority_and_closed_scope(): void { $fixtures = $this->seedLookupData(); $admin = $this->admin(); $openTicket = $this->ticket(['owner' => $admin, 'status_id' => $fixtures['open']->id, 'priority_id' => $fixtures['high']->id, 'subject' => 'API sync failure']); $closedTicket = $this->ticket(['owner' => $admin, 'status_id' => $fixtures['closed']->id, 'priority_id' => $fixtures['normal']->id, 'completed_at' => now(), 'subject' => 'Old closed issue']); Livewire::actingAs($admin) ->test(TicketIndex::class) ->set('search', 'API sync') ->set('priority', (string) $fixtures['high']->id) ->assertSee($openTicket->reference) ->assertDontSee($closedTicket->reference); Livewire::actingAs($admin) ->test(TicketIndex::class) ->set('scope', 'closed') ->assertSee($closedTicket->reference) ->assertDontSee($openTicket->reference); } public function test_created_ticket_has_a_reference_and_last_activity_date(): void { $fixtures = $this->seedLookupData(); $user = $this->user(); Livewire::actingAs($user) ->test(TicketCreate::class) ->set('subject', 'Reference check') ->set('body', 'This ticket should have a generated reference.') ->set('priority_id', $fixtures['normal']->id) ->call('save'); $ticket = Ticket::query()->where('subject', 'Reference check')->firstOrFail(); self::assertStringStartsWith('HD-' . now()->format('Y') . '-', $ticket->reference); self::assertNotNull($ticket->last_activity_at); } }