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:
@@ -183,6 +183,12 @@ export function createDb(path?: string): Database.Database {
|
|||||||
// valore → idempotente, non tocca eventuali modifiche del pannello.
|
// 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();
|
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.
|
// 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
|
// Il tag global.contact.map-query è nuovo (inserito dal seed); qui si aggiorna solo l'indirizzo
|
||||||
// già esistente, se non modificato dal pannello. Idempotente.
|
// già esistente, se non modificato dal pannello. Idempotente.
|
||||||
|
|||||||
@@ -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', () => {
|
it('migra un DB esistente senza colonna role', () => {
|
||||||
// simula DB vecchio: createDb due volte sullo stesso path in-memory non è possibile,
|
// 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)
|
// quindi si verifica che la migrazione sia idempotente (doppia esecuzione non lancia)
|
||||||
|
|||||||
Reference in New Issue
Block a user