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

\n

ello
world

'), ('Foo\r\n\r\n\r\n\nBar', '

Foo

\n

Bar

'), ('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

\n

Bar

'), ('ไก่จิกเด็ก\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

')) def test_format_text_shorten(self): from fanboi2.formatters import format_text from fanboi2.formatters import PostMarkup from markupsafe import Markup tests = ( ('Hello, world!', '

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

\n' '

' '' '' '' '' '' '' '' '' '

')) def test_format_markdown(self): from fanboi2.formatters import format_markdown from markupsafe import Markup request = self._makeRequest() tests = [ ('**Hello, world!**', '

Hello, world!

'), ('Foobar', '

Foobar

'), ('Split\n\nParagraph', '

Split

\n

Paragraph

'), ('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

"), (post2, "

" + ">>1

"), (post3, "

" + ">>1-2
Hoge

"), (post4, "

" + ">>>/demo

"), (post5, "

>>>/demo/123

"), (post6, "

>>>/demo/123/100-

"), (post7, "

>>>/demo/123/100-/

"), (post8, "

>>>/demo/123-/100-/

"), (post9, "

" + ">>>/demo/
" + ">>>/demo/1/

"), (post10, "

" + ">>>/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.

"))