'42', 'attivo' => true]); return TerritorioMappa::create([ 'territorio_id' => $territorio->id, 'geojson' => self::GEOMETRIA, ]); } public function test_un_rendering_riuscito_salva_il_jpeg_e_aggiorna_la_mappa(): void { Http::fake(['*/render' => Http::response("\xFF\xD8\xFFcontenuto-finto")]); $mappa = $this->mappa(); $path = (new PiantinaRenderer())->render($mappa); Storage::disk('public')->assertExists($path); $this->assertStringEndsWith('.jpg', $path); $mappa->refresh(); $this->assertSame($path, $mappa->image_path); $this->assertNotNull($mappa->rendered_at); } /** * Formato e risoluzione non sono dettagli: la piantina finisce su una * cartolina da 146 mm, e sono i due numeri che decidono se il PDF pesa * mezzo megabyte o cinque. */ public function test_al_renderer_arrivano_formato_qualita_e_lato_massimo(): void { Http::fake(['*/render' => Http::response("\xFF\xD8\xFFcontenuto-finto")]); (new PiantinaRenderer())->render($this->mappa()); Http::assertSent(function ($request) { return $request['format'] === 'jpeg' && $request['quality'] === config('piantine.qualita') && $request['maxSide'] === config('piantine.max_side'); }); } /** * Passando da PNG a JPEG il vecchio file ha un'altra estensione: senza * rimozione esplicita resterebbe sul volume senza che niente lo referenzi. */ public function test_il_file_di_un_formato_precedente_viene_rimosso(): void { Http::fake(['*/render' => Http::response("\xFF\xD8\xFFcontenuto-finto")]); $mappa = $this->mappa(); $vecchio = 'territori-mappe/piantina-' . $mappa->id . '.png'; Storage::disk('public')->put($vecchio, 'vecchio-png'); $mappa->update(['image_path' => $vecchio]); (new PiantinaRenderer())->render($mappa->refresh()); Storage::disk('public')->assertMissing($vecchio); } public function test_un_errore_del_renderer_diventa_un_messaggio_leggibile(): void { Http::fake(['*/render' => Http::response(['error' => 'area troppo estesa'], 413)]); $this->expectException(RuntimeException::class); $this->expectExceptionMessage('area troppo estesa'); (new PiantinaRenderer())->render($this->mappa()); } public function test_una_risposta_che_non_e_un_immagine_viene_rifiutata(): void { Http::fake(['*/render' => Http::response('proxy error')]); $this->expectException(RuntimeException::class); (new PiantinaRenderer())->render($this->mappa()); } public function test_una_geometria_corrotta_blocca_prima_di_chiamare_il_renderer(): void { Http::fake(); $mappa = $this->mappa(); $mappa->update(['geojson' => 'non-json']); $this->expectException(RuntimeException::class); (new PiantinaRenderer())->render($mappa->refresh()); Http::assertNothingSent(); } }