revisione, analista: taglio Telegram sul testo grezzo, prima di escape/markup (#35 C13)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -345,6 +345,21 @@ def test_il_taglio_a_4096_si_DICHIARA():
|
||||
assert "tagliato" in m and "docs/journal/2026-08-23.md" in m
|
||||
|
||||
|
||||
def test_taglio_a_cavallo_di_entita_e_tag_resta_HTML_valido():
|
||||
"""(#35 C13) Il taglio e' sul GREZZO, prima di _b/html.escape e prima di **-><b>: un '&' o
|
||||
un '**grassetto**' a cavallo del punto di taglio non deve produrre un'entita' spezzata
|
||||
(es. '&am') ne' un <b> senza chiusura -- Telegram rifiuta l'INTERO messaggio altrimenti
|
||||
("can't parse entities"). Il pattern si ripete per tutta la lunghezza, cosi' il punto di
|
||||
taglio (qualunque sia) cade sempre dentro o a cavallo di un '&' o di '**...**'."""
|
||||
pattern = "parola & altra parola **in grassetto** ancora testo "
|
||||
analisi = pattern * 200 # ben oltre qualunque budget qui
|
||||
m = A.per_telegram(_voce_piena(), analisi, "ok", [])
|
||||
assert "tagliato" in m
|
||||
assert re.search(r"&(?!amp;|lt;|gt;)", m) is None # nessuna entita' spezzata o '&' nudo
|
||||
assert m.count("<b>") == m.count("</b>") # ogni <b> aperto e' chiuso
|
||||
assert m.count("<i>") == m.count("</i>")
|
||||
|
||||
|
||||
def test_un_messaggio_normale_non_viene_toccato():
|
||||
m = A.per_telegram(_voce_piena(), "Analisi breve.", "ok", [])
|
||||
assert "tagliato" not in m and m.endswith("Analisi breve.")
|
||||
|
||||
@@ -132,6 +132,18 @@ def test_telegram_porta_la_sintesi_e_dichiara_il_taglio():
|
||||
assert "[… sintesi tagliata" in lunga and len(lunga) < 4096
|
||||
|
||||
|
||||
def test_taglio_a_cavallo_di_una_entita_resta_HTML_valido():
|
||||
"""(#35 C13) Un '&' esattamente al taglio non deve spezzarsi in un'entita' a meta' (es.
|
||||
'&am'): il taglio e' sul GREZZO, prima di html.escape, quindi il carattere e' incluso o
|
||||
escluso per intero — mai spezzato a meta' entita'."""
|
||||
sintesi = "a" * (R.LIMITE_TELEGRAM - 1) + "&resto che verra' tagliato via di sicuro"
|
||||
tg = R.per_telegram(_revisione(sintesi=sintesi), None, "ok", ADESSO, Path("p.md"))
|
||||
assert "[… sintesi tagliata" in tg
|
||||
corpo = tg.split("\n\n", 1)[1].split("\n[…", 1)[0]
|
||||
assert corpo == "a" * (R.LIMITE_TELEGRAM - 1) + "&" # il '&' e' incluso PER INTERO
|
||||
assert "&am;" not in tg and "resto che verra'" not in tg # niente entita' a meta', niente coda
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- orchestrazione: cosa scrive, cosa no
|
||||
|
||||
def _albero(root: Path) -> set[str]:
|
||||
|
||||
Reference in New Issue
Block a user