from django.contrib.auth import get_user_model from django.test import TestCase from misago.markup.parser import parse User = get_user_model() class MockRequest(object): scheme = "http" def __init__(self, user=None): self.user = user def get_host(self): return "test.com" class MockPoster(object): username = "LoremIpsum" slug = "loremipsum" class HTMLTests(TestCase): def test_html_escaped(self): """parser escapes all html""" test_text = """ Lorem ipsum! """.strip() expected_result = """
Lorem <strong>ipsum!</strong>
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=True) self.assertEqual(expected_result, result["parsed_text"]) self.assertEqual(result["internal_links"], []) self.assertEqual(result["images"], []) self.assertEqual(result["outgoing_links"], []) class BBCodeTests(TestCase): def test_inline_text(self): """inline elements are correctly parsed""" test_text = """ Lorem **ipsum**, dolor met. Lorem [b]ipsum[/b], [i]dolor[/i] [u]met[/u]. Lorem [b]**ipsum**[/b] [i]dolor[/i] [u]met[/u]. Lorem [b]**ipsum[/b]** [i]dolor[/i] [u]met[/u]. Lorem [b]__ipsum[/b]__ [i]dolor[/i] [u]met[/u]. Lorem [b][i]ipsum[/i][/b]. Lorem [b][i]ipsum[/b][/i]. Lorem [b]ipsum[/B]. """.strip() expected_result = """Lorem ipsum, dolor met.
Lorem ipsum, dolor met.
Lorem ipsum dolor met.
Lorem **ipsum** dolor met.
Lorem __ipsum__ dolor met.
Lorem ipsum.
Lorem [i]ipsum[/i].
Lorem ipsum.
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=False) self.assertEqual(expected_result, result["parsed_text"]) def test_hr(self): """hr bbcode is correctly parsed""" test_text = """ Lorem ipsum. [hr] Dolor met. """.strip() expected_result = """Lorem ipsum.
Dolor met.
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=False) self.assertEqual(expected_result, result["parsed_text"]) def test_img(self): """img bbcode is correctly parsed""" test_text = """ Lorem ipsum [img]https://placekitten.com/g/1200/500[/img] Lorem ipsum [iMg]https://placekitten.com/g/1200/500[/ImG] Lorem ipsum !(https://placekitten.com/g/1200/500) """.strip() expected_result = """Lorem ipsum
Lorem ipsum
Lorem ipsum
Lorem ipsum placekitten.com/g/300/300
Lorem ipsum placekitten.com/g/600/600
Lorem ipsum Label text!
Lorem ipsum Lorem ipsum
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=False) self.assertEqual(expected_result, result["parsed_text"]) class MinifyTests(TestCase): def test_minified_text(self): """parser minifies text successfully""" test_text = """ Lorem ipsum. Lorem ipsum. """.strip() expected_result = """Lorem ipsum.
Lorem ipsum.
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=True) self.assertEqual(expected_result, result["parsed_text"]) def test_minified_unicode_text(self): """parser minifies unicode text successfully""" test_text = """ Bżęczyszczykiewłicz ipsum. Lorem ipsum. """.strip() expected_result = """Bżęczyszczykiewłicz ipsum.
Lorem ipsum.
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=True) self.assertEqual(expected_result, result["parsed_text"]) def test_complex_paragraph(self): """parser minifies complex paragraph""" user = User.objects.create_user("Bob", "bob@test.com", "Pass123") test_text = ( """ Hey there @%s, how's going? """.strip() % user ) expected_result = """Hey there @%s, how's going?
""".strip() % ( user.get_absolute_url(), user, ) result = parse(test_text, MockRequest(user), user, minify=True) self.assertEqual(expected_result, result["parsed_text"]) class CleanLinksTests(TestCase): def test_clean_current_link(self): """clean_links step cleans http://test.com""" test_text = """ Lorem ipsum: http://test.com """.strip() expected_result = """Lorem ipsum: test.com
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=True) self.assertEqual(expected_result, result["parsed_text"]) self.assertEqual(result["internal_links"], ["/"]) self.assertEqual(result["images"], []) self.assertEqual(result["outgoing_links"], []) def test_clean_schemaless_link(self): """clean_links step cleans test.com""" test_text = """ Lorem ipsum: test.com """.strip() expected_result = """Lorem ipsum: test.com
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=True) self.assertEqual(expected_result, result["parsed_text"]) self.assertEqual(result["internal_links"], ["/"]) self.assertEqual(result["images"], []) self.assertEqual(result["outgoing_links"], []) def test_trim_current_path(self): """clean_links step leaves http://test.com path""" test_text = """ Lorem ipsum: http://test.com/somewhere-something/ """.strip() expected_result = """Lorem ipsum: test.com/somewhere-something/
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=True) self.assertEqual(expected_result, result["parsed_text"]) self.assertEqual(result["internal_links"], ["/somewhere-something/"]) self.assertEqual(result["images"], []) self.assertEqual(result["outgoing_links"], []) def test_clean_outgoing_link_domain(self): """clean_links step leaves outgoing domain link""" test_text = """ Lorem ipsum: http://somewhere.com """.strip() expected_result = """Lorem ipsum: somewhere.com
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=True) self.assertEqual(expected_result, result["parsed_text"]) self.assertEqual(result["outgoing_links"], ["somewhere.com"]) self.assertEqual(result["images"], []) self.assertEqual(result["internal_links"], []) def test_trim_outgoing_path(self): """clean_links step leaves outgoing link domain and path""" test_text = """ Lorem ipsum: http://somewhere.com/somewhere-something/ """.strip() expected_result = """Lorem ipsum: somewhere.com/somewhere-something/
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=True) self.assertEqual(expected_result, result["parsed_text"]) self.assertEqual( result["outgoing_links"], ["somewhere.com/somewhere-something/"] ) self.assertEqual(result["images"], []) self.assertEqual(result["internal_links"], []) def test_clean_local_image_src(self): """clean_links step cleans local image src""" test_text = """ !(http://test.com/image.jpg) """.strip() expected_result = """Lorem ipsum: <http://test.com>
Lorem ipsum, dolor met.
Lorem ipsum.
""".strip() result = parse(test_text, MockRequest(), MockPoster(), minify=False) self.assertEqual(expected_result, result["parsed_text"]) def test_authored_quotes(self): """bbcode for authored quote is supported and handles mentions as well""" test_text = """ Lorem ipsum. [quote]Dolor met[/quote] [quote=\"@Bob\"]Dolor met[/quote] [quote]Dolor **met**[quote=@Bob]Dolor met[/quote][/quote] """.strip() expected_result = """Lorem ipsum.
Dolor met
Dolor <b>met</b>
Dolor met
@BobDolor met
Lorem ipsum.
Dolor <b>met</b>
Lorem ipsum.
Dolor met
Amet elit
Lorem ipsum.
Dolor [b]met.[/b]
""".strip()
result = parse(test_text, MockRequest(), MockPoster(), minify=False)
self.assertEqual(expected_result, result["parsed_text"])
def test_inline_code(self):
"""inline code bbcode is correctly parsed"""
test_text = """
Lorem ipsum.
[code]Dolor [b]met.[/b][/code]
""".strip()
expected_result = """
Lorem ipsum.
Dolor [b]met.[/b]
""".strip()
result = parse(test_text, MockRequest(), MockPoster(), minify=False)
self.assertEqual(expected_result, result["parsed_text"])
def test_code_strip(self):
"""code bbcode trims its content"""
test_text = """
Lorem ipsum.
[code]
Dolor [b]met.[/b]
[/code]
""".strip()
expected_result = """
Lorem ipsum.
Dolor [b]met.[/b]
""".strip()
result = parse(test_text, MockRequest(), MockPoster(), minify=False)
self.assertEqual(expected_result, result["parsed_text"])
def test_code_language(self):
"""code bbcode with language is correctly parsed"""
test_text = """
Lorem ipsum.
[code="python"]
Dolor [b]met.[/b]
[/code]
""".strip()
expected_result = """
Lorem ipsum.
Dolor [b]met.[/b]
""".strip()
result = parse(test_text, MockRequest(), MockPoster(), minify=False)
self.assertEqual(expected_result, result["parsed_text"])
def test_code_language_optional_quotes(self):
"""code quotes around language name are optional"""
test_text = """
Lorem ipsum.
[code=python"]
Dolor [b]met.[/b]
[/code]
""".strip()
expected_result = """
Lorem ipsum.
Dolor [b]met.[/b]
""".strip()
result = parse(test_text, MockRequest(), MockPoster(), minify=False)
self.assertEqual(expected_result, result["parsed_text"])
test_text = """
Lorem ipsum.
[code="python]
Dolor [b]met.[/b]
[/code]
""".strip()
expected_result = """
Lorem ipsum.
Dolor [b]met.[/b]
""".strip()
result = parse(test_text, MockRequest(), MockPoster(), minify=False)
self.assertEqual(expected_result, result["parsed_text"])