withoutVite(); Role::findOr('amministratore', fn () => Role::create(['name' => 'amministratore', 'guard_name' => 'web'])); app(PermissionRegistrar::class)->forgetCachedPermissions(); Setting::firstOrCreate([], ['congregazione_nome' => 'Congregazione di prova']); $this->utente = User::create([ 'name' => 'Amministratore', 'email' => 'admin@example.test', 'password' => 'password-di-prova', ]); $this->utente->assignRole('amministratore'); $this->actingAs($this->utente); $this->proclamatore = Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true]); $this->anno = AnnoTeocratico::corrente(); } public function test_senza_assegnazioni_chiuse_la_media_e_zero(): void { $this->assertSame(0, $this->media()); } public function test_un_assegnazione_ancora_aperta_non_entra_nella_media(): void { $this->assegnazione($this->anno->start_date->copy()->addDays(10), null); $this->assertSame(0, $this->media()); } public function test_la_media_e_in_mesi_da_trenta_giorni_e_mezzo(): void { // 10 e 20 giorni: media 15, cioè 15/30,44 = 0,5 mesi. $this->assegnazioneDiGiorni(10); $this->assegnazioneDiGiorni(20); $this->assertSame(0.5, $this->media()); } public function test_un_rientro_nello_stesso_giorno_non_abbassa_la_media(): void { $this->assegnazioneDiGiorni(30); $this->assegnazioneDiGiorni(0); // Senza il filtro la media sarebbe 15 giorni invece di 30. $this->assertSame(1.0, $this->media()); } /** * La conversione del vecchio database ha lasciato qualche data impossibile: * il filtro esisteva per quelle, e deve continuare a esistere. */ public function test_una_data_antecedente_al_1900_viene_ignorata(): void { $this->assegnazioneDiGiorni(30); $this->assegnazione('1899-01-01', '1899-03-01'); $this->assertSame(1.0, $this->media()); } public function test_le_assegnazioni_di_un_altro_anno_non_entrano_nella_media(): void { $this->assegnazioneDiGiorni(30); $altroAnno = AnnoTeocratico::create([ 'label' => '2000-2001', 'start_date' => '2000-09-01', 'end_date' => '2001-08-31', ]); $this->assegnazione('2000-09-01', '2001-03-01', $altroAnno); $this->assertSame(1.0, $this->media()); } // ─── helper ───────────────────────────────────────────────── private function media(): float|int { $valore = Livewire::test(Home::class)->viewData('mediaDurataPercorrenzaMesi'); return $valore; } private function assegnazioneDiGiorni(int $giorni): void { $inizio = $this->anno->start_date->copy()->addDays(5); $this->assegnazione($inizio, $inizio->copy()->addDays($giorni)); } private function assegnazione(mixed $da, mixed $a, ?AnnoTeocratico $anno = null): void { $territorio = Territorio::create([ 'numero' => (string) $this->prossimoTerritorio++, 'attivo' => true, ]); Assegnazione::create([ 'territorio_id' => $territorio->id, 'proclamatore_id' => $this->proclamatore->id, 'anno_teocratico_id' => ($anno ?? $this->anno)->id, 'assigned_at' => $da, 'returned_at' => $a, 'created_by' => $this->utente->id, ]); } }