Blocco 2 - Esiti delle azioni Livewire come avvisi (trait Avvisa) invece di flash che comparivano alla pagina dopo. - PDF, miniature e versioni dei territori non più serviti da nginx su /storage: TerritorioFileController con login, permessi e cache privata. - Ripristino tutto o niente: verifica dell'archivio, una transazione con import, piantine, blocco account e scambio dei file annullabile. - Backup formato 2 con piantine, storico PDF e area KML. - Posto unico preso in un passo (Cache::lock) e rispettato anche da import XML e PDF. - Import PDF da cartella: abbinamento corretto (1-A, 12 B, ambigui), caricamento a lotti, file non PDF ignorati, PDF sostituito nello storico. - L'import XML elimina i file dei territori che non usa più; comando territori:file-orfani per quelli accumulati prima. Blocco 3 - Password attuale richiesta al cambio volontario; AuthenticateSession chiude le sessioni aperte altrove. - Niente nomi dei proclamatori in chiaro nel registro attività. - Export XML senza remember_token; chi riceve l'hash dal file deve cambiare password. - Campagne: ultimo giorno incluso, percentuale sui territori distinti. - Coda: retry_after 960 s, stop_grace_period 16m, Redis volatile-lru, impostazioni rilette a ogni job. - Azzeramento che cancella anche piantine, area KML e anteprime. - Pulsanti profilo e menu che non si nascondevano; icona del sito. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
74 lines
2.5 KiB
PHP
74 lines
2.5 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature;
|
|
|
|
use App\Livewire\Settings\ZoneIndex;
|
|
use App\Models\Territorio;
|
|
use App\Models\User;
|
|
use App\Models\Zona;
|
|
use Database\Seeders\RolesAndPermissionsSeeder;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Livewire\Livewire;
|
|
use Tests\TestCase;
|
|
|
|
/**
|
|
* Gli esiti delle azioni che non cambiano pagina arrivano come evento
|
|
* "avviso". Con session()->flash() il messaggio non si vedeva subito e
|
|
* compariva alla pagina successiva, fuori contesto.
|
|
*/
|
|
class AvvisiTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
private function admin(): User
|
|
{
|
|
$this->seed(RolesAndPermissionsSeeder::class);
|
|
$utente = User::create(['name' => 'Admin', 'email' => 'admin@example.test', 'password' => 'password-di-prova']);
|
|
$utente->assignRole('amministratore');
|
|
|
|
return $utente;
|
|
}
|
|
|
|
public function test_un_eliminazione_rifiutata_avvisa_subito_e_non_lascia_flash(): void
|
|
{
|
|
$zona = Zona::create(['nome' => 'Nord', 'attivo' => true]);
|
|
Territorio::create(['numero' => '1', 'attivo' => true, 'zona_id' => $zona->id]);
|
|
|
|
Livewire::actingAs($this->admin())
|
|
->test(ZoneIndex::class)
|
|
->call('deleteZona', $zona->id)
|
|
->assertDispatched('avviso', tipo: 'errore', testo: "Impossibile eliminare: la zona 'Nord' ha territori associati.");
|
|
|
|
$this->assertFalse(session()->has('error'));
|
|
$this->assertNotNull($zona->fresh());
|
|
}
|
|
|
|
public function test_un_azione_riuscita_avvisa_con_un_conferma(): void
|
|
{
|
|
$zona = Zona::create(['nome' => 'Sud', 'attivo' => true]);
|
|
|
|
Livewire::actingAs($this->admin())
|
|
->test(ZoneIndex::class)
|
|
->call('deleteZona', $zona->id)
|
|
->assertDispatched('avviso', tipo: 'ok');
|
|
|
|
$this->assertFalse(session()->has('success'));
|
|
}
|
|
|
|
public function test_nessun_componente_lascia_flash_senza_cambiare_pagina(): void
|
|
{
|
|
// Un flash senza redirect subito dopo non si vede fino alla pagina
|
|
// successiva: in quei casi si usa il trait Avvisa.
|
|
foreach (glob(app_path('Livewire') . '/{,*/}*.php', GLOB_BRACE) as $file) {
|
|
$righe = file($file);
|
|
foreach ($righe as $i => $riga) {
|
|
if (! preg_match('/^\s*session\(\)->flash\(/', $riga)) {
|
|
continue;
|
|
}
|
|
$seguito = implode('', array_slice($righe, $i + 1, 5));
|
|
$this->assertStringContainsString('redirect', $seguito, basename($file) . ':' . ($i + 1) . ' usa un flash senza redirect');
|
|
}
|
|
}
|
|
}
|
|
}
|