2
0
Fork 0
textout/test/test_html.py

192 lines
6.6 KiB
Python
Raw Normal View History

2018-01-02 18:57:04 +01:00
#!/usr/bin/env python3
#******************************************************************************
# Copyright (C) 2018 Thomas "Cakeisalie5" Touhey <thomas@touhey.fr>
# This file is part of the textoutpc project, which is MIT-licensed.
#******************************************************************************
2018-01-02 18:57:04 +01:00
""" Unit tests for the Python version of textout.
Uses the builtin `unittest` module.
"""
import unittest
import textoutpc
2018-01-02 18:57:04 +01:00
# Define the tests.
__test_cases = {
# Basic text.
2018-01-16 13:34:11 +01:00
'': '',
'lol': '<p>lol</p>',
'<script>alert(1);</script>': \
'<p>&lt;script&gt;alert(1);&lt;/script&gt;</p>',
2018-01-16 13:34:11 +01:00
# Other tests. (?)
'[a][c][/a]': '<p>[a][c][/a]</p>',
'[a][a]': '<p>[a][a]</p>',
"[<>]><[/<>]": "<p>[&lt;&gt;]&gt;&lt;[/&lt;&gt;]</p>",
2018-01-02 18:57:04 +01:00
# Autolinking.
2018-01-02 18:57:04 +01:00
'(http://www.example.org/some-[damn-url]-(youknow))': \
2018-02-11 21:31:39 +01:00
'<p>(<a href="http://www.example.org/some-[damn-url]-(youknow)">' \
'http://www.example.org/some-[damn-url]-(youknow)</a>)</p>',
'https://thomas.touhey.fr/, tu vois ?': \
2018-02-11 21:31:39 +01:00
'<p><a href="https://thomas.touhey.fr/">https://thomas.touhey.fr/' \
'</a>, tu vois ?</p>',
2018-01-02 18:57:04 +01:00
# Basic text styling.
'[u][b][a][i][/b]': "<p><u><b>[a]<i></i></b></u></p>",
'[u][b]a[/]mdr': '<p><u><b>a</b>mdr</u></p>',
2018-01-02 18:57:04 +01:00
# Blocks, alignment.
'[left]': '',
'[left]lol[/]hi': '<div class="align-left"><p>lol</p></div><p>hi</p>',
'a[justify]b': '<p>a</p><div class="align-justify"><p>b</p></div>',
'a[i][justify]b': '<p>a</p>' \
'<div class="align-justify"><p><i>b</i></p></div>',
'a[i]k[center]b': '<p>a<i>k</i></p>' \
'<div class="align-center"><p><i>b</i></p></div>',
'a[i]k[center][b]b[justify]c[/center]d[/]wouhou': \
'<p>a<i>k</i></p>' \
'<div class="align-center"><p><i><b>b</b></i></p></div>' \
'<div class="align-justify"><p><i><b>c</b></i></p></div>' \
'<p><i>d</i>wouhou</p>',
# Show tag for super preprocessing blocks.
'[quote][show][justify]hehe': \
'<div class="citation"><p>&lt;div class="align-justify"&gt;' \
'&lt;p&gt;hehe&lt;/p&gt;&lt;/div&gt;</p></div>',
# Titles.
'lolk[title]smth': '<p>lolk</p>' '<h4>smth</h4>',
'[subtitle]<>': '<h5>&lt;&gt;</h5>',
# Fonts.
'[arial]test': '<p><span style="font-family: arial">test</span></p>',
'[font=mono]stereo': \
'<p><span style="font-family: monospace">stereo</span></p>',
'[haettenschweiler]': '',
'[font=hello]yea': '<p>[font=hello]yea</p>',
# Color.
'yea[color=blue]dabadee': \
'<p>yea<span style="color: #0000FF">dabadee</span></p>',
'[color=#12345F]a': '<p><span style="color: #12345F">a</span></p>',
'[color=#123]a': '<p><span style="color: #112233">a</span></p>',
'[color=123]a': '<p><span style="color: #010203">a</span></p>',
'[color=chucknorris]a': '<p><span style="color: #C00000">a</span></p>',
'[color=rgb(1, 22,242)]a': '<p><span style="color: #0116F2">a</span></p>',
'[color= rgb (1,22, 242 , 50.0% )]a': '<p><span style="color: #0116F2; ' \
'color: rgba(1, 22, 242, 0.5)">a</span></p>',
'[color=rgba(1,22,242,0.500)]a': '<p><span style="color: #0116F2; ' \
'color: rgba(1, 22, 242, 0.5)">a</span></p>',
'[color=hsl(0, 1,50.0%)]r': '<p><span style="color: #FF0000">r</span></p>',
# TODO: hls, hwb
2018-01-02 18:57:04 +01:00
# Links.
'[url]': '<p>[url]</p>',
2018-01-02 18:57:04 +01:00
'[url=https://thomas.touhey.fr/]mon profil est le meilleur[/url]':
2018-02-11 21:31:39 +01:00
'<p><a href="https://thomas.touhey.fr/">mon profil est le meilleur' \
'</a></p>',
'[url=https://thomas.touhey.fr/]': \
2018-02-11 21:31:39 +01:00
'<p><a href="https://thomas.touhey.fr/">https://thomas.touhey.fr/' \
'</a></p>',
'[url=http://hey.org/lol[]>"a]': '<p><a href="http://hey.org/lol[]&gt;' \
2018-02-11 21:31:39 +01:00
'&quot;a">' \
'http://hey.org/lol[]&gt;&quot;a</a></p>',
'[url]javascript:alert(1)[/url]': '<p>[url]javascript:alert(1)[/url]</p>',
'[url]<script>alert(1);</script>[/url]': \
'<p>[url]&lt;script&gt;alert(1);&lt;/script&gt;[/url]</p>',
2018-01-02 18:57:04 +01:00
'[profil]cake[/profil]': \
'<p><a href="https://www.planet-casio.com/Fr/compte/voir_profil.php' \
'?membre=cake">cake</a></p>',
'[profile]ekac': \
'<p><a href="https://www.planet-casio.com/Fr/compte/voir_profil.php' \
'?membre=ekac">ekac</a></p>',
# Quotes.
'[quote]': '',
'[quote]a': \
'<div class="citation"><p>a</p></div>',
'[quote=Test 1 :)]lel[/quote]': \
'<div class="citation"><p><b>Test 1 ' \
'<img src="/images/smileys/smile.gif"> a écrit:</b></p><br />' \
'lel</p></div>',
2018-01-02 18:57:04 +01:00
# Spoilers.
'[spoiler]': '',
2018-01-02 18:57:04 +01:00
'[spoiler=Hello|world> :D]Close this, quick![/spoiler]': \
'<div class="spoiler"><div class="title on" ' \
'onclick="toggleSpoiler(this.parentNode, ' "'open'" ');">Hello' \
'</div><div class="title off" ' \
'onclick="toggleSpoiler(this.parentNode, ' "'close'" ');">world' \
2018-01-22 20:49:30 +01:00
'&gt; <img src="/images/smileys/grin.gif"></div><div class="off">' \
2018-01-02 18:57:04 +01:00
'Close this, quick!</div></div>',
# Code.
'[code]': '',
"`[code]`": '<p><span style="font-family: monospace;">[code]</span></p>',
'[inlinecode]': '',
"[inlinecode]`[/inlinecode]": \
'<p><span style="font-family: monospace;">`</span></p>',
"[b]a[noeval]b[/b]c[/noeval]d": "<p><b>ab[/b]cd</b></p>",
"a[noeval]b[noeval]c[/noeval]d[/noeval]e": "<p>ab[noeval]c[/noeval]de</p>",
"[noeval]``[/noeval]": "<p>``</p>",
'[noeval]<>[/noeval]': '<p>&lt;&gt;</p>',
# Pictures.
'[img]': '<p>[img]</p>',
'[img]"incroyable<>"[/img]': \
'<p>[img]&quot;incroyable&lt;&gt;&quot;[/img]</p>',
2018-01-02 18:57:04 +01:00
# Videos.
'[video]"><script>alert(1)</script>[/video]': \
'<p>[video]&quot;&gt;&lt;script&gt;alert(1)&lt;/script&gt;' \
'[/video]</p>',
2018-01-02 18:57:04 +01:00
'[video]<script>alert(document.cookie)</script>[/video]': \
'<p>[video]&lt;script&gt;alert(document.cookie)&lt;/script&gt;' \
'[/video]</p>',
2018-01-02 18:57:04 +01:00
'[video]https://www.youtube.com/watch?v=6odDOOyUawY[/video]': \
2018-01-20 10:26:23 +01:00
'<div class="video-wrapper video-medium"><iframe ' \
2018-01-02 18:57:04 +01:00
'src="https://www.youtube.com/embed/6odDOOyUawY" ' \
2018-01-20 10:26:23 +01:00
'frameborder="0" allowfullscreen></iframe></div>',
2018-01-22 20:33:25 +01:00
'[video]https://www.youtube.com/watch?v=<script>alert(1)</script>': \
'<p><a href="https://www.youtube.com/watch?v=&lt;script&gt;alert(1)' \
2018-02-11 21:31:39 +01:00
'&lt;/script&gt;">' \
2018-01-19 22:44:43 +01:00
'https://www.youtube.com/watch?v=&lt;script&gt;alert(1)' \
'&lt;/script&gt;</a></p>',
2018-01-02 18:57:04 +01:00
# Progress bars.
'[progress=lol]mdr[/progress]': '<p>[progress=lol]mdr[/progress]</p>',
2018-01-19 17:55:43 +01:00
# Text rotation obfuscation.
'[rot13]obawbhe[/rot13]': '<p>bonjour</p>',
2018-01-02 18:57:04 +01:00
}
# Define the tests wrapper, and define the classes.
_cnt = 0
_len = len(str(len(__test_cases)))
_templ = """\
def test_html{n:0>{l}}(self):
2018-01-16 13:34:11 +01:00
self.assertEqual({r}, textoutpc.tohtml({i}))
"""
2018-01-02 18:57:04 +01:00
def _wrap_test(inp, res):
global _cnt
_cnt += 1
return _templ.format(n = _cnt, l = _len, i = repr(inp), r = repr(res))
2018-01-02 18:57:04 +01:00
2018-01-19 15:15:35 +01:00
exec("class TextoutHTMLTest(unittest.TestCase):\n maxDiff = None\n" + \
2018-01-02 18:57:04 +01:00
'\n'.join(map(lambda args: _wrap_test(*args), __test_cases.items())),
globals())
# If run as main script, run the test function.
if __name__ == '__main__':
unittest.main()
# End of file.