mirror of
https://github.com/zulip/zulip.git
synced 2025-11-13 10:26:28 +00:00
This starts to address 1533. I still think the </p> tags should be on their own line lined up with the start tag, so the linter won't let through the specific example shown in the ticket.
155 lines
4.2 KiB
Python
155 lines
4.2 KiB
Python
from __future__ import absolute_import
|
|
from __future__ import print_function
|
|
|
|
import sys
|
|
import unittest
|
|
|
|
try:
|
|
from tools.lib.template_parser import (
|
|
html_tag_tree,
|
|
is_django_block_tag,
|
|
tokenize,
|
|
validate,
|
|
)
|
|
except ImportError:
|
|
print('ERROR!!! You need to run this via tools/test-tools.')
|
|
sys.exit(1)
|
|
|
|
class ParserTest(unittest.TestCase):
|
|
def test_is_django_block_tag(self):
|
|
# type: () -> None
|
|
self.assertTrue(is_django_block_tag('block'))
|
|
self.assertFalse(is_django_block_tag('not a django tag'))
|
|
|
|
def test_validate_vanilla_html(self):
|
|
# type: () -> None
|
|
'''
|
|
Verify that validate() does not raise errors for
|
|
well-formed HTML.
|
|
'''
|
|
my_html = '''
|
|
<table>
|
|
<tr>
|
|
<td>foo</td>
|
|
</tr>
|
|
</table>'''
|
|
validate(text=my_html)
|
|
|
|
def test_validate_handlebars(self):
|
|
# type: () -> None
|
|
my_html = '''
|
|
{{#with stream}}
|
|
<p>{{stream}}</p>
|
|
{{/with}}
|
|
'''
|
|
validate(text=my_html)
|
|
|
|
def test_validate_django(self):
|
|
# type: () -> None
|
|
my_html = '''
|
|
{% include "some_other.html" %}
|
|
{% if foo %}
|
|
<p>bar</p>
|
|
{% endif %}
|
|
'''
|
|
validate(text=my_html)
|
|
|
|
def test_code_blocks(self):
|
|
# type: () -> None
|
|
|
|
# This is fine.
|
|
my_html = '''
|
|
<code>
|
|
x = 5
|
|
y = x + 1
|
|
</code>'''
|
|
validate(text=my_html)
|
|
|
|
# This is also fine.
|
|
my_html = "<code>process_widgets()</code>"
|
|
validate(text=my_html)
|
|
|
|
# This is illegal.
|
|
my_html = '''
|
|
<code>x =
|
|
5</code>
|
|
'''
|
|
# See https://github.com/python/typeshed/issues/372
|
|
# for why we have to ingore types here.
|
|
with self.assertRaisesRegexp(Exception, 'split across two lines'): # type: ignore
|
|
validate(text=my_html)
|
|
|
|
def test_anchor_blocks(self):
|
|
# type: () -> None
|
|
|
|
# This is allowed, although strange.
|
|
my_html = '''
|
|
<a hef="/some/url">
|
|
Click here
|
|
for more info.
|
|
</a>'''
|
|
validate(text=my_html)
|
|
|
|
# This is fine.
|
|
my_html = '<a href="/some/url">click here</a>'
|
|
validate(text=my_html)
|
|
|
|
# Even this is fine.
|
|
my_html = '''
|
|
<a class="twitter-timeline" href="https://twitter.com/ZulipStatus"
|
|
data-widget-id="443457763394334720"
|
|
data-screen-name="ZulipStatus"
|
|
>@ZulipStatus on Twitter</a>.
|
|
'''
|
|
validate(text=my_html)
|
|
|
|
|
|
def test_tokenize(self):
|
|
# type: () -> None
|
|
tag = '<meta whatever>bla'
|
|
token = tokenize(tag)[0]
|
|
self.assertEqual(token.kind, 'html_special')
|
|
|
|
tag = '<a>bla'
|
|
token = tokenize(tag)[0]
|
|
self.assertEqual(token.kind, 'html_start')
|
|
self.assertEqual(token.tag, 'a')
|
|
|
|
tag = '<br />bla'
|
|
token = tokenize(tag)[0]
|
|
self.assertEqual(token.kind, 'html_singleton')
|
|
self.assertEqual(token.tag, 'br')
|
|
|
|
tag = '</a>bla'
|
|
token = tokenize(tag)[0]
|
|
self.assertEqual(token.kind, 'html_end')
|
|
self.assertEqual(token.tag, 'a')
|
|
|
|
tag = '{{#with foo}}bla'
|
|
token = tokenize(tag)[0]
|
|
self.assertEqual(token.kind, 'handlebars_start')
|
|
self.assertEqual(token.tag, 'with')
|
|
|
|
tag = '{{/with}}bla'
|
|
token = tokenize(tag)[0]
|
|
self.assertEqual(token.kind, 'handlebars_end')
|
|
self.assertEqual(token.tag, 'with')
|
|
|
|
tag = '{% if foo %}bla'
|
|
token = tokenize(tag)[0]
|
|
self.assertEqual(token.kind, 'django_start')
|
|
self.assertEqual(token.tag, 'if')
|
|
|
|
tag = '{% endif %}bla'
|
|
token = tokenize(tag)[0]
|
|
self.assertEqual(token.kind, 'django_end')
|
|
self.assertEqual(token.tag, 'if')
|
|
|
|
def test_html_tag_tree(self):
|
|
# type: () -> None
|
|
html = '''
|
|
<body><p>Hello world</p></body>
|
|
'''
|
|
tree = html_tag_tree(html)
|
|
self.assertEqual(tree.children[0].children[0].token.s, '<p>')
|