createTenant('current'); $user = User::factory()->create(); $olderTicket = $this->createTicket($tenant, $user, 'Older ticket'); $newerTicket = $this->createTicket($tenant, $user, 'Newer ticket'); $this->actingAs($user, 'sanctum') ->getJson("/api/tenants/{$tenant->codigo}/tickets") ->assertOk() ->assertJsonCount(2, 'data') ->assertJsonPath('data.0.id', $newerTicket->id) ->assertJsonPath('data.0.name', 'Newer ticket') ->assertJsonPath('data.0.is_valid', true) ->assertJsonPath('data.0.is_expired', false) ->assertJsonPath('data.0.is_used', false) ->assertJsonPath('data.1.id', $olderTicket->id) ->assertJsonMissingPath('meta') ->assertJsonMissingPath('links'); } public function test_it_does_not_include_tickets_from_other_users_or_tenants(): void { $tenant = $this->createTenant('current'); $otherTenant = $this->createTenant('other'); $user = User::factory()->create(); $otherUser = User::factory()->create(); $visibleTicket = $this->createTicket($tenant, $user, 'Visible'); $this->createTicket($tenant, $otherUser, 'Other user'); $this->createTicket($otherTenant, $user, 'Other tenant'); $this->actingAs($user, 'sanctum') ->getJson("/api/tenants/{$tenant->codigo}/tickets") ->assertOk() ->assertJsonCount(1, 'data') ->assertJsonPath('data.0.id', $visibleTicket->id); } public function test_authentication_is_required_to_list_tickets(): void { $tenant = $this->createTenant('current'); $this->getJson("/api/tenants/{$tenant->codigo}/tickets") ->assertUnauthorized(); } private function createTicket(Tenant $tenant, User $user, string $name): Ticket { return Ticket::query()->create([ 'tenant_code' => $tenant->codigo, 'ticket' => (string) Str::uuid(), 'name' => $name, 'description' => "Description for {$name}", 'user_id' => $user->id, ]); } private function createTenant(string $code): Tenant { $headerLogo = $this->createAttachment("{$code}-header"); $footerLogo = $this->createAttachment("{$code}-footer"); return Tenant::query()->create([ 'codigo' => $code, 'nombre' => ucfirst($code), 'dominio' => "{$code}.local", 'primary_color' => '#000000', 'secondary_color' => '#000000', 'danger_color' => '#000000', 'success_color' => '#000000', 'header_bg_color' => '#000000', 'footer_bg_color' => '#000000', 'header_logo_id' => $headerLogo->id, 'footer_logo_id' => $footerLogo->id, ]); } private function createAttachment(string $name): Attachment { return Attachment::query()->create([ 'path' => "test/{$name}.png", 'filename' => "{$name}.png", 'type' => AttachmentType::Image, 'mime_type' => 'image/png', ]); } }