withoutVite(); Storage::fake('public'); Storage::fake('local'); } public function test_la_pagina_e_riservata_all_amministratore(): void { Role::findOr('utente', fn () => Role::create(['name' => 'utente', 'guard_name' => 'web'])); app(PermissionRegistrar::class)->forgetCachedPermissions(); $utente = User::create([ 'name' => 'Utente semplice', 'email' => 'utente@example.test', 'password' => 'password-di-prova', ]); $utente->assignRole('utente'); $this->actingAs($utente)->get(route('piantine.index'))->assertForbidden(); $this->actingAs($this->admin())->get(route('piantine.index'))->assertOk(); } public function test_il_kml_caricato_diventa_l_area_attiva(): void { $kml = <<<'XML' Area 13.35,38.11 13.37,38.11 13.37,38.13 13.35,38.11 XML; Livewire::actingAs($this->admin()) ->test(PiantineManager::class) ->set('kmlFile', UploadedFile::fake()->createWithContent('citta.kml', $kml)) ->call('caricaKml') ->assertHasNoErrors(); Storage::disk('local')->assertExists('piantine/area.geojson'); } public function test_un_file_che_non_e_kml_viene_rifiutato(): void { Livewire::actingAs($this->admin()) ->test(PiantineManager::class) ->set('kmlFile', UploadedFile::fake()->createWithContent('foto.png', 'binario')) ->call('caricaKml') ->assertHasErrors('kmlFile'); } public function test_una_piantina_si_collega_a_un_territorio(): void { $territorio = Territorio::create(['numero' => '12', 'attivo' => true]); $mappa = $this->piantina(['nome' => 'Zona porto']); Livewire::actingAs($this->admin()) ->test(PiantineManager::class) ->call('apriCollegamento', $mappa->id) ->set('territorioDaCollegare', $territorio->id) ->call('collega', $mappa->id); $this->assertSame($territorio->id, $mappa->fresh()->territorio_id); } public function test_un_territorio_che_ha_gia_una_piantina_non_ne_accetta_una_seconda(): void { $territorio = Territorio::create(['numero' => '12', 'attivo' => true]); $this->piantina(['territorio_id' => $territorio->id]); $seconda = $this->piantina(['nome' => 'Doppione']); Livewire::actingAs($this->admin()) ->test(PiantineManager::class) ->call('apriCollegamento', $seconda->id) ->set('territorioDaCollegare', $territorio->id) ->call('collega', $seconda->id); $this->assertNull($seconda->fresh()->territorio_id); } public function test_scollegare_conserva_la_piantina_e_le_da_un_nome(): void { $territorio = Territorio::create(['numero' => '12', 'attivo' => true]); $mappa = $this->piantina(['territorio_id' => $territorio->id]); Livewire::actingAs($this->admin()) ->test(PiantineManager::class) ->call('scollega', $mappa->id); $mappa->refresh(); $this->assertNull($mappa->territorio_id); $this->assertSame('Ex territorio 12', $mappa->nome); $this->assertDatabaseCount('territorio_mappe', 1); } /** * La cascata di prima si portava via il disegno insieme al territorio — e * l'import XML svuota `territori` in blocco a ogni ripristino. */ public function test_cancellare_il_territorio_lascia_in_piedi_la_piantina(): void { $territorio = Territorio::create(['numero' => '12', 'attivo' => true]); $mappa = $this->piantina(['territorio_id' => $territorio->id]); $territorio->forceDelete(); $this->assertDatabaseCount('territorio_mappe', 1); $this->assertNull($mappa->fresh()->territorio_id); } public function test_senza_territorio_il_pdf_non_si_genera(): void { $mappa = $this->piantina(['nome' => 'Zona porto']); Livewire::actingAs($this->admin()) ->test(PiantineManager::class) ->call('generaPdf', $mappa->id); $this->assertDatabaseCount('territorio_pdf_versioni', 0); } /** * L'anteprima serve a guardare la cartolina PRIMA di mandarla in vigore: * se toccasse pdf_path o lo storico, non sarebbe un'anteprima. */ public function test_l_anteprima_mostra_il_pdf_senza_sostituire_niente(): void { $territorio = Territorio::create(['numero' => '7', 'attivo' => true, 'confini' => 'Nord: via Roma']); $mappa = $this->piantina([ 'territorio_id' => $territorio->id, 'image_path' => 'territori-mappe/piantina-prova.png', ]); $immagine = imagecreatetruecolor(80, 50); ob_start(); imagepng($immagine); Storage::disk('public')->put($mappa->image_path, ob_get_clean()); imagedestroy($immagine); $risposta = $this->actingAs($this->admin())->get(route('piantine.anteprima', $mappa)); $risposta->assertOk(); $risposta->assertHeader('Content-Type', 'application/pdf'); $this->assertStringStartsWith('%PDF', $risposta->getContent()); $this->assertNull($territorio->fresh()->pdf_path); $this->assertSame(0, \App\Models\TerritorioPdfVersione::count()); } public function test_l_anteprima_di_una_piantina_scollegata_non_esiste(): void { $mappa = $this->piantina(['nome' => 'Scollegata']); $this->actingAs($this->admin()) ->get(route('piantine.anteprima', $mappa)) ->assertNotFound(); } private function piantina(array $valori = []): TerritorioMappa { return TerritorioMappa::create(array_merge([ 'geojson' => '{"type":"Polygon","coordinates":[[[13.35,38.11],[13.37,38.11],[13.37,38.13],[13.35,38.11]]]}', ], $valori)); } private function admin(): User { Role::findOr('amministratore', fn () => Role::create(['name' => 'amministratore', 'guard_name' => 'web'])); app(PermissionRegistrar::class)->forgetCachedPermissions(); Setting::firstOrCreate([], ['congregazione_nome' => 'Congregazione di prova']); $utente = User::firstOrCreate( ['email' => 'admin@example.test'], ['name' => 'Amministratore', 'password' => 'password-di-prova'], ); $utente->assignRole('amministratore'); return $utente; } }