withoutVite(); } /** * Rotte senza parametri. Quelle con un modello nell'URL hanno un test a * parte, perche' hanno bisogno che il modello esista. * * @return array */ public static function rotteSempliciProvider(): array { $rotte = [ 'dashboard', 'profile', 'territori.index', 'territori.create', 'territori.cestino', 'proclamatori.index', 'proclamatori.create', 'proclamatori.cestino', 'campagne.index', 'campagne.create', 'registro.index', 'audit.index', 'settings.edit', 'users.index', 'zone.index', 'tipologie.index', 'xml.exchange', 'privacy', 'assegnazioni.assegna', ]; return array_combine( $rotte, array_map(fn (string $rotta) => [$rotta], $rotte) ); } #[DataProvider('rotteSempliciProvider')] public function test_la_pagina_si_apre_senza_markup_rimasto_da_compilare(string $rotta): void { $risposta = $this->actingAs($this->admin())->get(route($rotta)); $risposta->assertOk(); $this->assertNessunTagDaCompilare($risposta->getContent(), $rotta); } public function test_le_pagine_legate_a_un_record_si_aprono(): void { $this->actingAs($this->admin()); $territorio = Territorio::create(['numero' => '1', 'attivo' => true]); $proclamatore = Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true]); $campagna = Campagna::create([ 'descrizione' => 'Campagna di prova', 'start_date' => '2026-01-01', 'end_date' => '2026-12-31', ]); $assegnazione = Assegnazione::create([ 'territorio_id' => $territorio->id, 'proclamatore_id' => $proclamatore->id, 'anno_teocratico_id' => AnnoTeocratico::corrente()->id, 'assigned_at' => '2026-02-01', 'created_by' => auth()->id(), ]); $pagine = [ 'territori.show' => route('territori.show', $territorio), 'territori.edit' => route('territori.edit', $territorio), 'proclamatori.show' => route('proclamatori.show', $proclamatore), 'proclamatori.edit' => route('proclamatori.edit', $proclamatore), 'campagne.show' => route('campagne.show', $campagna), 'campagne.edit' => route('campagne.edit', $campagna), 'assegnazioni.rientra' => route('assegnazioni.rientra', $assegnazione), ]; foreach ($pagine as $nome => $url) { $risposta = $this->get($url); $risposta->assertOk(); $this->assertNessunTagDaCompilare($risposta->getContent(), $nome); } } public function test_la_schermata_di_cambio_password_si_apre(): void { $risposta = $this->actingAs($this->admin())->get(route('password.change')); $risposta->assertOk(); $this->assertNessunTagDaCompilare($risposta->getContent(), 'password.change'); } public function test_la_pagina_di_accesso_si_apre(): void { $risposta = $this->get(route('login')); $risposta->assertOk(); $this->assertNessunTagDaCompilare($risposta->getContent(), 'login'); } private function assertNessunTagDaCompilare(string $html, string $dove): void { $this->assertStringNotContainsString(' rimasto da compilare."); $this->assertStringNotContainsString('', $html, "{$dove}: tag rimasto da compilare."); $this->assertStringNotContainsString('btn-action', $html, "{$dove}: e' rimasta una classe .btn-action, che non esiste piu' nel foglio di stile."); } private function admin(): User { Role::findOr('amministratore', fn () => Role::create(['name' => 'amministratore', 'guard_name' => 'web'])); app(PermissionRegistrar::class)->forgetCachedPermissions(); // La testata legge le impostazioni: senza riga, il nome della // congregazione ricade sul default e va bene lo stesso, ma le pagine // che leggono le soglie vogliono trovarla. Setting::firstOrCreate([], ['congregazione_nome' => 'Congregazione di prova']); $utente = User::create([ 'name' => 'Amministratore', 'email' => 'admin@example.test', 'password' => 'password-di-prova', ]); $utente->assignRole('amministratore'); return $utente; } }