import unittest from fanboi2.tests import ModelMixin from pyramid import testing class TestFormatters(unittest.TestCase): def _makeRequest(self): """:rtype: pyramid.request.Request""" from pyramid.registry import Registry registry = Registry() registry.settings = {'app.timezone': 'Asia/Bangkok'} testing.setUp(registry=registry) return testing.DummyRequest() def test_url_fix(self): from fanboi2.formatters import url_fix tests = [ ('http://example.com/', 'http://example.com/'), ('https://example.com:443/foo/bar', 'https://example.com:443/foo/bar'), ('http://example.com/lots of space', 'http://example.com/lots%20of%20space'), ('http://example.com/search?q=hello world', 'http://example.com/search?q=hello+world'), ('http://example.com/ほげ', 'http://example.com/%E3%81%BB%E3%81%92'), ('http://example.com/">', 'http://example.com/%22%3E%3Cscript%3E%3C/script%3E'), ] for source, target in tests: self.assertEqual(url_fix(source), target) def test_extract_thumbnail(self): from fanboi2.formatters import extract_thumbnail text = """ Inline page: http://imgur.com/image1 Inline image: http://i.imgur.com/image2.jpg Subdomain image: http://fanboi2.imgur.com/image3.png http://i.imgur.com/image4.jpeg http://i.imgur.com/image5.gif http://imgur.com/.jpg http://.imgur.com/image6.gif http://imgur.com/ほげ Lorem ipsum dolor sit amet. https://imgur.com/image5 https://i.imgur.com/image7.jpg """ self.assertTupleEqual(tuple(extract_thumbnail(text)), ( ('//i.imgur.com/image1s.jpg', '//imgur.com/image1'), ('//i.imgur.com/image2s.jpg', '//imgur.com/image2'), ('//i.imgur.com/image3s.jpg', '//imgur.com/image3'), ('//i.imgur.com/image4s.jpg', '//imgur.com/image4'), ('//i.imgur.com/image5s.jpg', '//imgur.com/image5'), ('//i.imgur.com/image7s.jpg', '//imgur.com/image7'), )) def test_post_markup(self): from fanboi2.formatters import PostMarkup from markupsafe import Markup markup = PostMarkup('
foo
') markup.shortened = True markup.length = 3 self.assertEqual(markup, Markup('foo
')) self.assertEqual(markup.shortened, True) self.assertEqual(len(PostMarkup('Hello
')), 12) self.assertEqual(len(markup), 3) def test_format_text(self): from fanboi2.formatters import format_text from markupsafe import Markup tests = [ ('Hello, world!', 'Hello, world!
'), ('H\n\n\nello\nworld', 'H
\nello
world
Foo
\nBar
'), ('Newline at the end\n', 'Newline at the end
'), ('STRIP ME!!!1\n\n', 'STRIP ME!!!1
'), ('ほげ\n\nほげ', 'ほげ
\nほげ
'), ('Foo\n \n Bar', 'Foo
\nBar
'), ('ไก่จิกเด็ก\n\nตายบนปากโอ่ง', 'ไก่จิกเด็ก
\nตายบนปากโอ่ง
'), ('', '<script></script>
'), ] for source, target in tests: self.assertEqual(format_text(source), Markup(target)) def test_format_text_autolink(self): from fanboi2.formatters import format_text from markupsafe import Markup text = ('Hello from autolink:\n\n' 'Boom: http://example.com/"Hello from autolink:\n' 'Boom: '
'http://example.com/"<script>alert("'
'Hi")</script><a
'
''
'http://www.example.com/ほげ
'
''
'http://www.example.com/ほげ
'
''
'https://www.example.com/test foobar
Hello, world!
', 13, False), ('Hello\nworld!', 'Hello
', 5, True), ('Hello, world!\nFoobar', 'Hello, world!
', 13, True), ('Hello', 'Hello
', 5, False), ) for source, target, length, shortened in tests: result = format_text(source, shorten=5) self.assertIsInstance(result, PostMarkup) self.assertEqual(result, Markup(target)) self.assertEqual(result.length, length) self.assertEqual(result.shortened, shortened) def test_format_text_thumbnail(self): from fanboi2.formatters import format_text from markupsafe import Markup text = ("New product! https://imgur.com/foobar1\n\n" "http://i.imgur.com/foobar2.png\n" "http://imgur.com/foobar3.jpg\n" "Buy today get TWO for FREE!!1") self.assertEqual( format_text(text), Markup('New product! ' 'https://imgur.com/foobar1
\n' ''
'http://i.imgur.com/foobar2.png
'
''
'http://imgur.com/foobar3.jpg
'
'Buy today get TWO for FREE!!1
Hello, world!
'), ('Foobar', 'Foobar
'), ('Split\n\nParagraph', 'Split
\nParagraph
'), ('Split\nlines', 'Split\nlines
'), ] for source, target in tests: self.assertEqual(format_markdown(None, request, source), Markup(target)) def test_format_markdown_empty(self): from fanboi2.formatters import format_markdown request = self._makeRequest() self.assertIsNone(format_markdown(None, request, None)) def test_format_datetime(self): from datetime import datetime, timezone from fanboi2.formatters import format_datetime request = self._makeRequest() d1 = datetime(2013, 1, 2, 0, 4, 1, 0, timezone.utc) d2 = datetime(2012, 12, 31, 16, 59, 59, 0, timezone.utc) self.assertEqual(format_datetime(None, request, d1), "Jan 02, 2013 at 07:04:01") self.assertEqual(format_datetime(None, request, d2), "Dec 31, 2012 at 23:59:59") def test_format_isotime(self): from datetime import datetime, timezone, timedelta from fanboi2.formatters import format_isotime ict = timezone(timedelta(hours=7)) request = self._makeRequest() d1 = datetime(2013, 1, 2, 7, 4, 1, 0, ict) d2 = datetime(2012, 12, 31, 23, 59, 59, 0, ict) self.assertEqual(format_isotime(None, request, d1), "2013-01-02T00:04:01Z") self.assertEqual(format_isotime(None, request, d2), "2012-12-31T16:59:59Z") class TestFormattersWithModel(ModelMixin, unittest.TestCase): def test_format_post(self): from fanboi2.formatters import format_post from markupsafe import Markup self.config.add_route('board', '/{board}') self.config.add_route('topic_scoped', '/{board}/{topic}/{query}') request = self._makeRequest() board = self._makeBoard(title="Foobar", slug="foobar") topic = self._makeTopic(board=board, title="Hogehogehogehogehoge") post1 = self._makePost(topic=topic, body="Hogehoge\nHogehoge") post2 = self._makePost(topic=topic, body=">>1") post3 = self._makePost(topic=topic, body=">>1-2\nHoge") post4 = self._makePost(topic=topic, body=">>>/demo") post5 = self._makePost(topic=topic, body=">>>/demo/123") post6 = self._makePost(topic=topic, body=">>>/demo/123/100-") post7 = self._makePost(topic=topic, body=">>>/demo/123/100-/") post8 = self._makePost(topic=topic, body=">>>/demo/123-/100-/") post9 = self._makePost(topic=topic, body=">>>/demo/\n>>>/demo/1/") post10 = self._makePost(topic=topic, body=">>>/demo//100-/") post11 = self._makePost(topic=topic, body=">>>//123-/100-/") tests = [ (post1, "Hogehoge
Hogehoge
" +
">>1-2
Hoge
>>>/demo/123-/100-/
"), (post9, "" +
">>>/demo/
" +
">>>/demo/1/
" + ">>>/demo//100-/
"), (post11, ">>>//123-/100-/
") ] for source, target in tests: self.assertEqual(format_post(None, request, source), Markup(target)) def test_format_post_shorten(self): from fanboi2.formatters import format_post from markupsafe import Markup self.config.add_route('topic_scoped', '/{board}/{topic}/{query}') request = self._makeRequest() board = self._makeBoard(title="Foobar", slug="foobar") topic = self._makeTopic(board=board, title="Hogehogehogehogehoge") post = self._makePost(topic=topic, body="Hello\nworld") self.assertEqual(format_post(None, request, post, shorten=5), Markup("Hello
\n" "Post shortened. " "See full post.
"))