netgescon-day0/tests/Feature/ReconstructMirror0021Test.php

86 lines
3.2 KiB
PHP

<?php
use App\Models\PersonaUnitaRelazione;
use App\Models\Stabile;
use App\Models\UnitaImmobiliare;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
test('gescon:reconstruct-mirror-0021 reconstructs units, personas and subentro relations with full 644 quadratura', function () {
// Step 0: Ensure Amministratore and Stabile exist in test environment
DB::table('amministratori')->insertOrIgnore(['id' => 1, 'nome' => 'Admin Test', 'cognome' => 'Test', 'created_at' => now(), 'updated_at' => now()]);
$stabile = Stabile::firstOrCreate(
['codice_stabile' => '0021'],
[
'denominazione' => 'SUPERCONDOMINIO MILIZIE 3',
'indirizzo' => 'Viale delle Milizie 3',
'cap' => '00192',
'citta' => 'Roma',
'provincia' => 'RM',
'codice_fiscale' => '80000000021',
'amministratore_id' => 1,
'attivo' => true,
]
);
// Step 1: Ensure condomin_mirror is populated
$mirrorCount = DB::connection('gescon_import')
->table('condomin_mirror')
->where('cod_stabile', '0021')
->count();
if ($mirrorCount === 0) {
Artisan::call('gescon:import-mirror-0021');
}
// Step 2: Run reconstruction command
$exitCode = Artisan::call('gescon:reconstruct-mirror-0021');
expect($exitCode)->toBe(0);
$stabile = Stabile::where('codice_stabile', '0021')->first();
expect($stabile)->not->toBeNull();
// Step 3: Verify physical units count
$unitsCount = UnitaImmobiliare::where('stabile_id', $stabile->id)->count();
expect($unitsCount)->toBe(230);
// Step 4: Verify Scala A Int 11 subentro relations (ATER uscente + Benedetto Daniela subentrante)
$unitA11 = UnitaImmobiliare::where('stabile_id', $stabile->id)
->where('scala', 'A')
->where('interno', '11')
->first();
expect($unitA11)->not->toBeNull();
$relA11 = PersonaUnitaRelazione::where('unita_id', $unitA11->id)
->orderBy('id')
->get();
expect($relA11->count())->toBe(2);
$aterRel = $relA11->first(fn ($r) => $r->id_cond === '12');
$benedettoRel = $relA11->first(fn ($r) => $r->id_cond === '220');
expect($aterRel)->not->toBeNull()
->and($aterRel->attivo)->toBeFalse()
->and($aterRel->attivo_fino_al)->toBe('06/08/26 00:00:00')
->and($aterRel->subentro_adesso_ce)->toBe('220')
->and($aterRel->persona->nome_completo)->toContain('ATER');
expect($benedettoRel)->not->toBeNull()
->and($benedettoRel->attivo)->toBeTrue()
->and($benedettoRel->subentrato_dal)->toBe('06/09/26 00:00:00')
->and($benedettoRel->subentro_prima_cera)->toBe('12')
->and($benedettoRel->persona->nome_completo)->toContain('BENEDETTO DANIELA');
// Step 5: Test Idempotency (re-run command)
$secondExit = Artisan::call('gescon:reconstruct-mirror-0021');
expect($secondExit)->toBe(0);
$unitsCountSecond = UnitaImmobiliare::where('stabile_id', $stabile->id)->count();
expect($unitsCountSecond)->toBe(230);
$relA11Second = PersonaUnitaRelazione::where('unita_id', $unitA11->id)->count();
expect($relA11Second)->toBe(2);
});