2020-07-22 21:02:31 +02:00
from unittest . mock import MagicMock , call , patch
2016-05-24 14:06:34 +02:00
from django . template . loader import get_template
2019-08-10 18:24:59 +02:00
2018-12-23 00:13:57 +01:00
from zerver . lib . exceptions import InvalidMarkdownIncludeStatement
2020-06-11 00:54:34 +02:00
from zerver . lib . test_classes import ZulipTestCase
2016-05-24 14:06:34 +02:00
2016-08-23 02:08:42 +02:00
class TemplateTestCase ( ZulipTestCase ) :
2017-11-05 10:51:25 +01:00
def test_markdown_in_template ( self ) - > None :
2016-05-11 19:01:53 +02:00
template = get_template ( " tests/test_markdown.html " )
context = {
2021-02-12 08:20:45 +01:00
" markdown_test_file " : " zerver/tests/markdown/test_markdown.md " ,
2016-05-11 19:01:53 +02:00
}
content = template . render ( context )
2021-02-12 08:20:45 +01:00
content_sans_whitespace = content . replace ( " " , " " ) . replace ( " \n " , " " )
2021-02-12 08:19:30 +01:00
self . assertEqual (
content_sans_whitespace ,
' header<h1id= " hello " >Hello!</h1><p>Thisissome<em>boldtext</em>.</p>footer ' ,
)
2016-05-11 19:29:29 +02:00
2018-09-07 00:09:51 +02:00
def test_markdown_tabbed_sections_extension ( self ) - > None :
template = get_template ( " tests/test_markdown.html " )
context = {
2021-02-12 08:20:45 +01:00
" markdown_test_file " : " zerver/tests/markdown/test_tabbed_sections.md " ,
2018-09-07 00:09:51 +02:00
}
content = template . render ( context )
2021-02-12 08:20:45 +01:00
content_sans_whitespace = content . replace ( " " , " " ) . replace ( " \n " , " " )
2018-09-07 00:09:51 +02:00
# Note that the expected HTML has a lot of stray <p> tags. This is a
# consequence of how the Markdown renderer converts newlines to HTML
# and how elements are delimited by newlines and so forth. However,
# stray <p> tags are usually matched with closing tags by HTML renderers
# so this doesn't affect the final rendered UI in any visible way.
expected_html = """
header
< h1 id = " heading " > Heading < / h1 >
< p >
2019-02-08 04:55:50 +01:00
< div class = " code-section has-tabs " markdown = " 1 " >
2018-09-07 00:09:51 +02:00
< ul class = " nav " >
2020-07-29 12:54:39 +02:00
< li data - language = " ios " tabindex = " 0 " > iOS < / li >
< li data - language = " desktop-web " tabindex = " 0 " > Desktop / Web < / li >
2018-09-07 00:09:51 +02:00
< / ul >
< div class = " blocks " >
< div data - language = " ios " markdown = " 1 " > < / p >
< p > iOS instructions < / p >
< p > < / div >
< div data - language = " desktop-web " markdown = " 1 " > < / p >
< p > Desktop / browser instructions < / p >
< p > < / div >
< / div >
< / div >
< / p >
< h2 id = " heading-2 " > Heading 2 < / h2 >
< p >
2019-02-08 04:55:50 +01:00
< div class = " code-section has-tabs " markdown = " 1 " >
2018-09-07 00:09:51 +02:00
< ul class = " nav " >
2020-07-29 12:54:39 +02:00
< li data - language = " desktop-web " tabindex = " 0 " > Desktop / Web < / li >
< li data - language = " android " tabindex = " 0 " > Android < / li >
2018-09-07 00:09:51 +02:00
< / ul >
< div class = " blocks " >
< div data - language = " desktop-web " markdown = " 1 " > < / p >
< p > Desktop / browser instructions < / p >
< p > < / div >
< div data - language = " android " markdown = " 1 " > < / p >
< p > Android instructions < / p >
< p > < / div >
< / div >
< / div >
< / p >
2019-02-08 04:55:50 +01:00
< h2 id = " heading-3 " > Heading 3 < / h2 >
< p >
< div class = " code-section no-tabs " markdown = " 1 " >
< ul class = " nav " >
2021-10-01 23:29:43 +02:00
< li data - language = " instructions-for-all-platforms " tabindex = " 0 " > Instructions for all platforms < / li >
2019-02-08 04:55:50 +01:00
< / ul >
< div class = " blocks " >
2021-10-01 23:29:43 +02:00
< div data - language = " instructions-for-all-platforms " markdown = " 1 " > < / p >
2019-02-08 04:55:50 +01:00
< p > Instructions for all platforms < / p >
< p > < / div >
< / div >
< / div >
< / p >
2018-09-07 00:09:51 +02:00
footer
"""
2021-02-12 08:20:45 +01:00
expected_html_sans_whitespace = expected_html . replace ( " " , " " ) . replace ( " \n " , " " )
2021-02-12 08:19:30 +01:00
self . assertEqual ( content_sans_whitespace , expected_html_sans_whitespace )
2018-09-07 00:09:51 +02:00
2021-09-27 23:15:24 +02:00
def test_markdown_tabbed_sections_missing_tabs ( self ) - > None :
template = get_template ( " tests/test_markdown.html " )
context = {
" markdown_test_file " : " zerver/tests/markdown/test_tabbed_sections_missing_tabs.md " ,
}
expected_regex = " ^Tab ' minix ' is not present in TAB_SECTION_LABELS in zerver/lib/markdown/tabbed_sections.py$ "
with self . assertRaisesRegex ( ValueError , expected_regex ) :
template . render ( context )
2018-07-07 22:14:30 +02:00
def test_markdown_nested_code_blocks ( self ) - > None :
template = get_template ( " tests/test_markdown.html " )
context = {
2021-02-12 08:20:45 +01:00
" markdown_test_file " : " zerver/tests/markdown/test_nested_code_blocks.md " ,
2018-07-07 22:14:30 +02:00
}
content = template . render ( context )
2021-02-12 08:20:45 +01:00
content_sans_whitespace = content . replace ( " " , " " ) . replace ( " \n " , " " )
2021-02-12 08:19:30 +01:00
expected = (
' header<h1id= " this-is-a-heading " >Thisisaheading.</h1><ol> '
' <li><p>Alistitemwithanindentedcodeblock:</p><divclass= " codehilite " > '
2021-02-12 08:20:45 +01:00
" <pre>indentedcodeblockwithmultiplelines</pre></div></li></ol> "
2021-02-12 08:19:30 +01:00
' <divclass= " codehilite " ><pre><span></span><code> '
2021-02-12 08:20:45 +01:00
" non-indentedcodeblockwithmultiplelines</code></pre></div>footer "
2021-02-12 08:19:30 +01:00
)
2018-07-07 22:14:30 +02:00
self . assertEqual ( content_sans_whitespace , expected )
2021-02-12 08:20:45 +01:00
@patch ( " builtins.print " )
2020-07-22 21:02:31 +02:00
def test_custom_markdown_include_extension ( self , mock_print : MagicMock ) - > None :
2018-12-23 00:13:57 +01:00
template = get_template ( " tests/test_markdown.html " )
context = {
2021-02-12 08:20:45 +01:00
" markdown_test_file " : " zerver/tests/markdown/test_custom_include_extension.md " ,
2018-12-23 00:13:57 +01:00
}
2021-02-12 08:19:30 +01:00
with self . assertRaisesRegex (
InvalidMarkdownIncludeStatement , " Invalid Markdown include statement "
) :
2018-12-23 00:13:57 +01:00
template . render ( context )
2021-02-12 08:19:30 +01:00
self . assertEqual (
mock_print . mock_calls ,
[
call (
" Warning: could not find file templates/zerver/help/include/nonexistent-macro.md. Error: [Errno 2] No such file or directory: ' templates/zerver/help/include/nonexistent-macro.md ' "
)
] ,
)
2018-12-23 00:13:57 +01:00
def test_custom_markdown_include_extension_empty_macro ( self ) - > None :
template = get_template ( " tests/test_markdown.html " )
context = {
2021-02-12 08:20:45 +01:00
" markdown_test_file " : " zerver/tests/markdown/test_custom_include_extension_empty.md " ,
2018-12-23 00:13:57 +01:00
}
content = template . render ( context )
2021-02-12 08:20:45 +01:00
content_sans_whitespace = content . replace ( " " , " " ) . replace ( " \n " , " " )
expected = " headerfooter "
2018-12-23 00:13:57 +01:00
self . assertEqual ( content_sans_whitespace , expected )