2017-01-06 15:11:15 +01:00
|
|
|
import os
|
2020-06-11 00:54:34 +02:00
|
|
|
import unittest
|
2016-09-11 20:23:29 +02:00
|
|
|
|
|
|
|
import tools.lib.template_parser
|
|
|
|
from tools.lib.html_branches import (
|
2020-06-11 00:54:34 +02:00
|
|
|
build_id_dict,
|
2016-09-11 20:23:29 +02:00
|
|
|
get_tag_info,
|
|
|
|
html_branches,
|
|
|
|
html_tag_tree,
|
2017-01-06 15:11:15 +01:00
|
|
|
split_for_id_and_class,
|
2016-09-11 20:23:29 +02:00
|
|
|
)
|
|
|
|
|
2017-01-18 22:04:32 +01:00
|
|
|
ZULIP_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
TEST_TEMPLATES_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_template_data")
|
2016-09-11 20:23:29 +02:00
|
|
|
|
|
|
|
class TestHtmlBranches(unittest.TestCase):
|
|
|
|
|
2017-12-13 06:45:46 +01:00
|
|
|
def test_get_tag_info(self) -> None:
|
2016-09-11 20:23:29 +02:00
|
|
|
html = """
|
|
|
|
<p id="test" class="test1 test2">foo</p>
|
|
|
|
"""
|
|
|
|
|
|
|
|
start_tag, end_tag = tools.lib.template_parser.tokenize(html)
|
|
|
|
|
|
|
|
start_tag_info = get_tag_info(start_tag)
|
|
|
|
end_tag_info = get_tag_info(end_tag)
|
|
|
|
|
|
|
|
self.assertEqual(start_tag_info.text(), 'p.test1.test2#test')
|
|
|
|
self.assertEqual(end_tag_info.text(), 'p')
|
|
|
|
|
2017-12-13 06:45:46 +01:00
|
|
|
def test_html_tag_tree(self) -> None:
|
2016-09-11 20:23:29 +02:00
|
|
|
html = """
|
|
|
|
<!-- test -->
|
|
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
|
|
<!-- test -->
|
|
|
|
<head>
|
|
|
|
<title>Test</title>
|
|
|
|
<meta charset="utf-8" />
|
|
|
|
<link rel="stylesheet" href="style.css" />
|
|
|
|
</head>
|
|
|
|
<body>
|
2020-04-18 11:38:31 +02:00
|
|
|
<p>Hello<br>world!</p>
|
2016-09-11 20:23:29 +02:00
|
|
|
<p>Goodbye<!-- test -->world!</p>
|
|
|
|
</body>
|
|
|
|
</html>
|
|
|
|
<!-- test -->
|
|
|
|
"""
|
|
|
|
|
|
|
|
tree = html_tag_tree(html)
|
|
|
|
|
2020-07-05 02:59:37 +02:00
|
|
|
assert tree.children[0].token is not None
|
2016-09-11 20:23:29 +02:00
|
|
|
self.assertEqual(tree.children[0].token.kind, 'html_start')
|
|
|
|
self.assertEqual(tree.children[0].token.tag, 'html')
|
|
|
|
|
2020-07-05 02:59:37 +02:00
|
|
|
assert tree.children[0].children[0].token is not None
|
2016-09-11 20:23:29 +02:00
|
|
|
self.assertEqual(tree.children[0].children[0].token.kind, 'html_start')
|
|
|
|
self.assertEqual(tree.children[0].children[0].token.tag, 'head')
|
|
|
|
|
2020-07-05 02:59:37 +02:00
|
|
|
assert tree.children[0].children[0].children[0].token is not None
|
2016-09-11 20:23:29 +02:00
|
|
|
self.assertEqual(tree.children[0].children[0].children[0].token.kind, 'html_start')
|
|
|
|
self.assertEqual(tree.children[0].children[0].children[0].token.tag, 'title')
|
|
|
|
|
2020-07-05 02:59:37 +02:00
|
|
|
assert tree.children[0].children[1].token is not None
|
2016-09-11 20:23:29 +02:00
|
|
|
self.assertEqual(tree.children[0].children[1].token.kind, 'html_start')
|
|
|
|
self.assertEqual(tree.children[0].children[1].token.tag, 'body')
|
|
|
|
|
2020-07-05 02:59:37 +02:00
|
|
|
assert tree.children[0].children[1].children[0].token is not None
|
2016-09-11 20:23:29 +02:00
|
|
|
self.assertEqual(tree.children[0].children[1].children[0].token.kind, 'html_start')
|
|
|
|
self.assertEqual(tree.children[0].children[1].children[0].token.tag, 'p')
|
|
|
|
|
2020-07-05 02:59:37 +02:00
|
|
|
assert tree.children[0].children[1].children[0].children[0].token is not None
|
2016-09-11 20:23:29 +02:00
|
|
|
self.assertEqual(tree.children[0].children[1].children[0].children[0].token.kind, 'html_singleton')
|
|
|
|
self.assertEqual(tree.children[0].children[1].children[0].children[0].token.tag, 'br')
|
|
|
|
|
2020-07-05 02:59:37 +02:00
|
|
|
assert tree.children[0].children[1].children[1].token is not None
|
2016-09-11 20:23:29 +02:00
|
|
|
self.assertEqual(tree.children[0].children[1].children[1].token.kind, 'html_start')
|
|
|
|
self.assertEqual(tree.children[0].children[1].children[1].token.tag, 'p')
|
|
|
|
|
2017-12-13 06:45:46 +01:00
|
|
|
def test_html_branches(self) -> None:
|
2016-09-11 20:23:29 +02:00
|
|
|
html = """
|
|
|
|
<!-- test -->
|
|
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
|
|
<!-- test -->
|
|
|
|
<head>
|
|
|
|
<title>Test</title>
|
|
|
|
<meta charset="utf-8" />
|
|
|
|
<link rel="stylesheet" href="style.css" />
|
|
|
|
</head>
|
|
|
|
<body>
|
2020-04-18 11:38:31 +02:00
|
|
|
<p>Hello<br>world!</p>
|
2016-09-11 20:23:29 +02:00
|
|
|
<p>Goodbye<!-- test -->world!</p>
|
|
|
|
</body>
|
|
|
|
</html>
|
|
|
|
<!-- test -->
|
|
|
|
"""
|
|
|
|
|
|
|
|
branches = html_branches(html)
|
|
|
|
|
|
|
|
self.assertEqual(branches[0].text(), 'html head title')
|
|
|
|
self.assertEqual(branches[1].text(), 'html body p br')
|
|
|
|
self.assertEqual(branches[2].text(), 'html body p')
|
|
|
|
|
|
|
|
self.assertEqual(branches[0].staircase_text(), '\n html\n head\n title\n')
|
|
|
|
self.assertEqual(branches[1].staircase_text(), '\n html\n body\n p\n br\n')
|
|
|
|
self.assertEqual(branches[2].staircase_text(), '\n html\n body\n p\n')
|
2017-01-06 15:11:15 +01:00
|
|
|
|
2017-12-13 06:45:46 +01:00
|
|
|
def test_build_id_dict(self) -> None:
|
2017-01-06 15:11:15 +01:00
|
|
|
templates = ["test_template1.html", "test_template2.html"]
|
|
|
|
templates = [os.path.join(TEST_TEMPLATES_DIR, fn) for fn in templates]
|
|
|
|
|
|
|
|
template_id_dict = build_id_dict(templates)
|
|
|
|
|
2017-01-18 22:04:32 +01:00
|
|
|
self.assertEqual(set(template_id_dict.keys()), {'below_navbar', 'hello_{{ message }}', 'intro'})
|
2017-01-06 15:11:15 +01:00
|
|
|
self.assertEqual(template_id_dict['hello_{{ message }}'], [
|
2020-06-10 06:41:04 +02:00
|
|
|
f'Line 12:{ZULIP_PATH}/tools/tests/test_template_data/test_template1.html',
|
|
|
|
f'Line 12:{ZULIP_PATH}/tools/tests/test_template_data/test_template2.html'])
|
2017-01-06 15:11:15 +01:00
|
|
|
self.assertEqual(template_id_dict['intro'], [
|
2020-06-10 06:41:04 +02:00
|
|
|
f'Line 10:{ZULIP_PATH}/tools/tests/test_template_data/test_template1.html',
|
|
|
|
f'Line 11:{ZULIP_PATH}/tools/tests/test_template_data/test_template1.html',
|
|
|
|
f'Line 11:{ZULIP_PATH}/tools/tests/test_template_data/test_template2.html'])
|
2017-01-18 22:04:32 +01:00
|
|
|
self.assertEqual(template_id_dict['below_navbar'], [
|
2020-06-10 06:41:04 +02:00
|
|
|
f'Line 10:{ZULIP_PATH}/tools/tests/test_template_data/test_template2.html'])
|
2017-01-06 15:11:15 +01:00
|
|
|
|
2017-12-13 06:45:46 +01:00
|
|
|
def test_split_for_id_and_class(self) -> None:
|
2017-01-06 15:11:15 +01:00
|
|
|
id1 = "{{ red|blue }}"
|
|
|
|
id2 = "search_box_{{ page }}"
|
|
|
|
|
|
|
|
class1 = "chat_box message"
|
|
|
|
class2 = "stream_{{ topic }}"
|
|
|
|
class3 = "foo {{ a|b|c }} bar"
|
|
|
|
|
|
|
|
self.assertEqual(split_for_id_and_class(id1), ['{{ red|blue }}'])
|
|
|
|
self.assertEqual(split_for_id_and_class(id2), ['search_box_{{ page }}'])
|
|
|
|
|
|
|
|
self.assertEqual(split_for_id_and_class(class1), ['chat_box', 'message'])
|
|
|
|
self.assertEqual(split_for_id_and_class(class2), ['stream_{{ topic }}'])
|
|
|
|
self.assertEqual(split_for_id_and_class(class3), ['foo', '{{ a|b|c }}', 'bar'])
|