148 lines
5.2 KiB
PHP
148 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit;
|
|
|
|
use App\Models\Territorio;
|
|
use App\Models\TerritorioMappa;
|
|
use App\Models\TerritorioPdfVersione;
|
|
use App\Services\Piantine\PiantinaPdfService;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use RuntimeException;
|
|
use Tests\TestCase;
|
|
|
|
/**
|
|
* Composizione del PDF sul modulo S-12 e giro completo dello storico:
|
|
* sostituzione, ripristino, e i casi in cui manca qualcosa.
|
|
*/
|
|
class PiantinaPdfServiceTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
Storage::fake('public');
|
|
Storage::fake('local');
|
|
}
|
|
|
|
/** Un territorio con immagine della piantina gia' renderizzata. */
|
|
private function territorioConImmagine(): array
|
|
{
|
|
$territorio = Territorio::create([
|
|
'numero' => '7',
|
|
'attivo' => true,
|
|
'confini' => "Nord: via Roma\nSud: via Milano",
|
|
]);
|
|
|
|
$mappa = TerritorioMappa::create([
|
|
'territorio_id' => $territorio->id,
|
|
'geojson' => '{"type":"Polygon","coordinates":[[[1,1],[2,1],[2,2],[1,1]]]}',
|
|
'image_path' => 'territori-mappe/territorio-' . $territorio->id . '.png',
|
|
'rendered_at' => now(),
|
|
]);
|
|
|
|
// Un PNG vero, piccolo: FPDF lo legge davvero, un finto no.
|
|
$immagine = imagecreatetruecolor(80, 50);
|
|
imagefilledrectangle($immagine, 0, 0, 79, 49, imagecolorallocate($immagine, 230, 230, 230));
|
|
ob_start();
|
|
imagepng($immagine);
|
|
Storage::disk('public')->put($mappa->image_path, ob_get_clean());
|
|
imagedestroy($immagine);
|
|
|
|
return [$territorio, $mappa];
|
|
}
|
|
|
|
private function servizio(): PiantinaPdfService
|
|
{
|
|
return app(PiantinaPdfService::class);
|
|
}
|
|
|
|
public function test_genera_produce_un_pdf_di_due_pagine(): void
|
|
{
|
|
[$territorio, $mappa] = $this->territorioConImmagine();
|
|
|
|
$pdf = $this->servizio()->genera($territorio, $mappa);
|
|
|
|
$this->assertStringStartsWith('%PDF', $pdf);
|
|
// FPDF conta le pagine nel catalogo: /Count 2.
|
|
$this->assertStringContainsString('/Count 2', $pdf);
|
|
}
|
|
|
|
public function test_genera_senza_immagine_si_ferma_con_un_messaggio_chiaro(): void
|
|
{
|
|
[$territorio, $mappa] = $this->territorioConImmagine();
|
|
Storage::disk('public')->delete($mappa->image_path);
|
|
|
|
$this->expectException(RuntimeException::class);
|
|
|
|
$this->servizio()->genera($territorio, $mappa);
|
|
}
|
|
|
|
public function test_sostituisci_archivia_il_pdf_precedente_nello_storico(): void
|
|
{
|
|
[$territorio, $mappa] = $this->territorioConImmagine();
|
|
Storage::disk('public')->put('territori-pdf/vecchio.pdf', '%PDF-vecchio');
|
|
$territorio->update(['pdf_path' => 'territori-pdf/vecchio.pdf']);
|
|
|
|
$this->servizio()->sostituisci($territorio, $mappa);
|
|
|
|
$territorio->refresh();
|
|
$this->assertNotSame('territori-pdf/vecchio.pdf', $territorio->pdf_path);
|
|
Storage::disk('public')->assertExists($territorio->pdf_path);
|
|
Storage::disk('public')->assertMissing('territori-pdf/vecchio.pdf');
|
|
|
|
$versione = TerritorioPdfVersione::sole();
|
|
$this->assertSame($territorio->id, $versione->territorio_id);
|
|
Storage::disk('public')->assertExists($versione->pdf_path);
|
|
$this->assertSame('%PDF-vecchio', Storage::disk('public')->get($versione->pdf_path));
|
|
}
|
|
|
|
public function test_sostituisci_senza_pdf_precedente_non_crea_versioni(): void
|
|
{
|
|
[$territorio, $mappa] = $this->territorioConImmagine();
|
|
|
|
$this->servizio()->sostituisci($territorio, $mappa);
|
|
|
|
$this->assertNotNull($territorio->refresh()->pdf_path);
|
|
$this->assertSame(0, TerritorioPdfVersione::count());
|
|
}
|
|
|
|
public function test_ripristina_rimette_in_vigore_la_versione_e_archivia_l_attuale(): void
|
|
{
|
|
[$territorio, $mappa] = $this->territorioConImmagine();
|
|
Storage::disk('public')->put('territori-pdf/vecchio.pdf', '%PDF-vecchio');
|
|
$territorio->update(['pdf_path' => 'territori-pdf/vecchio.pdf']);
|
|
|
|
$this->servizio()->sostituisci($territorio, $mappa);
|
|
$versione = TerritorioPdfVersione::sole();
|
|
|
|
$this->servizio()->ripristina($versione);
|
|
|
|
$territorio->refresh();
|
|
$this->assertSame('%PDF-vecchio', Storage::disk('public')->get($territorio->pdf_path));
|
|
|
|
// La versione usata e' sparita; al suo posto c'e' quella del PDF che
|
|
// era in vigore, quindi il ripristino resta a sua volta reversibile.
|
|
$this->assertSame(0, TerritorioPdfVersione::whereKey($versione->id)->count());
|
|
$this->assertSame(1, TerritorioPdfVersione::count());
|
|
$this->assertSame('ripristino', TerritorioPdfVersione::sole()->origine);
|
|
}
|
|
|
|
public function test_ripristina_con_file_sparito_si_ferma_con_un_messaggio_chiaro(): void
|
|
{
|
|
[$territorio] = $this->territorioConImmagine();
|
|
|
|
$versione = TerritorioPdfVersione::create([
|
|
'territorio_id' => $territorio->id,
|
|
'pdf_path' => 'territori-pdf-versioni/inesistente.pdf',
|
|
'origine' => 'sostituzione',
|
|
'sostituito_il' => now(),
|
|
]);
|
|
|
|
$this->expectException(RuntimeException::class);
|
|
|
|
$this->servizio()->ripristina($versione);
|
|
}
|
|
}
|