Migrazione: rimuove i tag orfani training.performance-class.*

Il riquadro training "performance-class" è stato rimosso dal seed nel commit
9966ec3, ma i suoi 5 tag restavano nei DB esistenti come orfani non
renderizzati (uno con un edit errato dell'editor, "Holistic Class"). Aggiunge
una DELETE idempotente per l'intero gruppo; il seed non li reinserisce
(trainings.ts non ha più questo id). Verificata su copia del DB prod: 5 -> 0
orfani, riquadri validi e 39 edit reali del pannello intatti.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-21 00:16:52 +02:00
parent 21d9755e37
commit 22c9cadb43
2 changed files with 28 additions and 0 deletions
+6
View File
@@ -183,6 +183,12 @@ export function createDb(path?: string): Database.Database {
// valore → idempotente, non tocca eventuali modifiche del pannello.
db.prepare("UPDATE content_blocks SET value = 'Performance Class' WHERE tag = 'service.performance-class.title' AND value = 'Class'").run();
// Pulizia tag orfani: il riquadro training "performance-class" è stato rimosso dal seed
// (commit 9966ec3, "Training: 6 riquadri"), ma i suoi tag restano nei DB esistenti — orfani,
// non renderizzati da nessuna pagina. Rimuoviamo l'intero gruppo. Idempotente. Il seed non li
// reinserisce (trainings.ts non ha più questo id).
db.prepare("DELETE FROM content_blocks WHERE tag LIKE 'training.performance-class.%'").run();
// Modifiche 03: due ingressi dello stesso stabile → indirizzo esteso in footer e contatti.
// Il tag global.contact.map-query è nuovo (inserito dal seed); qui si aggiorna solo l'indirizzo
// già esistente, se non modificato dal pannello. Idempotente.
+22
View File
@@ -139,6 +139,28 @@ describe('schema content_blocks e ruoli', () => {
}
});
it('rimuove i tag orfani training.performance-class.* (riquadro rimosso)', () => {
const dir = mkdtempSync(join(tmpdir(), 'il-db-orf-'));
const path = join(dir, 'test.db');
try {
// DB con i tag orfani del vecchio riquadro performance-class.
const db1 = createDb(path);
const ins = db1.prepare("INSERT OR REPLACE INTO content_blocks (tag, type, value, guid) VALUES (?, 'text', ?, ?)");
ins.run('training.performance-class.title', 'Holistic Class', 'g1');
ins.run('training.performance-class.caption', 'Classi fino a 8 persone', 'g2');
db1.close();
const db2 = createDb(path);
const count = (db2.prepare("SELECT count(*) c FROM content_blocks WHERE tag LIKE 'training.performance-class.%'").get() as { c: number }).c;
expect(count).toBe(0);
// I riquadri validi restano.
expect((db2.prepare("SELECT count(*) c FROM content_blocks WHERE tag = 'training.holistic-class.title'").get() as { c: number }).c).toBe(1);
db2.close();
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
it('migra un DB esistente senza colonna role', () => {
// simula DB vecchio: createDb due volte sullo stesso path in-memory non è possibile,
// quindi si verifica che la migrazione sia idempotente (doppia esecuzione non lancia)