Editor piantine: bozza automatica e pubblicazione con anteprima
- Il disegno è bozza e si salva da solo; i dati del territorio si modificano dall'editor e valgono subito nel gestionale. - Un solo "Pubblica" (immagine + PDF), uguale in editor e gestione: anteprima preparata in coda su disco privato, conferma obbligatoria, rifiutata se nel frattempo è cambiato qualcosa di stampato. - Stati Bozza / Pubblicata / Modifiche da pubblicare, calcolati sull'impronta di confine e dati stampati e sul PDF in uso. - Gestione riscritta: stato, ricerca, filtri, storico paginato. - Editor ridisegnato a tre zone, utilizzabile anche su tablet e telefono. - Avvisi via evento (trait Avvisa + <x-avvisi>). - .gitattributes: script shell sempre LF, altrimenti il container locale su Windows non parte. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Livewire\Piantine\PiantineEditor;
|
||||
use App\Livewire\Piantine\Pubblicazione;
|
||||
use App\Models\Setting;
|
||||
use App\Models\Territorio;
|
||||
use App\Models\TerritorioMappa;
|
||||
@@ -17,8 +18,9 @@ use Spatie\Permission\PermissionRegistrar;
|
||||
use Tests\TestCase;
|
||||
|
||||
/**
|
||||
* L'editor a schermo intero: si disegna prima e si decide dopo a chi
|
||||
* appartiene il disegno — territorio compreso, che può nascere qui.
|
||||
* L'editor a schermo intero: il disegno è bozza e si salva da solo, i dati
|
||||
* del territorio si salvano subito nel gestionale, il PDF non si tocca finché
|
||||
* non si pubblica.
|
||||
*/
|
||||
class PiantineEditorTest extends TestCase
|
||||
{
|
||||
@@ -29,6 +31,11 @@ class PiantineEditorTest extends TestCase
|
||||
'coordinates' => [[[13.35, 38.11], [13.37, 38.11], [13.37, 38.13], [13.35, 38.11]]],
|
||||
];
|
||||
|
||||
private const ALTRA_GEOMETRIA = [
|
||||
'type' => 'Polygon',
|
||||
'coordinates' => [[[13.40, 38.11], [13.42, 38.11], [13.42, 38.13], [13.40, 38.11]]],
|
||||
];
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
@@ -53,67 +60,242 @@ class PiantineEditorTest extends TestCase
|
||||
$this->actingAs($this->admin())->get(route('piantine.editor'))->assertOk();
|
||||
}
|
||||
|
||||
public function test_una_piantina_si_salva_senza_nessun_territorio(): void
|
||||
public function test_la_pagina_si_apre_su_una_piantina_esistente(): void
|
||||
{
|
||||
$mappa = TerritorioMappa::create(['nome' => 'Zona porto', 'geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
$this->actingAs($this->admin())
|
||||
->get(route('piantine.editor', $mappa->id))
|
||||
->assertOk()
|
||||
->assertSee('Zona porto');
|
||||
}
|
||||
|
||||
public function test_un_disegno_crea_subito_una_bozza_senza_territorio(): void
|
||||
{
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class)
|
||||
->dispatch('poligono-disegnato', geometry: self::GEOMETRIA)
|
||||
->set('nome', 'Zona porto — lato nord')
|
||||
->call('salva');
|
||||
->dispatch('geometria-modificata', geometry: self::GEOMETRIA, nuova: true)
|
||||
->assertDispatched('piantina-aggiornata')
|
||||
->assertDispatched('editor-indirizzo')
|
||||
->set('nome', 'Zona porto — lato nord');
|
||||
|
||||
$mappa = TerritorioMappa::sole();
|
||||
$this->assertNull($mappa->territorio_id);
|
||||
$this->assertSame('Zona porto — lato nord', $mappa->nome);
|
||||
$this->assertSame(self::GEOMETRIA, $mappa->geometria());
|
||||
$this->assertSame('Zona porto — lato nord', $mappa->etichetta());
|
||||
$this->assertSame(TerritorioMappa::STATO_BOZZA, $mappa->stato());
|
||||
}
|
||||
|
||||
public function test_il_territorio_si_crea_dalla_scheda_con_tutte_le_proprieta(): void
|
||||
public function test_spostare_i_vertici_aggiorna_la_piantina_aperta(): void
|
||||
{
|
||||
$mappa = TerritorioMappa::create(['geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->dispatch('geometria-modificata', geometry: self::ALTRA_GEOMETRIA, nuova: false);
|
||||
|
||||
$this->assertSame(1, TerritorioMappa::count());
|
||||
$this->assertSame(self::ALTRA_GEOMETRIA, $mappa->fresh()->geometria());
|
||||
}
|
||||
|
||||
public function test_un_disegno_nuovo_con_una_piantina_aperta_non_ne_sostituisce_il_confine(): void
|
||||
{
|
||||
$mappa = TerritorioMappa::create(['geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->dispatch('geometria-modificata', geometry: self::ALTRA_GEOMETRIA, nuova: true);
|
||||
|
||||
$this->assertSame(2, TerritorioMappa::count());
|
||||
$this->assertSame(self::GEOMETRIA, $mappa->fresh()->geometria());
|
||||
}
|
||||
|
||||
public function test_una_geometria_non_valida_viene_respinta(): void
|
||||
{
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class)
|
||||
->dispatch('geometria-modificata', geometry: ['type' => 'Point', 'coordinates' => [1, 2]], nuova: true)
|
||||
->dispatch('geometria-modificata', geometry: [
|
||||
'type' => 'Polygon',
|
||||
'coordinates' => [[[0, 0], [1, 0], [0, 0]]],
|
||||
], nuova: true)
|
||||
->dispatch('geometria-modificata', geometry: [
|
||||
'type' => 'Polygon',
|
||||
'coordinates' => [[[0, 0], [500, 0], [1, 1], [0, 0]]],
|
||||
], nuova: true)
|
||||
->assertDispatched('avviso');
|
||||
|
||||
$this->assertSame(0, TerritorioMappa::count());
|
||||
}
|
||||
|
||||
public function test_il_territorio_si_crea_dall_editor_con_tutte_le_proprieta(): void
|
||||
{
|
||||
$zona = Zona::create(['nome' => 'Nord', 'attivo' => true]);
|
||||
$tipologia = Tipologia::create(['nome' => 'Residenziale', 'attivo' => true]);
|
||||
$mappa = TerritorioMappa::create(['geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class)
|
||||
->dispatch('poligono-disegnato', geometry: self::GEOMETRIA)
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->set('territorioScelto', 'nuovo')
|
||||
->set('numero', '42')
|
||||
->set('zonaId', (string) $zona->id)
|
||||
->set('tipologiaId', (string) $tipologia->id)
|
||||
->set('confini', "Nord: via Roma\nSud: via Milano")
|
||||
->call('salva')
|
||||
->assertHasNoErrors();
|
||||
->call('creaTerritorio')
|
||||
->assertHasNoErrors()
|
||||
->assertSet('territorioScelto', fn ($v) => $v !== 'nuovo' && $v !== '');
|
||||
|
||||
$territorio = Territorio::where('numero', '42')->sole();
|
||||
$this->assertTrue((bool) $territorio->attivo);
|
||||
$this->assertSame($zona->id, $territorio->zona_id);
|
||||
$this->assertSame($tipologia->id, $territorio->tipologia_id);
|
||||
$this->assertStringContainsString('via Roma', $territorio->confini);
|
||||
$this->assertSame($territorio->id, TerritorioMappa::sole()->territorio_id);
|
||||
$this->assertSame($territorio->id, $mappa->fresh()->territorio_id);
|
||||
}
|
||||
|
||||
public function test_la_scheda_aggiorna_un_territorio_gia_esistente(): void
|
||||
public function test_in_creazione_i_campi_non_salvano_niente_prima_del_pulsante(): void
|
||||
{
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
$mappa = TerritorioMappa::create(['geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class)
|
||||
->dispatch('poligono-disegnato', geometry: self::GEOMETRIA)
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->set('territorioScelto', 'nuovo')
|
||||
->set('numero', '4');
|
||||
|
||||
$this->assertSame(0, Territorio::count());
|
||||
$this->assertNull($mappa->fresh()->territorio_id);
|
||||
}
|
||||
|
||||
public function test_un_numero_gia_in_uso_non_crea_un_secondo_territorio(): void
|
||||
{
|
||||
Territorio::create(['numero' => '42', 'attivo' => true]);
|
||||
$mappa = TerritorioMappa::create(['geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->set('territorioScelto', 'nuovo')
|
||||
->set('numero', '42')
|
||||
->call('creaTerritorio')
|
||||
->assertHasErrors('numero');
|
||||
|
||||
$this->assertSame(1, Territorio::where('numero', '42')->count());
|
||||
$this->assertNull($mappa->fresh()->territorio_id);
|
||||
}
|
||||
|
||||
public function test_scegliere_un_territorio_collega_subito_la_piantina(): void
|
||||
{
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true, 'confini' => 'Nord: via Verdi']);
|
||||
$mappa = TerritorioMappa::create(['geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->set('territorioScelto', (string) $territorio->id)
|
||||
->set('numero', '12')
|
||||
->set('confini', 'Nord: via Verdi')
|
||||
->call('salva')
|
||||
->assertHasNoErrors()
|
||||
->assertSet('numero', '12')
|
||||
->assertSet('confini', 'Nord: via Verdi');
|
||||
|
||||
$this->assertSame($territorio->id, $mappa->fresh()->territorio_id);
|
||||
}
|
||||
|
||||
/** La tendina leggeva `attivo` senza averlo caricato: tutti "disattivati". */
|
||||
public function test_la_tendina_segna_disattivato_solo_chi_lo_e(): void
|
||||
{
|
||||
Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
$mappa = TerritorioMappa::create(['geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->assertSee('Territorio 12')
|
||||
->assertDontSee('(disattivato)');
|
||||
}
|
||||
|
||||
public function test_i_dati_del_territorio_si_salvano_subito_campo_per_campo(): void
|
||||
{
|
||||
$zona = Zona::create(['nome' => 'Sud', 'attivo' => true]);
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
$mappa = TerritorioMappa::create(['territorio_id' => $territorio->id, 'geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->set('confini', 'Est: via Garibaldi')
|
||||
->set('zonaId', (string) $zona->id)
|
||||
->assertHasNoErrors();
|
||||
|
||||
$this->assertSame('Nord: via Verdi', $territorio->fresh()->confini);
|
||||
$this->assertSame(1, Territorio::count());
|
||||
$territorio->refresh();
|
||||
$this->assertSame('Est: via Garibaldi', $territorio->confini);
|
||||
$this->assertSame($zona->id, $territorio->zona_id);
|
||||
}
|
||||
|
||||
public function test_un_campo_non_valido_non_trascina_gli_altri(): void
|
||||
{
|
||||
Territorio::create(['numero' => '7', 'attivo' => true]);
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
$mappa = TerritorioMappa::create(['territorio_id' => $territorio->id, 'geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->set('numero', '7')
|
||||
->assertHasErrors('numero')
|
||||
->set('confini', 'Ovest: via Dante');
|
||||
|
||||
$territorio->refresh();
|
||||
$this->assertSame('12', $territorio->numero);
|
||||
$this->assertSame('Ovest: via Dante', $territorio->confini);
|
||||
}
|
||||
|
||||
public function test_non_si_ruba_il_territorio_a_un_altra_piantina(): void
|
||||
{
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
TerritorioMappa::create(['territorio_id' => $territorio->id, 'geojson' => json_encode(self::GEOMETRIA)]);
|
||||
$seconda = TerritorioMappa::create(['geojson' => json_encode(self::ALTRA_GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $seconda->id])
|
||||
->set('territorioScelto', (string) $territorio->id)
|
||||
->assertHasErrors('territorioScelto')
|
||||
->assertSet('territorioScelto', '');
|
||||
|
||||
$this->assertNull($seconda->fresh()->territorio_id);
|
||||
}
|
||||
|
||||
public function test_scollegare_lascia_un_etichetta_riconoscibile(): void
|
||||
{
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
$mappa = TerritorioMappa::create(['territorio_id' => $territorio->id, 'geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->set('territorioScelto', '');
|
||||
|
||||
$mappa->refresh();
|
||||
$this->assertNull($mappa->territorio_id);
|
||||
$this->assertSame('Ex territorio 12', $mappa->nome);
|
||||
$this->assertNotNull(Territorio::find($territorio->id));
|
||||
}
|
||||
|
||||
public function test_un_territorio_nel_cestino_resta_collegato(): void
|
||||
{
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
$mappa = TerritorioMappa::create(['territorio_id' => $territorio->id, 'geojson' => json_encode(self::GEOMETRIA)]);
|
||||
$territorio->delete();
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->assertSet('territorioScelto', (string) $territorio->id)
|
||||
->set('nome', 'Prova');
|
||||
|
||||
$mappa->refresh();
|
||||
$this->assertSame($territorio->id, $mappa->territorio_id);
|
||||
$this->assertNotNull($mappa->motivoNonPubblicabile());
|
||||
}
|
||||
|
||||
public function test_zona_e_tipologia_si_creano_dall_editor_e_restano_selezionate(): void
|
||||
{
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
$mappa = TerritorioMappa::create(['territorio_id' => $territorio->id, 'geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
$componente = Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class)
|
||||
->set('territorioScelto', 'nuovo')
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->set('nuovaZona', 'Litorale')
|
||||
->call('creaZona')
|
||||
->assertHasNoErrors()
|
||||
@@ -126,6 +308,10 @@ class PiantineEditorTest extends TestCase
|
||||
|
||||
$componente->assertSet('zonaId', (string) $zona->id);
|
||||
$componente->assertSet('tipologiaId', (string) $tipologia->id);
|
||||
|
||||
$territorio->refresh();
|
||||
$this->assertSame($zona->id, $territorio->zona_id);
|
||||
$this->assertSame($tipologia->id, $territorio->tipologia_id);
|
||||
}
|
||||
|
||||
public function test_una_zona_gia_esistente_non_viene_duplicata(): void
|
||||
@@ -141,70 +327,80 @@ class PiantineEditorTest extends TestCase
|
||||
$this->assertSame(1, Zona::where('nome', 'Nord')->count());
|
||||
}
|
||||
|
||||
public function test_un_numero_gia_in_uso_non_crea_un_secondo_territorio(): void
|
||||
public function test_pubblica_apre_la_finestra_solo_se_si_puo(): void
|
||||
{
|
||||
Territorio::create(['numero' => '42', 'attivo' => true]);
|
||||
$scollegata = TerritorioMappa::create(['geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class)
|
||||
->dispatch('poligono-disegnato', geometry: self::GEOMETRIA)
|
||||
->set('territorioScelto', 'nuovo')
|
||||
->set('numero', '42')
|
||||
->call('salva')
|
||||
->assertHasErrors('numero');
|
||||
->test(PiantineEditor::class, ['mappa' => $scollegata->id])
|
||||
->call('pubblica')
|
||||
->assertNotDispatched('pubblica-piantina')
|
||||
->assertDispatched('avviso');
|
||||
|
||||
$this->assertSame(1, Territorio::where('numero', '42')->count());
|
||||
$this->assertSame(0, TerritorioMappa::count());
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
$collegata = TerritorioMappa::create(['territorio_id' => $territorio->id, 'geojson' => json_encode(self::ALTRA_GEOMETRIA)]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $collegata->id])
|
||||
->call('pubblica')
|
||||
->assertDispatchedTo(Pubblicazione::class, 'pubblica-piantina', mappaId: $collegata->id);
|
||||
}
|
||||
|
||||
public function test_ridisegnare_sostituisce_il_poligono_senza_duplicare_la_piantina(): void
|
||||
public function test_scartare_le_modifiche_riporta_il_confine_pubblicato(): void
|
||||
{
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
$mappa = TerritorioMappa::create([
|
||||
'nome' => 'Zona porto',
|
||||
'geojson' => '{"type":"Polygon","coordinates":[[[0,0],[1,0],[1,1],[0,0]]]}',
|
||||
'territorio_id' => $territorio->id,
|
||||
'geojson' => json_encode(self::ALTRA_GEOMETRIA),
|
||||
'geojson_pubblicato' => json_encode(self::GEOMETRIA),
|
||||
'pubblicata_at' => now(),
|
||||
]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->dispatch('poligono-disegnato', geometry: self::GEOMETRIA)
|
||||
->call('salva');
|
||||
->call('scartaModifiche');
|
||||
|
||||
$this->assertSame(1, TerritorioMappa::count());
|
||||
$this->assertSame(self::GEOMETRIA, $mappa->fresh()->geometria());
|
||||
}
|
||||
|
||||
public function test_una_geometria_non_valida_viene_ignorata(): void
|
||||
{
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class)
|
||||
->dispatch('poligono-disegnato', geometry: ['type' => 'Point', 'coordinates' => [1, 2]])
|
||||
->call('salva');
|
||||
|
||||
$this->assertSame(0, TerritorioMappa::count());
|
||||
}
|
||||
|
||||
public function test_non_si_ruba_il_territorio_a_un_altra_piantina(): void
|
||||
public function test_eliminare_toglie_disegno_e_immagine_ma_non_il_territorio(): void
|
||||
{
|
||||
Storage::disk('public')->put('territori-mappe/piantina-1.jpg', 'x');
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
TerritorioMappa::create([
|
||||
$mappa = TerritorioMappa::create([
|
||||
'territorio_id' => $territorio->id,
|
||||
'geojson' => json_encode(self::GEOMETRIA),
|
||||
'image_path' => 'territori-mappe/piantina-1.jpg',
|
||||
]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class)
|
||||
->dispatch('poligono-disegnato', geometry: self::GEOMETRIA)
|
||||
->set('territorioScelto', (string) $territorio->id)
|
||||
->set('numero', $territorio->numero)
|
||||
->call('salva');
|
||||
->test(PiantineEditor::class, ['mappa' => $mappa->id])
|
||||
->call('elimina')
|
||||
->assertSet('mappaId', null)
|
||||
->assertDispatched('piantina-rimossa', mappaId: $mappa->id);
|
||||
|
||||
// La seconda piantina non deve essere stata creata.
|
||||
$this->assertSame(1, TerritorioMappa::count());
|
||||
$this->assertSame(0, TerritorioMappa::count());
|
||||
$this->assertNotNull(Territorio::find($territorio->id));
|
||||
Storage::disk('public')->assertMissing('territori-mappe/piantina-1.jpg');
|
||||
}
|
||||
|
||||
public function test_dati_mappa_esclude_le_geometrie_illeggibili(): void
|
||||
{
|
||||
TerritorioMappa::create(['geojson' => json_encode(self::GEOMETRIA)]);
|
||||
TerritorioMappa::create(['geojson' => 'non è json']);
|
||||
|
||||
$dati = Livewire::actingAs($this->admin())
|
||||
->test(PiantineEditor::class)
|
||||
->instance()
|
||||
->datiMappa(app(\App\Services\Piantine\PiantineArea::class));
|
||||
|
||||
$this->assertCount(1, $dati['piantine']);
|
||||
$this->assertSame(TerritorioMappa::STATO_BOZZA, $dati['piantine'][0]['stato']);
|
||||
}
|
||||
|
||||
private function admin(): User
|
||||
{
|
||||
Role::findOr('amministratore', fn () => Role::create(['name' => 'amministratore', 'guard_name' => 'web']));
|
||||
Role::firstOrCreate(['name' => 'amministratore', 'guard_name' => 'web']);
|
||||
app(PermissionRegistrar::class)->forgetCachedPermissions();
|
||||
|
||||
Setting::firstOrCreate([], ['congregazione_nome' => 'Congregazione di prova']);
|
||||
|
||||
@@ -17,7 +17,7 @@ use Tests\TestCase;
|
||||
|
||||
/**
|
||||
* La pagina di gestione delle piantine: accesso riservato, area della città,
|
||||
* e il legame — che si può fare e disfare — fra una piantina e un territorio.
|
||||
* stato di ogni piantina con ricerca e filtri, pubblicazione e storico.
|
||||
*/
|
||||
class PiantineManagerTest extends TestCase
|
||||
{
|
||||
@@ -77,50 +77,6 @@ XML;
|
||||
->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.
|
||||
@@ -136,52 +92,128 @@ XML;
|
||||
$this->assertNull($mappa->fresh()->territorio_id);
|
||||
}
|
||||
|
||||
public function test_senza_territorio_il_pdf_non_si_genera(): void
|
||||
public function test_l_elenco_mostra_lo_stato_di_ogni_piantina(): void
|
||||
{
|
||||
$mappa = $this->piantina(['nome' => 'Zona porto']);
|
||||
[$territorio, $pubblicata] = $this->pubblicata('7');
|
||||
$this->piantina(['nome' => 'Zona porto']);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineManager::class)
|
||||
->call('generaPdf', $mappa->id);
|
||||
|
||||
$this->assertDatabaseCount('territorio_pdf_versioni', 0);
|
||||
->assertSee('Terr. 7')
|
||||
->assertSee('Zona porto')
|
||||
->assertSee('Pubblicata')
|
||||
->assertSee('Bozza')
|
||||
->assertSee('Scollegata');
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
public function test_i_filtri_separano_bozze_pubblicate_e_da_pubblicare(): void
|
||||
{
|
||||
$territorio = Territorio::create(['numero' => '7', 'attivo' => true, 'confini' => 'Nord: via Roma']);
|
||||
$mappa = $this->piantina([
|
||||
[, $pubblicata] = $this->pubblicata('7');
|
||||
[$t8, $modificata] = $this->pubblicata('8');
|
||||
$t8->update(['confini' => 'cambiati dopo la pubblicazione']);
|
||||
$this->piantina(['nome' => 'Zona porto']);
|
||||
|
||||
$componente = Livewire::actingAs($this->admin())->test(PiantineManager::class);
|
||||
|
||||
$componente->set('filtro', 'pubblicate')
|
||||
->assertViewHas('elenco', fn ($e) => $e->pluck('id')->all() === [$pubblicata->id]);
|
||||
|
||||
$componente->set('filtro', 'da-pubblicare')
|
||||
->assertViewHas('elenco', fn ($e) => $e->pluck('id')->all() === [$modificata->id]);
|
||||
|
||||
$componente->set('filtro', 'scollegate')
|
||||
->assertViewHas('elenco', fn ($e) => $e->count() === 1 && $e->first()->nome === 'Zona porto');
|
||||
|
||||
$componente->set('filtro', 'inventato')
|
||||
->assertSet('filtro', 'tutte')
|
||||
->assertViewHas('elenco', fn ($e) => $e->count() === 3);
|
||||
}
|
||||
|
||||
public function test_la_ricerca_trova_numero_nome_e_zona(): void
|
||||
{
|
||||
$zona = \App\Models\Zona::create(['nome' => 'Litorale', 'attivo' => true]);
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true, 'zona_id' => $zona->id]);
|
||||
$this->piantina(['territorio_id' => $territorio->id]);
|
||||
$this->piantina(['nome' => 'Zona porto']);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineManager::class)
|
||||
->set('cerca', 'litor')
|
||||
->assertViewHas('elenco', fn ($e) => $e->count() === 1 && $e->first()->territorio_id === $territorio->id)
|
||||
->set('cerca', 'PORTO')
|
||||
->assertViewHas('elenco', fn ($e) => $e->count() === 1 && $e->first()->nome === 'Zona porto');
|
||||
}
|
||||
|
||||
public function test_pubblica_apre_la_finestra_condivisa_solo_se_si_puo(): void
|
||||
{
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
$collegata = $this->piantina(['territorio_id' => $territorio->id]);
|
||||
$scollegata = $this->piantina(['nome' => 'Zona porto']);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineManager::class)
|
||||
->call('pubblica', $collegata->id)
|
||||
->assertDispatchedTo(\App\Livewire\Piantine\Pubblicazione::class, 'pubblica-piantina', mappaId: $collegata->id);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineManager::class)
|
||||
->call('pubblica', $scollegata->id)
|
||||
->assertNotDispatched('pubblica-piantina')
|
||||
->assertDispatched('avviso');
|
||||
}
|
||||
|
||||
public function test_eliminare_toglie_la_piantina_ma_non_il_territorio(): void
|
||||
{
|
||||
$territorio = Territorio::create(['numero' => '12', 'attivo' => true]);
|
||||
$mappa = $this->piantina(['territorio_id' => $territorio->id]);
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineManager::class)
|
||||
->call('elimina', $mappa->id)
|
||||
->assertDispatched('avviso');
|
||||
|
||||
$this->assertDatabaseCount('territorio_mappe', 0);
|
||||
$this->assertNotNull($territorio->fresh());
|
||||
}
|
||||
|
||||
public function test_ripristinare_una_versione_riporta_la_piantina_da_pubblicare(): void
|
||||
{
|
||||
[$territorio, $mappa] = $this->pubblicata('7');
|
||||
|
||||
Storage::disk('public')->put('territori-pdf-versioni/vecchia.pdf', '%PDF-vecchia');
|
||||
$versione = \App\Models\TerritorioPdfVersione::create([
|
||||
'territorio_id' => $territorio->id,
|
||||
'image_path' => 'territori-mappe/piantina-prova.png',
|
||||
'pdf_path' => 'territori-pdf-versioni/vecchia.pdf',
|
||||
'origine' => 'piantine',
|
||||
'sostituito_il' => now()->subDay(),
|
||||
]);
|
||||
|
||||
$immagine = imagecreatetruecolor(80, 50);
|
||||
ob_start();
|
||||
imagepng($immagine);
|
||||
Storage::disk('public')->put($mappa->image_path, ob_get_clean());
|
||||
imagedestroy($immagine);
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(PiantineManager::class)
|
||||
->call('ripristinaVersione', $versione->id)
|
||||
->assertDispatched('avviso');
|
||||
|
||||
$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());
|
||||
$this->assertStringStartsWith('territori-pdf/ripristino-', $territorio->fresh()->pdf_path);
|
||||
$this->assertSame(TerritorioMappa::STATO_MODIFICATA, $mappa->fresh()->stato());
|
||||
}
|
||||
|
||||
public function test_l_anteprima_di_una_piantina_scollegata_non_esiste(): void
|
||||
/** Una piantina collegata e segnata come pubblicata, senza passare dal renderer. */
|
||||
private function pubblicata(string $numero): array
|
||||
{
|
||||
$mappa = $this->piantina(['nome' => 'Scollegata']);
|
||||
$territorio = Territorio::create(['numero' => $numero, 'attivo' => true]);
|
||||
$pdf = 'territori-pdf/piantina-' . $territorio->id . '-20261001-120000.pdf';
|
||||
Storage::disk('public')->put($pdf, '%PDF-piantina');
|
||||
$territorio->update(['pdf_path' => $pdf]);
|
||||
|
||||
$this->actingAs($this->admin())
|
||||
->get(route('piantine.anteprima', $mappa))
|
||||
->assertNotFound();
|
||||
$mappa = $this->piantina(['territorio_id' => $territorio->id]);
|
||||
$mappa->load('territorio.zona');
|
||||
$mappa->update([
|
||||
'geojson_pubblicato' => $mappa->geojson,
|
||||
'impronta_pubblicata' => $mappa->impronta(),
|
||||
'pubblicata_at' => now(),
|
||||
]);
|
||||
|
||||
return [$territorio, $mappa->fresh()];
|
||||
}
|
||||
|
||||
private function piantina(array $valori = []): TerritorioMappa
|
||||
@@ -193,7 +225,7 @@ XML;
|
||||
|
||||
private function admin(): User
|
||||
{
|
||||
Role::findOr('amministratore', fn () => Role::create(['name' => 'amministratore', 'guard_name' => 'web']));
|
||||
Role::firstOrCreate(['name' => 'amministratore', 'guard_name' => 'web']);
|
||||
app(PermissionRegistrar::class)->forgetCachedPermissions();
|
||||
|
||||
Setting::firstOrCreate([], ['congregazione_nome' => 'Congregazione di prova']);
|
||||
|
||||
286
tests/Feature/PubblicazionePiantinaTest.php
Normal file
286
tests/Feature/PubblicazionePiantinaTest.php
Normal file
@@ -0,0 +1,286 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Livewire\Piantine\Pubblicazione;
|
||||
use App\Models\Setting;
|
||||
use App\Models\Territorio;
|
||||
use App\Models\TerritorioMappa;
|
||||
use App\Models\TerritorioPdfVersione;
|
||||
use App\Models\User;
|
||||
use App\Models\Zona;
|
||||
use App\Services\Piantine\PubblicazionePiantina;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Livewire\Livewire;
|
||||
use RuntimeException;
|
||||
use Spatie\Permission\Models\Role;
|
||||
use Spatie\Permission\PermissionRegistrar;
|
||||
use Tests\TestCase;
|
||||
|
||||
/**
|
||||
* Dalla bozza al PDF ufficiale: l'anteprima non tocca niente, la conferma
|
||||
* pubblica esattamente quello che si è visto, o niente.
|
||||
*/
|
||||
class PubblicazionePiantinaTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
private const GEOMETRIA = [
|
||||
'type' => 'Polygon',
|
||||
'coordinates' => [[[13.35, 38.11], [13.37, 38.11], [13.37, 38.13], [13.35, 38.11]]],
|
||||
];
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->withoutVite();
|
||||
Storage::fake('public');
|
||||
Storage::fake('local');
|
||||
config(['piantine.formato' => 'jpeg']);
|
||||
|
||||
// Un JPEG vero: FPDF lo legge davvero quando compone il PDF.
|
||||
$immagine = imagecreatetruecolor(80, 50);
|
||||
imagefilledrectangle($immagine, 0, 0, 79, 49, imagecolorallocate($immagine, 230, 230, 230));
|
||||
ob_start();
|
||||
imagejpeg($immagine);
|
||||
$jpeg = ob_get_clean();
|
||||
imagedestroy($immagine);
|
||||
|
||||
$this->jpeg = $jpeg;
|
||||
}
|
||||
|
||||
private string $jpeg;
|
||||
|
||||
private function rendererRisponde(): void
|
||||
{
|
||||
Http::fake(['*/render' => Http::response($this->jpeg)]);
|
||||
}
|
||||
|
||||
public function test_l_anteprima_si_prepara_senza_toccare_territorio_ne_piantina(): void
|
||||
{
|
||||
[$territorio, $mappa] = $this->piantinaCollegata();
|
||||
$servizio = app(PubblicazionePiantina::class);
|
||||
|
||||
// In test la coda è sincrona: il job ha già lavorato al ritorno.
|
||||
$token = $servizio->avvia($mappa);
|
||||
|
||||
$this->assertSame(PubblicazionePiantina::PRONTA, $servizio->stato($token)['stato']);
|
||||
$this->assertStringStartsWith('%PDF', file_get_contents($servizio->pdfAnteprima($token)));
|
||||
|
||||
$this->assertNull($territorio->fresh()->pdf_path);
|
||||
$this->assertNull($mappa->fresh()->pubblicata_at);
|
||||
$this->assertNull($mappa->fresh()->image_path);
|
||||
$this->assertSame(TerritorioMappa::STATO_BOZZA, $mappa->fresh()->stato());
|
||||
}
|
||||
|
||||
public function test_il_pdf_dell_anteprima_si_vede_solo_con_il_token_giusto(): void
|
||||
{
|
||||
[, $mappa] = $this->piantinaCollegata();
|
||||
$token = app(PubblicazionePiantina::class)->avvia($mappa);
|
||||
|
||||
$this->actingAs($this->admin())
|
||||
->get(route('piantine.anteprima', $token))
|
||||
->assertOk()
|
||||
->assertHeader('Content-Type', 'application/pdf');
|
||||
|
||||
$this->actingAs($this->admin())
|
||||
->get(route('piantine.anteprima', str_repeat('a', 40)))
|
||||
->assertNotFound();
|
||||
}
|
||||
|
||||
public function test_la_conferma_sostituisce_il_pdf_e_archivia_il_precedente(): void
|
||||
{
|
||||
[$territorio, $mappa] = $this->piantinaCollegata();
|
||||
Storage::disk('public')->put('territori-pdf/vecchio.pdf', '%PDF-vecchio');
|
||||
$territorio->update(['pdf_path' => 'territori-pdf/vecchio.pdf']);
|
||||
|
||||
$servizio = app(PubblicazionePiantina::class);
|
||||
$token = $servizio->avvia($mappa);
|
||||
|
||||
$this->actingAs($this->admin());
|
||||
$servizio->conferma($token);
|
||||
|
||||
$territorio->refresh();
|
||||
$mappa->refresh();
|
||||
|
||||
$this->assertStringStartsWith('territori-pdf/piantina-' . $territorio->id . '-', $territorio->pdf_path);
|
||||
Storage::disk('public')->assertExists($territorio->pdf_path);
|
||||
$this->assertSame(1, TerritorioPdfVersione::where('territorio_id', $territorio->id)->count());
|
||||
|
||||
$this->assertNotNull($mappa->image_path);
|
||||
Storage::disk('public')->assertExists($mappa->image_path);
|
||||
$this->assertSame(TerritorioMappa::STATO_PUBBLICATA, $mappa->stato());
|
||||
$this->assertSame($mappa->geojson, $mappa->geojson_pubblicato);
|
||||
|
||||
// L'anteprima confermata non resta in giro.
|
||||
$this->assertNull($servizio->stato($token));
|
||||
$this->assertSame([], Storage::disk('local')->files('piantine-anteprime'));
|
||||
}
|
||||
|
||||
public function test_se_la_piantina_cambia_dopo_l_anteprima_la_conferma_viene_rifiutata(): void
|
||||
{
|
||||
[$territorio, $mappa] = $this->piantinaCollegata();
|
||||
$servizio = app(PubblicazionePiantina::class);
|
||||
$token = $servizio->avvia($mappa);
|
||||
|
||||
// I confini sono stampati sulla cartolina: cambiarli rende vecchia l'anteprima.
|
||||
$territorio->update(['confini' => 'Nord: via Nuova']);
|
||||
|
||||
try {
|
||||
$servizio->conferma($token);
|
||||
$this->fail('La conferma doveva essere rifiutata.');
|
||||
} catch (RuntimeException $e) {
|
||||
$this->assertStringContainsString('cambiat', $e->getMessage());
|
||||
}
|
||||
|
||||
$this->assertNull($territorio->fresh()->pdf_path);
|
||||
$this->assertNull($mappa->fresh()->pubblicata_at);
|
||||
}
|
||||
|
||||
public function test_una_piantina_scollegata_non_si_pubblica(): void
|
||||
{
|
||||
$mappa = TerritorioMappa::create(['geojson' => json_encode(self::GEOMETRIA)]);
|
||||
|
||||
$this->expectException(RuntimeException::class);
|
||||
app(PubblicazionePiantina::class)->avvia($mappa);
|
||||
}
|
||||
|
||||
public function test_un_renderer_che_non_risponde_lascia_un_errore_leggibile(): void
|
||||
{
|
||||
Http::fake(['*/render' => Http::response(['error' => 'area troppo estesa'], 413)]);
|
||||
[, $mappa] = $this->piantinaCollegata(renderer: false);
|
||||
|
||||
$servizio = app(PubblicazionePiantina::class);
|
||||
$token = $servizio->avvia($mappa);
|
||||
|
||||
$stato = $servizio->stato($token);
|
||||
$this->assertSame(PubblicazionePiantina::ERRORE, $stato['stato']);
|
||||
$this->assertStringContainsString('area troppo estesa', $stato['messaggio']);
|
||||
$this->assertNull($servizio->pdfAnteprima($token));
|
||||
}
|
||||
|
||||
public function test_annullare_butta_l_anteprima(): void
|
||||
{
|
||||
[, $mappa] = $this->piantinaCollegata();
|
||||
$servizio = app(PubblicazionePiantina::class);
|
||||
$token = $servizio->avvia($mappa);
|
||||
|
||||
$servizio->annulla($token);
|
||||
|
||||
$this->assertNull($servizio->stato($token));
|
||||
$this->assertSame([], Storage::disk('local')->files('piantine-anteprime'));
|
||||
}
|
||||
|
||||
public function test_la_finestra_porta_dalla_richiesta_alla_conferma(): void
|
||||
{
|
||||
[$territorio, $mappa] = $this->piantinaCollegata();
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(Pubblicazione::class)
|
||||
->dispatch('pubblica-piantina', mappaId: $mappa->id)
|
||||
->assertSet('fase', PubblicazionePiantina::PRONTA)
|
||||
->assertSee('Anteprima del PDF da pubblicare', false)
|
||||
->call('conferma')
|
||||
->assertSet('mappaId', null)
|
||||
->assertDispatched('piantina-pubblicata', mappaId: $mappa->id);
|
||||
|
||||
$this->assertSame(TerritorioMappa::STATO_PUBBLICATA, $mappa->fresh()->stato());
|
||||
$this->assertNotNull($territorio->fresh()->pdf_path);
|
||||
}
|
||||
|
||||
public function test_chiudere_la_finestra_non_pubblica_niente(): void
|
||||
{
|
||||
[$territorio, $mappa] = $this->piantinaCollegata();
|
||||
|
||||
Livewire::actingAs($this->admin())
|
||||
->test(Pubblicazione::class)
|
||||
->dispatch('pubblica-piantina', mappaId: $mappa->id)
|
||||
->call('chiudi')
|
||||
->assertSet('mappaId', null);
|
||||
|
||||
$this->assertNull($territorio->fresh()->pdf_path);
|
||||
$this->assertSame([], Storage::disk('local')->files('piantine-anteprime'));
|
||||
}
|
||||
|
||||
// ─── Stati del modello ──────────────────────────────────────────────────
|
||||
|
||||
public function test_dopo_la_pubblicazione_ogni_dato_stampato_riporta_la_piantina_da_pubblicare(): void
|
||||
{
|
||||
[$territorio, $mappa] = $this->piantinaCollegata();
|
||||
$servizio = app(PubblicazionePiantina::class);
|
||||
$this->actingAs($this->admin());
|
||||
$servizio->conferma($servizio->avvia($mappa));
|
||||
|
||||
$this->assertSame(TerritorioMappa::STATO_PUBBLICATA, $mappa->fresh()->stato());
|
||||
|
||||
$territorio->update(['zona_id' => Zona::create(['nome' => 'Altra', 'attivo' => true])->id]);
|
||||
$this->assertSame(TerritorioMappa::STATO_MODIFICATA, $mappa->fresh()->stato());
|
||||
}
|
||||
|
||||
public function test_un_pdf_sostituito_per_altre_vie_riporta_la_piantina_da_pubblicare(): void
|
||||
{
|
||||
[$territorio, $mappa] = $this->piantinaCollegata();
|
||||
$servizio = app(PubblicazionePiantina::class);
|
||||
$this->actingAs($this->admin());
|
||||
$servizio->conferma($servizio->avvia($mappa));
|
||||
|
||||
$territorio->update(['pdf_path' => 'territori-pdf/caricato-a-mano.pdf']);
|
||||
|
||||
$this->assertSame(TerritorioMappa::STATO_MODIFICATA, $mappa->fresh()->stato());
|
||||
}
|
||||
|
||||
public function test_motivo_non_pubblicabile_dice_cosa_manca(): void
|
||||
{
|
||||
$senzaDisegno = TerritorioMappa::create(['geojson' => 'rotto']);
|
||||
$this->assertStringContainsString('Disegna', $senzaDisegno->motivoNonPubblicabile());
|
||||
|
||||
$scollegata = TerritorioMappa::create(['geojson' => json_encode(self::GEOMETRIA)]);
|
||||
$this->assertStringContainsString('Collega', $scollegata->motivoNonPubblicabile());
|
||||
|
||||
[$territorio, $mappa] = $this->piantinaCollegata();
|
||||
$this->assertNull($mappa->motivoNonPubblicabile());
|
||||
|
||||
$territorio->delete();
|
||||
$this->assertStringContainsString('cestino', $mappa->fresh()->motivoNonPubblicabile());
|
||||
$this->assertSame('Terr. 7', $mappa->fresh()->etichetta());
|
||||
}
|
||||
|
||||
private function piantinaCollegata(bool $renderer = true): array
|
||||
{
|
||||
if ($renderer) {
|
||||
$this->rendererRisponde();
|
||||
}
|
||||
|
||||
$zona = Zona::firstOrCreate(['nome' => 'Centro'], ['attivo' => true]);
|
||||
$territorio = Territorio::create([
|
||||
'numero' => '7',
|
||||
'attivo' => true,
|
||||
'zona_id' => $zona->id,
|
||||
'confini' => 'Nord: via Roma',
|
||||
]);
|
||||
$mappa = TerritorioMappa::create([
|
||||
'territorio_id' => $territorio->id,
|
||||
'geojson' => json_encode(self::GEOMETRIA),
|
||||
]);
|
||||
|
||||
return [$territorio, $mappa];
|
||||
}
|
||||
|
||||
private function admin(): User
|
||||
{
|
||||
Role::firstOrCreate(['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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user