diff options
Diffstat (limited to 'tests/test_webpage.py')
| -rw-r--r-- | tests/test_webpage.py | 68 |
1 files changed, 34 insertions, 34 deletions
diff --git a/tests/test_webpage.py b/tests/test_webpage.py index 97abb91..06f2af7 100644 --- a/tests/test_webpage.py +++ b/tests/test_webpage.py @@ -9,51 +9,51 @@ from claude_logbook import webpage PAYLOAD_RE = re.compile( r'<script id="payload" type="application/json">(.*?)</script>', re.S) -REGISTRO = {"id": "abc", "p": "/proj", "u": 1, "c": [{"r": "u", "x": "hola"}]} +LOG_NAME = {"id": "abc", "p": "/proj", "u": 1, "c": [{"r": "u", "x": "hola"}]} class TestPayload(unittest.TestCase): - def test_escapa_el_cierre_de_etiqueta(self): + def test_escapes_the_closing_tag(self): raw = webpage.encode_payload({"s": [{"x": "mirá este </script> de acá"}]}) self.assertNotIn("</", raw) self.assertEqual(json.loads(raw)["s"][0]["x"], "mirá este </script> de acá") - def test_no_escapa_a_ascii(self): + def test_does_not_escape_to_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]) + def test_separates_sessions_from_memories(self): + payload = webpage.build_payload([LOG_NAME], [{"name": "algo"}]) + self.assertEqual(payload["s"], [LOG_NAME]) self.assertEqual(payload["m"], [{"name": "algo"}]) - def test_sin_memorias_igual_trae_la_clave(self): - self.assertEqual(webpage.build_payload([REGISTRO])["m"], []) + def test_no_memories_still_has_the_key(self): + self.assertEqual(webpage.build_payload([LOG_NAME])["m"], []) class TestRender(unittest.TestCase): - def test_reemplaza_el_marcador(self): - html = webpage.render([REGISTRO], template="<b>__DATA__</b>") + def test_replaces_the_marker(self): + html = webpage.render([LOG_NAME], template="<b>__DATA__</b>") self.assertNotIn("__DATA__", html) self.assertIn('"id":"abc"', html) - def test_falla_si_el_template_no_tiene_marcador(self): + def test_fails_if_the_template_has_no_marker(self): with self.assertRaises(webpage.TemplateError): - webpage.render([REGISTRO], template="<b>sin marcador</b>") + webpage.render([LOG_NAME], template="<b>sin marcador</b>") - def test_falla_si_el_marcador_esta_repetido(self): + def test_fails_if_the_marker_is_repeated(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 "</script>" y "__DATA__" adentro del texto. - peligrosa = dict(REGISTRO, c=[{"r": "u", "x": "poné </script><img> 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"], + webpage.render([LOG_NAME], template="__DATA__ y __DATA__") + + def test_transcript_with_html_does_not_cut_the_script(self): + # The case that motivates the escape: a session that talked about this very + # generator has "</script>" and "__DATA__" inside the text. + dangerous = dict(LOG_NAME, c=[{"r": "u", "x": "poné </script><img> y __DATA__"}]) + html = webpage.render([dangerous]) + + blocks = PAYLOAD_RE.findall(html) + self.assertEqual(len(blocks), 1) + round_trip = json.loads(blocks[0]) + self.assertEqual(round_trip["s"][0]["c"][0]["x"], "poné </script><img> y __DATA__") @@ -61,28 +61,28 @@ class TestTemplate(unittest.TestCase): def setUp(self): self.html = webpage.template_text() - def test_el_template_del_paquete_tiene_un_solo_marcador(self): + def test_packaged_template_has_a_single_marker(self): self.assertEqual(self.html.count(webpage.MARKER), 1) - def test_es_un_documento_completo(self): + def test_is_a_complete_document(self): # Sin doctype ni charset, un file:// se abre en quirks mode y con la - # codificación del sistema: los acentos salen rotos. + # system encoding: accents come out broken. self.assertTrue(self.html.lstrip().startswith("<!doctype html>")) self.assertIn('<meta charset="utf-8">', self.html) self.assertIn('name="viewport"', self.html) self.assertTrue(self.html.rstrip().endswith("</html>")) - def test_no_pide_nada_por_red(self): + def test_makes_no_network_requests(self): for atributo in ("src=\"http", "href=\"http", "@import"): self.assertNotIn(atributo, self.html) - def test_se_puede_pasar_otro_template(self): + def test_another_template_can_be_passed(self): with tempfile.NamedTemporaryFile("w", suffix=".html", delete=False, encoding="utf-8") as f: f.write("propio __DATA__") - ruta = f.name - self.addCleanup(os.unlink, ruta) - self.assertTrue(webpage.template_text(ruta).startswith("propio")) + path_str = f.name + self.addCleanup(os.unlink, path_str) + self.assertTrue(webpage.template_text(path_str).startswith("propio")) class TestWrite(unittest.TestCase): @@ -90,7 +90,7 @@ class TestWrite(unittest.TestCase): with tempfile.TemporaryDirectory() as d: out = os.path.join(d, "s.html") stats = webpage.write( - [REGISTRO, dict(REGISTRO, id="def", p="/otro", u=2)], out) + [LOG_NAME, dict(LOG_NAME, id="def", p="/otro", u=2)], out) self.assertEqual(stats, {"sesiones": 2, "proyectos": 2, "mensajes": 3, "bloques": 2, "memorias": 0}) |