231 lines
8.1 KiB
Python
Executable File
231 lines
8.1 KiB
Python
Executable File
#!/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.
|
||
#******************************************************************************
|
||
""" Unit tests for the Python version of textout. """
|
||
|
||
import pytest
|
||
|
||
from textoutpc import tohtml as _tohtml
|
||
|
||
# Define the tests.
|
||
|
||
@pytest.mark.parametrize('test_input,expected', (
|
||
# Basic text.
|
||
|
||
('', ''),
|
||
('lol', '<p>lol</p>'),
|
||
('<script>alert(1);</script>',
|
||
'<p><script>alert(1);</script></p>'),
|
||
|
||
# Other tests. (?)
|
||
|
||
('[a][c][/a]', '<p>[a][c][/a]</p>'),
|
||
('[a][a]', '<p>[a][a]</p>'),
|
||
("[<>]><[/<>]", "<p>[<>]><[/<>]</p>"),
|
||
|
||
# Autolinking.
|
||
|
||
('(http://www.example.org/some-[damn-url]-(youknow))',
|
||
'<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 ?',
|
||
'<p><a href="https://thomas.touhey.fr/">https://thomas.touhey.fr/' \
|
||
'</a>, tu vois ?</p>'),
|
||
|
||
# Basic text styling.
|
||
|
||
('[u][b][a][i][/b]', "<p><u><b>[a]</b></u></p>"),
|
||
('[u][b]a[/]mdr', '<p><u><b>a</b>mdr</u></p>'),
|
||
|
||
# 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]', '<p>a</p>'),
|
||
('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 class="align-justify"><p><i><b>c</b></i></p></div></div>' \
|
||
'<p><i>d</i>wouhou</p>'),
|
||
|
||
# Show tag for super preprocessing blocks.
|
||
|
||
('[show]lol', '<p><span class="inline-code">lol</span></p>'),
|
||
('[quote][show][justify]hehe',
|
||
'<div class="citation"><p><span class="inline-code">' \
|
||
'<div class="align-justify">' \
|
||
'<p>hehe</p></div>' \
|
||
'</span></p></div>'),
|
||
|
||
# Titles.
|
||
|
||
('lolk[title]smth', '<p>lolk</p>' '<h1 class="title">smth</h1>'),
|
||
('[subtitle]<>', '<h2 class="subtitle"><></h2>'),
|
||
|
||
# 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=rbga(5, 7)]b', '<p><span style="color: #050007">b</span></p>'),
|
||
('[color=hsl(0, 1,50.0%)]r',
|
||
'<p><span style="color: #FF0000">r</span></p>'),
|
||
# TODO: hls, hwb
|
||
|
||
# Links.
|
||
|
||
('[url]', '<p>[url]</p>'),
|
||
('[url=https://thomas.touhey.fr/]mon profil est le meilleur[/url]',
|
||
'<p><a href="https://thomas.touhey.fr/">mon profil est le meilleur' \
|
||
'</a></p>'),
|
||
('[url=https://thomas.touhey.fr/]',
|
||
'<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[]>' \
|
||
'"a">' 'http://hey.org/lol[]>"a</a></p>'),
|
||
('[url]javascript:alert(1)[/url]',
|
||
'<p>[url]javascript:alert(1)[/url]</p>'),
|
||
('[url]<script>alert(1);</script>[/url]',
|
||
'<p>[url]<script>alert(1);</script>[/url]</p>'),
|
||
|
||
('[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><p>' \
|
||
'lel</p></div>'),
|
||
|
||
# Spoilers.
|
||
|
||
('[spoiler]', ''),
|
||
('[spoiler=Hello|world> :D]Close this, quick![/spoiler]',
|
||
'<div class="spoiler"><div class="title on" ' \
|
||
'onclick="toggleSpoiler(this.parentNode, ' "'open'" ');"><p>Hello' \
|
||
'</p></div><div class="title off" ' \
|
||
'onclick="toggleSpoiler(this.parentNode, ' "'close'" ');"><p>world' \
|
||
'> <img src="/images/smileys/grin.gif"></p></div>' \
|
||
'<div class="off"><p>Close this, quick!</p></div></div>'),
|
||
|
||
# Code.
|
||
|
||
('[code]', ''),
|
||
("`[code]`", '<p><span class="inline-code">[code]</span></p>'),
|
||
|
||
('[inlinecode]', ''),
|
||
("[inlinecode]`[/inlinecode]",
|
||
'<p><span class="inline-code">`</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><></p>'),
|
||
|
||
# Pictures.
|
||
|
||
('[img]', '<p>[img]</p>'),
|
||
('[img]"incroyable<>"[/img]',
|
||
'<p>[img]"incroyable<>"[/img]</p>'),
|
||
('[img=right|float|12x345]https://example.org/image.png',
|
||
'<img src="https://example.org/image.png" class="img-float-right" ' \
|
||
'style="width: 12px; height: 345px" />'),
|
||
|
||
# Videos.
|
||
|
||
('[video]"><script>alert(1)</script>[/video]',
|
||
'<p>[video]"><script>alert(1)</script>' \
|
||
'[/video]</p>'),
|
||
('[video]<script>alert(document.cookie)</script>[/video]',
|
||
'<p>[video]<script>alert(document.cookie)</script>' \
|
||
'[/video]</p>'),
|
||
('[video]https://www.youtube.com/watch?v=6odDOOyUawY[/video]',
|
||
'<div class="video-wrapper" style="padding-bottom: 56.25%"><iframe ' \
|
||
'src="https://www.youtube.com/embed/6odDOOyUawY" ' \
|
||
'frameborder="0" allowfullscreen></iframe></div>'),
|
||
('[video]https://www.youtube.com/watch?v=<script>alert(1)</script>',
|
||
'<p><a href="https://www.youtube.com/watch?v=<script>alert(1)' \
|
||
'</script>">' \
|
||
'https://www.youtube.com/watch?v=<script>alert(1)' \
|
||
'</script></a></p>'),
|
||
('[video=left|float|4:3]https://www.youtube.com/watch?v=XEjLoHdbVeE',
|
||
'<div class="video-wrapper img-float-left" ' \
|
||
'style="padding-bottom: 75%"><iframe ' \
|
||
'src="https://www.youtube.com/embed/XEjLoHdbVeE" frameborder="0" ' \
|
||
'allowfullscreen></iframe></div>'),
|
||
('lol[youtube]h4WLX8hfpJw', '<p>lol</p><div class="video-wrapper" ' \
|
||
'style="padding-bottom: 56.25%"><iframe ' \
|
||
'src="https://www.youtube.com/embed/h4WLX8hfpJw" frameborder="0" ' \
|
||
'allowfullscreen></iframe></div>'),
|
||
|
||
('[color=blue][youtube]h4WLX8hfpJw',
|
||
'<div class="video-wrapper" style="padding-bottom: 56.25%">' \
|
||
'<iframe src="https://www.youtube.com/embed/h4WLX8hfpJw" ' \
|
||
'frameborder="0" allowfullscreen></iframe></div>'),
|
||
('[color=blue]oh[youtube]h4WLX8hfpJw',
|
||
'<p><span style="color: #0000FF">oh</span></p>' \
|
||
'<div class="video-wrapper" style="padding-bottom: 56.25%"><iframe ' \
|
||
'src="https://www.youtube.com/embed/h4WLX8hfpJw" frameborder="0" ' \
|
||
'allowfullscreen></iframe></div>'),
|
||
|
||
# Progress bars.
|
||
|
||
('[progress=lol]mdr[/progress]', '<p>[progress=lol]mdr[/progress]</p>'),
|
||
|
||
# Text rotation obfuscation.
|
||
|
||
('[rot13]obawbhe[/rot13]', '<p>bonjour</p>'),
|
||
|
||
# Lists.
|
||
|
||
('[list]haha[b][*]wow[*]incredible[/b][/*]wow[*]yuy[/list]',
|
||
'<ul><li><p>wow</p></li><li><p>incredible[/b]</p></li>' \
|
||
'<li><p>yuy</p></li></ul>'),
|
||
('[list]\n[*]bonjour', '<ul><li><p>bonjour</p></li></ul>'),
|
||
|
||
# Smileys.
|
||
|
||
(':)', '<p><img src="/images/smileys/smile.gif"></p>'),
|
||
(':):)', '<p>:):)</p>'),
|
||
(':) :D', '<p><img src="/images/smileys/smile.gif"> ' \
|
||
'<img src="/images/smileys/grin.gif"></p>'),
|
||
))
|
||
def test_html(test_input, expected):
|
||
assert _tohtml(test_input) == expected
|
||
|
||
# End of file.
|