seed(RolesAndPermissionsSeeder::class); } private function utente(string $ruolo): User { $utente = User::create([ 'name' => ucfirst($ruolo), 'email' => $ruolo . '@example.test', 'password' => 'password-di-prova', ]); $utente->assignRole($ruolo); return $utente; } private function territorioConFile(): Territorio { Storage::disk('public')->put('territori-pdf/territorio-1-1.pdf', '%PDF-1.4 prova'); Storage::disk('public')->put('territori-thumbnails/territorio-1.jpg', "\xFF\xD8\xFFprova"); return Territorio::create([ 'numero' => '12', 'attivo' => true, 'pdf_path' => 'territori-pdf/territorio-1-1.pdf', 'thumbnail_path' => 'territori-thumbnails/territorio-1.jpg', ]); } public function test_senza_login_i_file_non_si_scaricano(): void { $territorio = $this->territorioConFile(); $this->get($territorio->pdfUrl())->assertRedirect(route('login')); $this->get($territorio->miniaturaUrl())->assertRedirect(route('login')); } public function test_un_operatore_scarica_pdf_e_miniatura_in_cache_privata(): void { $territorio = $this->territorioConFile(); $operatore = $this->utente('operatore'); $risposta = $this->actingAs($operatore)->get($territorio->pdfUrl()); $risposta->assertOk(); $risposta->assertHeader('Content-Type', 'application/pdf'); $this->assertStringContainsString('private', $risposta->headers->get('Cache-Control')); $this->assertStringContainsString('territorio-12.pdf', $risposta->headers->get('Content-Disposition')); $this->actingAs($operatore)->get($territorio->miniaturaUrl())->assertOk(); } public function test_un_territorio_nel_cestino_resta_raggiungibile(): void { $territorio = $this->territorioConFile(); $territorio->delete(); $this->actingAs($this->utente('assistente')) ->get(route('territori.file.miniatura', $territorio->id)) ->assertOk(); } public function test_un_file_mancante_risponde_404(): void { $territorio = Territorio::create(['numero' => '13', 'attivo' => true, 'pdf_path' => 'territori-pdf/sparito.pdf']); $this->actingAs($this->utente('operatore')) ->get(route('territori.file.pdf', $territorio->id)) ->assertNotFound(); } public function test_le_versioni_archiviate_sono_solo_dell_amministratore(): void { $territorio = $this->territorioConFile(); Storage::disk('public')->put('territori-pdf-versioni/vecchia.pdf', '%PDF-1.4 vecchia'); $versione = TerritorioPdfVersione::create([ 'territorio_id' => $territorio->id, 'pdf_path' => 'territori-pdf-versioni/vecchia.pdf', 'origine' => 'piantine', 'sostituito_il' => now(), ]); $this->actingAs($this->utente('operatore')) ->get(route('territori.file.versione', $versione)) ->assertForbidden(); // Due utenti nella stessa sessione: AuthenticateSession butterebbe fuori il secondo. $this->flushSession(); $this->actingAs($this->utente('amministratore')) ->get(route('territori.file.versione', $versione)) ->assertOk(); } public function test_l_indirizzo_cambia_quando_cambia_il_file(): void { $territorio = $this->territorioConFile(); $prima = $territorio->pdfUrl(); $territorio->update(['pdf_path' => 'territori-pdf/territorio-1-2.pdf']); $this->assertNotSame($prima, $territorio->pdfUrl()); $this->assertNull(Territorio::create(['numero' => '99', 'attivo' => true])->pdfUrl()); } /** nginx non deve servire le cartelle dei territori (il logo sì). */ public function test_nginx_blocca_le_cartelle_dei_territori(): void { $conf = file_get_contents(base_path('docker/nginx/default.conf')); $this->assertMatchesRegularExpression('#location \^~ /storage/territori- \{\s*return 404;#', $conf); } }