netgescon-day0/tests/Unit/SisterCatastoServiceTest.php

181 lines
5.8 KiB
PHP

<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\Amministratore;
use App\Models\FeCassettoServiceConfig;
use App\Models\Stabile;
use App\Services\SisterCatastoService;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Illuminate\Foundation\Testing\RefreshDatabase;
use ZipArchive;
class SisterCatastoServiceTest extends TestCase
{
use RefreshDatabase;
protected function setUp(): void
{
parent::setUp();
Storage::fake('public');
}
public function test_it_resolves_inherited_credentials_successfully()
{
// Pulisce eventuali config preesistenti
FeCassettoServiceConfig::query()->truncate();
// Crea la configurazione globale
FeCassettoServiceConfig::query()->create([
'password_script' => 'fallback_script',
'base_url' => 'https://thenetworksolution.it/FattureCorrispettivi/ScaricaFatture/CassettoFiscale.php',
'username' => 'fallback_user',
'password' => 'fallback_pass',
'pin' => '12345',
]);
$service = new SisterCatastoService();
$reflector = new \ReflectionClass(SisterCatastoService::class);
$method = $reflector->getMethod('resolveCredentials');
$method->setAccessible(true);
$creds = $method->invoke($service, 1);
$this->assertEquals('fallback_script', $creds['passwordScript']);
$this->assertEquals('https://thenetworksolution.it/FattureCorrispettivi/ScaricaFatture/CassettoFiscale.php', $creds['base_url']);
$this->assertNotEmpty($creds['app_url']);
}
public function test_it_resolves_credentials_fallback_to_admin_id_4()
{
FeCassettoServiceConfig::query()->truncate();
Amministratore::query()->where('id', 4)->delete();
// Crea amministratore ID 4
$admin = Amministratore::factory()->create([
'id' => 4,
'fe_cassetto_password_script' => 'admin_4_script_key',
]);
$service = new SisterCatastoService();
$reflector = new \ReflectionClass(SisterCatastoService::class);
$method = $reflector->getMethod('resolveCredentials');
$method->setAccessible(true);
$creds = $method->invoke($service, 1);
$this->assertEquals('admin_4_script_key', $creds['passwordScript']);
}
public function test_it_calculates_correct_isolated_storage_paths()
{
$admin = Amministratore::factory()->create([
'codice_amministratore' => 'HWFGITXK',
]);
$stabile = Stabile::factory()->create([
'codice_stabile' => '0021',
'denominazione' => 'Milizie 3',
'amministratore_id' => $admin->id,
]);
$service = new SisterCatastoService();
$path = $service->getStoragePath($stabile->id);
$this->assertEquals('AMMINISTRATORE_HWFGITXK/STABILE_0021_Milizie_3/catasto', $path);
}
public function test_it_skips_api_call_when_cache_is_valid()
{
$admin = Amministratore::factory()->create([
'codice_amministratore' => 'HWFGITXK',
]);
$stabile = Stabile::factory()->create([
'codice_stabile' => '0021',
'amministratore_id' => $admin->id,
]);
$service = new SisterCatastoService();
$dirPath = $service->getStoragePath($stabile->id);
$localFilename = "visura_F_12_34_sub5.pdf";
Storage::disk('public')->put("{$dirPath}/{$localFilename}", "Fake PDF Content");
// Effettua la richiesta con cache=24. Dovrebbe ritornare cached = true senza chiamare HTTP
$res = $service->acquistaEPrelevaVisura(
$stabile->id,
'F',
'ROMA Territorio-RM',
'H501#ROMA#0#0',
'12',
'34',
'5',
null,
null,
'PDF',
'completa',
24
);
$this->assertTrue($res['cached']);
$this->assertEquals("{$dirPath}/{$localFilename}", $res['file_path']);
}
public function test_it_extracts_zip_archives_for_omoimmobili()
{
Http::fake([
'*/mashVisuraI.php' => Http::response([
'url' => 'https://thenetworksolution.it/sister/acquistate/multiple_visure.zip'
], 200),
'*/acquistate/multiple_visure.zip' => Http::response($this->generateFakeZipContent(), 200)
]);
$admin = Amministratore::factory()->create([
'codice_amministratore' => 'HWFGITXK',
]);
$stabile = Stabile::factory()->create([
'codice_stabile' => '0021',
'amministratore_id' => $admin->id,
]);
$service = new SisterCatastoService();
$dirPath = $service->getStoragePath($stabile->id);
$res = $service->acquistaEPrelevaVisura(
$stabile->id,
'F',
'ROMA Territorio-RM',
'H501#ROMA#0#0',
'12',
'34',
'5',
null,
null,
'PDF',
'completa',
0 // Disabilita cache per forzare chiamata http fake
);
$this->assertTrue($res['zip_extracted']);
$this->assertTrue(Storage::disk('public')->exists("{$dirPath}/visura1.pdf"));
$this->assertTrue(Storage::disk('public')->exists("{$dirPath}/visura2.pdf"));
}
protected function generateFakeZipContent(): string
{
$tempZipPath = tempnam(sys_get_temp_dir(), 'test_zip_');
$zip = new ZipArchive();
if ($zip->open($tempZipPath, ZipArchive::CREATE) === true) {
$zip->addFromString('visura1.pdf', 'Content of visura 1');
$zip->addFromString('visura2.pdf', 'Content of visura 2');
$zip->close();
}
$content = file_get_contents($tempZipPath);
unlink($tempZipPath);
return $content;
}
}