++ gruppi: le azioni del sorvegliante non finiscono piu' in 403; priorita' e filtri nel pacchetto; nome del sorvegliante
- LimitaSorvegliante: la rotta delle azioni di Livewire 3.7 si chiama "default.livewire.update"; con 'livewire.*' ogni clic era un 403. - Territorio::ordinaPerPriorita(): la regola di "Da assegnare" della Home in un metodo solo, usato dalla Home, dall'aggiunta al pacchetto e da "Il mio gruppo". - Aggiunta al pacchetto: ricerca, zona, tipologia, solo prioritari, "Seleziona tutti quelli mostrati", badge e giorni di fermo. - Il mio gruppo: da dare in ordine di priorita' poi i gia' dati; filtri stato, zona, tipologia, solo prioritari; sotto il titolo nome e cognome del sorvegliante. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -609,6 +609,104 @@ class GruppiServizioTest extends TestCase
|
||||
}
|
||||
}
|
||||
|
||||
// ─── Le azioni del sorvegliante passano dal middleware ──────
|
||||
|
||||
public function test_le_azioni_livewire_del_sorvegliante_non_finiscono_in_403(): void
|
||||
{
|
||||
// Livewire::test() non passa dai middleware delle rotte: qui si chiama
|
||||
// la rotta vera delle azioni (in Livewire 3.7 "default.livewire.update",
|
||||
// che il filtro 'livewire.*' non riconosceva: ogni clic era un 403).
|
||||
['sorvegliante' => $s] = $this->gruppo();
|
||||
$this->flushSession();
|
||||
$rotta = collect(app('router')->getRoutes()->getRoutes())
|
||||
->first(fn ($r) => str_ends_with($r->uri(), 'livewire/update'));
|
||||
$this->assertNotNull($rotta);
|
||||
|
||||
$this->withoutExceptionHandling();
|
||||
try {
|
||||
$this->actingAs($s)->post('/' . ltrim($rotta->uri(), '/'), ['components' => []], ['X-Livewire' => 'true']);
|
||||
} catch (\Symfony\Component\HttpKernel\Exception\HttpException $e) {
|
||||
$this->assertNotSame(403, $e->getStatusCode(), $e->getMessage());
|
||||
} catch (\Throwable) {
|
||||
// Livewire rifiuta la richiesta vuota: non è il 403 del sorvegliante.
|
||||
}
|
||||
$this->addToAssertionCount(1);
|
||||
}
|
||||
|
||||
// ─── Priorità e filtri ──────────────────────────────────────
|
||||
|
||||
/** Territori in reparto con giacenze diverse: 40 (200 gg), 41 (50 gg), 42 (spunta prioritario), 43 (nuovo). */
|
||||
private function territoriConPriorita(): array
|
||||
{
|
||||
$zona = \App\Models\Zona::create(['nome' => 'Noce', 'attivo' => true]);
|
||||
$altra = \App\Models\Zona::create(['nome' => 'Zisa', 'attivo' => true]);
|
||||
$t = [];
|
||||
foreach (['40' => 200, '41' => 50, '42' => 0, '43' => 0] as $numero => $giorni) {
|
||||
$t[$numero] = $this->territorio($numero);
|
||||
$t[$numero]->forceFill([
|
||||
'created_at' => now()->subDays($giorni),
|
||||
'prioritario' => $numero === '42',
|
||||
'zona_id' => $numero === '43' ? $altra->id : $zona->id,
|
||||
])->save();
|
||||
}
|
||||
|
||||
return $t;
|
||||
}
|
||||
|
||||
public function test_aggiungendo_al_pacchetto_i_territori_sono_in_ordine_di_priorita_e_filtrabili(): void
|
||||
{
|
||||
['gruppo' => $gruppo] = $this->gruppo();
|
||||
$t = $this->territoriConPriorita();
|
||||
|
||||
$pagina = Livewire::test(GruppoShow::class, ['gruppo' => $gruppo]);
|
||||
// Prima i prioritari (per giacenza), poi gli altri: la regola della Home.
|
||||
$this->assertSame(['40', '42', '41', '43'], $pagina->viewData('candidatiTerritori')->pluck('numero')->all());
|
||||
$pagina->assertSee('★ Prioritario')->assertSee('fermo da 200 gg');
|
||||
|
||||
$pagina->set('soloPrioritari', true);
|
||||
$this->assertSame(['40', '42'], $pagina->viewData('candidatiTerritori')->pluck('numero')->all());
|
||||
|
||||
$pagina->set('soloPrioritari', false)->set('filtroZona', (string) $t['43']->zona_id);
|
||||
$this->assertSame(['43'], $pagina->viewData('candidatiTerritori')->pluck('numero')->all());
|
||||
|
||||
$pagina->set('filtroZona', '')->set('cercaTerritorio', '41');
|
||||
$this->assertSame(['41'], $pagina->viewData('candidatiTerritori')->pluck('numero')->all());
|
||||
|
||||
// "Seleziona tutti quelli mostrati" e aggiunta in blocco.
|
||||
$pagina->set('cercaTerritorio', '')->set('soloPrioritari', true)
|
||||
->call('selezionaMostrati')
|
||||
->call('aggiungiTerritori');
|
||||
$this->assertSame($gruppo->id, $t['40']->fresh()->gruppo_servizio_id);
|
||||
$this->assertSame($gruppo->id, $t['42']->fresh()->gruppo_servizio_id);
|
||||
$this->assertNull($t['41']->fresh()->gruppo_servizio_id);
|
||||
}
|
||||
|
||||
public function test_il_sorvegliante_vede_il_pacchetto_in_ordine_di_priorita_e_lo_filtra(): void
|
||||
{
|
||||
['gruppo' => $gruppo, 'sorvegliante' => $s, 'verdi' => $verdi, 'territori' => $vecchi] = $this->gruppo();
|
||||
$t = $this->territoriConPriorita();
|
||||
app(GruppiServizio::class)->aggiungiAlPacchetto($gruppo, collect($t)->pluck('id')->all());
|
||||
// Il pacchetto di gruppo() (12, 14, 35) va via, tranne il 12 che si dà.
|
||||
app(GruppiServizio::class)->assegna($gruppo, $vecchi[0], $verdi, now());
|
||||
app(GruppiServizio::class)->rimandaInReparto($gruppo, $vecchi[1]->fresh());
|
||||
app(GruppiServizio::class)->rimandaInReparto($gruppo, $vecchi[2]->fresh());
|
||||
$this->flushSession();
|
||||
|
||||
$pagina = Livewire::actingAs($s)->test(MioGruppo::class)
|
||||
->assertSee('Sorvegliante: <strong>Mario Rossi</strong>', false);
|
||||
// Da dare in ordine di priorità, poi quelli già dati.
|
||||
$this->assertSame(['40', '42', '41', '43', '12'], $pagina->viewData('territori')->pluck('numero')->all());
|
||||
|
||||
$pagina->set('filtroStato', 'da_dare');
|
||||
$this->assertSame(['40', '42', '41', '43'], $pagina->viewData('territori')->pluck('numero')->all());
|
||||
$pagina->set('filtroStato', 'dati');
|
||||
$this->assertSame(['12'], $pagina->viewData('territori')->pluck('numero')->all());
|
||||
$pagina->set('filtroStato', '')->set('soloPrioritari', true);
|
||||
$this->assertSame(['40', '42'], $pagina->viewData('territori')->pluck('numero')->all());
|
||||
$pagina->set('soloPrioritari', false)->set('filtroZona', (string) $t['43']->zona_id);
|
||||
$this->assertSame(['43'], $pagina->viewData('territori')->pluck('numero')->all());
|
||||
}
|
||||
|
||||
// ─── Backup e azzeramento ───────────────────────────────────
|
||||
|
||||
public function test_l_azzeramento_toglie_anche_gruppi_e_utenza_del_sorvegliante(): void
|
||||
|
||||
Reference in New Issue
Block a user