import json
import os
import re
import tempfile
import unittest
from claude_logbook import webpage
PAYLOAD_RE = re.compile(
r'', re.S)
REGISTRO = {"id": "abc", "p": "/proj", "u": 1, "c": [{"r": "u", "x": "hola"}]}
class TestPayload(unittest.TestCase):
def test_escapa_el_cierre_de_etiqueta(self):
raw = webpage.encode_payload({"s": [{"x": "mirá este de acá"}]})
self.assertNotIn("", raw)
self.assertEqual(json.loads(raw)["s"][0]["x"], "mirá este de acá")
def test_no_escapa_a_ascii(self):
self.assertIn("ñ", webpage.encode_payload({"s": [{"x": "año"}]}))
def test_separa_sesiones_de_memorias(self):
payload = webpage.build_payload([REGISTRO], [{"name": "algo"}])
self.assertEqual(payload["s"], [REGISTRO])
self.assertEqual(payload["m"], [{"name": "algo"}])
def test_sin_memorias_igual_trae_la_clave(self):
self.assertEqual(webpage.build_payload([REGISTRO])["m"], [])
class TestRender(unittest.TestCase):
def test_reemplaza_el_marcador(self):
html = webpage.render([REGISTRO], template="__DATA__")
self.assertNotIn("__DATA__", html)
self.assertIn('"id":"abc"', html)
def test_falla_si_el_template_no_tiene_marcador(self):
with self.assertRaises(webpage.TemplateError):
webpage.render([REGISTRO], template="sin marcador")
def test_falla_si_el_marcador_esta_repetido(self):
with self.assertRaises(webpage.TemplateError):
webpage.render([REGISTRO], template="__DATA__ y __DATA__")
def test_una_transcripcion_con_html_no_corta_el_script(self):
# El caso que motiva el escape: una sesión donde se habló de este mismo
# generador tiene "" y "__DATA__" adentro del texto.
peligrosa = dict(REGISTRO, c=[{"r": "u", "x": "poné
y __DATA__"}])
html = webpage.render([peligrosa])
bloques = PAYLOAD_RE.findall(html)
self.assertEqual(len(bloques), 1)
vuelta = json.loads(bloques[0])
self.assertEqual(vuelta["s"][0]["c"][0]["x"],
"poné
y __DATA__")
class TestTemplate(unittest.TestCase):
def setUp(self):
self.html = webpage.template_text()
def test_el_template_del_paquete_tiene_un_solo_marcador(self):
self.assertEqual(self.html.count(webpage.MARKER), 1)
def test_es_un_documento_completo(self):
# Sin doctype ni charset, un file:// se abre en quirks mode y con la
# codificación del sistema: los acentos salen rotos.
self.assertTrue(self.html.lstrip().startswith(""))
self.assertIn('', self.html)
self.assertIn('name="viewport"', self.html)
self.assertTrue(self.html.rstrip().endswith("