Piantine pubblicate anche dopo un ripristino; posto unico senza gare
- Lo stato "Pubblicata" non dipende più dall'id del territorio, che il ripristino ricrea: l'impronta usa il numero, e la piantina ricorda il percorso del PDF pubblicato (pdf_pubblicato, con migrazione che riconosce le piantine già pubblicate). - BackupOperationState: corrente() in sola lettura e liberaCorrente() sotto lo stesso mutex di occupa(), così una lettura non cancella il puntatore di un'operazione appena avviata. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -212,6 +212,7 @@ XML;
|
||||
$mappa->update([
|
||||
'geojson_pubblicato' => $mappa->geojson,
|
||||
'impronta_pubblicata' => $mappa->impronta(),
|
||||
'pdf_pubblicato' => $pdf,
|
||||
'pubblicata_at' => now(),
|
||||
]);
|
||||
|
||||
|
||||
@@ -105,6 +105,26 @@ class RipristinoBackupTest extends TestCase
|
||||
$this->assertTrue(Storage::disk('public')->exists('territori-mappe/piantina-1.jpg'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Una piantina pubblicata resta "Pubblicata" anche se il ripristino ricrea
|
||||
* il suo territorio con un id nuovo: prima lo stato dipendeva dall'id.
|
||||
*/
|
||||
public function test_una_piantina_pubblicata_resta_pubblicata_dopo_il_ripristino(): void
|
||||
{
|
||||
$this->installazioneConPiantine();
|
||||
$mappa = TerritorioMappa::with('territorio.zona')->sole();
|
||||
$mappa->update([
|
||||
'impronta_pubblicata' => $mappa->impronta(),
|
||||
'pdf_pubblicato' => $mappa->territorio->pdf_path,
|
||||
]);
|
||||
$this->assertSame(TerritorioMappa::STATO_PUBBLICATA, $mappa->fresh()->stato());
|
||||
|
||||
$stato = $this->ripristina($this->backup());
|
||||
|
||||
$this->assertSame('completed', $stato['status'], (string) $stato['error']);
|
||||
$this->assertSame(TerritorioMappa::STATO_PUBBLICATA, TerritorioMappa::sole()->stato());
|
||||
}
|
||||
|
||||
/**
|
||||
* Compatibilita' all'indietro: un archivio di formato 1 si ripristina.
|
||||
* Non contiene piantine e storico, che restano vuoti — tenere quelle
|
||||
|
||||
@@ -65,15 +65,27 @@ class BackupOperationStateTest extends TestCase
|
||||
|
||||
/**
|
||||
* Il caso che il TTL da solo non copre: lo stato dell'operazione e' scaduto
|
||||
* ma il puntatore no. Senza questa pulizia il posto resterebbe occupato da
|
||||
* un'operazione che non esiste piu'.
|
||||
* ma il puntatore no. Il posto deve risultare libero e potersi prendere;
|
||||
* il puntatore lo sovrascrive l'operazione nuova (corrente() non lo
|
||||
* cancella: girando fuori dal mutex poteva togliere quello di un'altra).
|
||||
*/
|
||||
public function test_un_puntatore_orfano_non_tiene_occupato_il_posto(): void
|
||||
{
|
||||
Cache::put(self::CHIAVE_CORRENTE, 'op-svanita', 3600);
|
||||
|
||||
$this->assertNull($this->stato->corrente());
|
||||
$this->assertNull(Cache::get(self::CHIAVE_CORRENTE), 'Il puntatore orfano va anche rimosso.');
|
||||
$this->assertNull($this->stato->occupa('op-nuova', BackupOperationState::TIPO_BACKUP, 'In coda'));
|
||||
$this->assertSame('op-nuova', $this->stato->corrente());
|
||||
}
|
||||
|
||||
/** Un corrente() fuori dal mutex non deve togliere il puntatore appena scritto. */
|
||||
public function test_corrente_non_cancella_il_puntatore(): void
|
||||
{
|
||||
Cache::put(self::CHIAVE_CORRENTE, 'op-svanita', 3600);
|
||||
|
||||
$this->stato->corrente();
|
||||
|
||||
$this->assertSame('op-svanita', Cache::get(self::CHIAVE_CORRENTE));
|
||||
}
|
||||
|
||||
public function test_un_puntatore_a_un_operazione_gia_chiusa_non_tiene_occupato_il_posto(): void
|
||||
@@ -90,7 +102,7 @@ class BackupOperationStateTest extends TestCase
|
||||
Cache::put(self::CHIAVE_CORRENTE, 'op-1', 3600);
|
||||
|
||||
$this->assertNull($this->stato->corrente());
|
||||
$this->assertNull(Cache::get(self::CHIAVE_CORRENTE));
|
||||
$this->assertNull($this->stato->occupa('op-2', BackupOperationState::TIPO_BACKUP, 'In coda'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user