create(); $assignee = User::factory()->create([ 'name' => 'Assigned User', ]); $otherAssignee = User::factory()->create(); $olderProject = Project::factory()->create([ 'key' => 'OLD', 'name' => 'Older project', ]); $newerProject = Project::factory()->create([ 'key' => 'NEW', 'name' => 'Newer project', ]); $hiddenProject = Project::factory()->create([ 'key' => 'HID', 'name' => 'Hidden project', ]); $this->syncProjectPermissions($olderProject, $viewer, ['view']); $this->syncProjectPermissions($newerProject, $viewer, ['view']); Ticket::factory()->create([ 'assignee_user_id' => $assignee->id, 'project_id' => $olderProject->id, 'sequence_number' => 1, 'ticket_key' => 'OLD-1', 'title' => 'Older visible ticket', ]); Ticket::factory()->create([ 'assignee_user_id' => $assignee->id, 'project_id' => $newerProject->id, 'sequence_number' => 2, 'ticket_key' => 'NEW-2', 'title' => 'Newer visible ticket', ]); Ticket::factory()->create([ 'assignee_user_id' => $assignee->id, 'project_id' => $hiddenProject->id, 'sequence_number' => 1, 'ticket_key' => 'HID-1', 'title' => 'Hidden ticket', ]); Ticket::factory()->create([ 'assignee_user_id' => $otherAssignee->id, 'project_id' => $olderProject->id, 'sequence_number' => 3, 'ticket_key' => 'OLD-3', 'title' => 'Other user ticket', ]); $this->withApplicationKey($viewer) ->getJson(route('api.users.assigned-tickets', $assignee)) ->assertOk() ->assertJsonPath('meta.assignee.name', 'Assigned User') ->assertJsonPath('data.0.project.name', 'Newer project') ->assertJsonPath('data.0.tickets.0.ticket_key', 'NEW-2') ->assertJsonCount(1, 'data.0.tickets') ->assertJsonPath('data.1.project.name', 'Older project') ->assertJsonPath('data.1.tickets.0.ticket_key', 'OLD-1') ->assertJsonCount(1, 'data.1.tickets') ->assertJsonCount(2, 'data'); } public function test_assignee_metadata_is_hidden_when_no_visible_assigned_tickets_exist(): void { $viewer = User::factory()->create(); $assignee = User::factory()->create([ 'name' => 'Hidden User', ]); $visibleProject = Project::factory()->create([ 'key' => 'VIS', 'name' => 'Visible project', ]); $hiddenProject = Project::factory()->create([ 'key' => 'HID', 'name' => 'Hidden project', ]); $this->syncProjectPermissions($visibleProject, $viewer, ['view']); Ticket::factory()->create([ 'assignee_user_id' => $assignee->id, 'project_id' => $hiddenProject->id, 'sequence_number' => 1, 'ticket_key' => 'HID-1', 'title' => 'Hidden ticket', ]); $this->withApplicationKey($viewer) ->getJson(route('api.users.assigned-tickets', $assignee)) ->assertOk() ->assertJsonPath('data', []) ->assertJsonPath('meta.assignee', null); } }