withoutVite(); Storage::fake('public'); $this->seed(RolesAndPermissionsSeeder::class); Setting::firstOrCreate([], ['congregazione_nome' => 'Congregazione di prova']); AnnoTeocratico::create(['label' => '2026-2027', 'start_date' => '2026-09-01', 'end_date' => '2027-08-31']); $this->admin = User::create(['name' => 'Admin', 'email' => 'admin@example.test', 'password' => 'password-di-prova']); $this->admin->assignRole('amministratore'); } /** $n assegnazioni aperte, ognuna con PDF. */ private function assegnazioni(int $n): void { $zona = Zona::create(['nome' => 'Montepellegrino', 'attivo' => true]); for ($i = 1; $i <= $n; $i++) { Storage::disk('public')->put("territori-pdf/t{$i}.pdf", '%PDF-1.4'); $t = Territorio::create(['numero' => (string) $i, 'attivo' => true, 'zona_id' => $zona->id, 'pdf_path' => "territori-pdf/t{$i}.pdf"]); $p = Proclamatore::create(['nome' => "Nicolò{$i}", 'cognome' => 'Rossi', 'attivo' => true]); Assegnazione::create([ 'territorio_id' => $t->id, 'proclamatore_id' => $p->id, 'anno_teocratico_id' => AnnoTeocratico::sole()->id, 'assigned_at' => now()->subDays($i), 'created_by' => $this->admin->id, ]); } } public function test_la_pagina_non_contiene_piu_l_elenco_che_arriva_dopo(): void { $this->assegnazioni(5); $this->actingAs($this->admin) ->get(route('assegnazioni.assegna')) ->assertOk() ->assertSee('Caricamento dei territori assegnati') ->assertDontSee('Territori Assegnati (5)'); } public function test_scegliere_un_territorio_non_chiede_niente_al_server(): void { $html = $this->actingAs($this->admin)->get(route('assegnazioni.assegna'))->getContent(); // wire:model senza .live: il valore parte solo con "Assegna". $this->assertStringContainsString('wire:model="territorio_id"', $html); $this->assertStringNotContainsString('wire:model.live="territorio_id"', $html); } public function test_le_opzioni_portano_la_miniatura_per_l_anteprima(): void { $t = Territorio::create(['numero' => '7', 'attivo' => true, 'thumbnail_path' => 'territori-thumbnails/t7.png']); $opzioni = Livewire::actingAs($this->admin)->test(Assegna::class)->viewData('opzioniTerritori'); $this->assertSame($t->miniaturaUrl(), $opzioni[0]['miniatura']); } public function test_l_elenco_si_cerca_nel_browser_senza_accenti(): void { $this->assegnazioni(1); Livewire::withoutLazyLoading()->actingAs($this->admin)->test(ElencoAssegnati::class) ->assertSee('Territori Assegnati (1)') ->assertSeeHtml('data-cerca="1 montepellegrino rossi nicolo1"') ->assertDontSeeHtml('wire:model.live.debounce.300ms="linkSearch"'); } public function test_le_righe_dell_elenco_restano_leggere(): void { $this->assegnazioni(30); $html = Livewire::withoutLazyLoading()->actingAs($this->admin)->test(ElencoAssegnati::class)->html(); // Prima ~3,8 KB a riga. Le icone sono simboli richiamati con . $this->assertLessThan(2600, strlen($html) / 30, 'Ogni riga dell\'elenco deve restare sotto i 2,6 KB'); $this->assertSame(1, substr_count($html, 'assertGreaterThanOrEqual(30, substr_count($html, 'href="#tm-i-copia"')); } }