# Free Software Foundation, version 3.
+from sys import stderr
import unittest
-from bs4 import BeautifulSoup
+from fetch import FakeFetcher
+from images import FakeImageStore
+from glowfic import makeChunk, Thread
+from spec import Spec
+from texify import PandocTexifier
-from glowfic import chunkDOMs
+
+def spec_for_testing(html: bytes) -> Spec:
+ return Spec('https://fake/test',
+ FakeFetcher({'https://fake/test': html,
+ 'https://fake/test?view=flat': html}),
+ FakeImageStore(),
+ lambda x: x,
+ lambda x: None,
+ PandocTexifier('pandoc'),
+ lambda x: x,
+ 20,
+ b'',
+ None,
+ stderr.buffer,
+ lambda x: None)
class TestSplit(unittest.TestCase):
def testSplit1(self) -> None:
- soup = BeautifulSoup(b'''
+ t = Thread(spec_for_testing(b'''
<html><body><div class="post-container post-post">
The "post"
- </div></body></html>''', 'html.parser')
- self.assertEqual([list(t.stripped_strings) for t in chunkDOMs(soup)],
+ </div></body></html>'''))
+ self.assertEqual([list(t.stripped_strings) for t in t.chunkDOMs()],
[['The "post"']])
def testSplit2(self) -> None:
- soup = BeautifulSoup(b'''
+ t = Thread(spec_for_testing(b'''
<html><body>
<div class="post-container post-post">The "post"</div>
<div class="flat-post-replies">
<div class="post-container post-reply">The "reply"</div>
</div>
- </body></html>''', 'html.parser')
- self.assertEqual([list(t.stripped_strings) for t in chunkDOMs(soup)],
+ </body></html>'''))
+ self.assertEqual([list(t.stripped_strings) for t in t.chunkDOMs()],
[['The "post"'], ['The "reply"']])
def testSplit3(self) -> None:
- soup = BeautifulSoup(b'''
+ t = Thread(spec_for_testing(b'''
<html><body>
<div class="post-container post-post">The "post"</div>
<div class="flat-post-replies">
<div class="post-container post-reply">1st reply</div>
<div class="post-container post-reply">2nd reply</div>
</div>
- </body></html>''', 'html.parser')
- self.assertEqual([list(t.stripped_strings) for t in chunkDOMs(soup)],
+ </body></html>'''))
+ self.assertEqual([list(t.stripped_strings) for t in t.chunkDOMs()],
[['The "post"'], ['1st reply'], ['2nd reply']])
+class TestMakeChunk(unittest.TestCase):
+
+ def testEmptyContent(self) -> None:
+ with open('testdata/empty-content.html', 'rb') as f:
+ t = Thread(spec_for_testing(f.read((9999))))
+ c = makeChunk(next(iter(t.chunkDOMs())), FakeImageStore())
+ self.assertEqual(
+ c.icon,
+ 'stored:https://d1anwqy6ci9o1i.cloudfront.net/' +
+ 'users%2F366%2Ficons%2Fxqmypqvflgdy28aorw9ml_shock.png')
+ assert c.character
+ assert c.screen_name
+ assert c.author
+ self.assertEqual(list(c.character.stripped_strings), ['Keltham'])
+ self.assertEqual(
+ list(c.screen_name.stripped_strings), ['lawful chaotic'])
+ self.assertEqual(list(c.author.stripped_strings), ['Iarwain'])
+ self.assertEqual(str(c.content),
+ '<div class="post-content"><p></p></div>')
+
+ self.assertEqual(
+ PandocTexifier("pandoc").texify(c.character), b'{Keltham}\n')
+
+ def testMinimal(self) -> None:
+ t = Thread(spec_for_testing(b'''
+ <html><body>
+ <div class="post-container post-post">
+ <div class="post-content">Just content</div>
+ </div>
+ </body></html>'''))
+ c = makeChunk(next(iter(t.chunkDOMs())), FakeImageStore())
+ self.assertIsNone(c.icon)
+ self.assertIsNone(c.character)
+ self.assertIsNone(c.screen_name)
+ self.assertIsNone(c.author)
+ self.assertEqual(str(c.content),
+ '<div class="post-content">Just content</div>')
+
+
+class TestThread(unittest.TestCase):
+
+ def testTitle(self) -> None:
+ t = Thread(spec_for_testing(b'''
+ <html><body>
+ <div class="content-header">
+ <span id="post-title">
+ <a href="/posts/1234">Teh Story!</a>
+ </span>
+ </div>
+ <div class="post-container post-post">The "post"</div>
+ </body></html>'''))
+ self.assertEqual(t.title(), 'Teh Story!')
+
+ def testNextThreadRelative(self) -> None:
+ t = Thread(spec_for_testing(b'''
+ <html><body>
+ <div class="post-navheader">
+ <a class="view-button-link" href="/posts/4567"><div class="view-button">Next Post »</div>
+ </a><a class="view-button-link" href="/posts/4321"><div class="view-button float-none">« Previous Post</div>
+ </a>
+ </div>
+ <div class="post-container post-post">The "post"</div>
+ </body></html>'''))
+ self.assertEqual(t.next_thread(), 'https://fake/posts/4567')
+
+ def testNextThreadAbsolute(self) -> None:
+ t = Thread(spec_for_testing(b'''
+ <html><body>
+ <div class="post-navheader">
+ <a class="view-button-link" href="https://elsewhere/posts/4567"><div class="view-button">Next Post »</div>
+ </a><a class="view-button-link" href="https://elsewhere/posts/4321"><div class="view-button float-none">« Previous Post</div>
+ </a>
+ </div>
+ <div class="post-container post-post">The "post"</div>
+ </body></html>'''))
+ self.assertEqual(t.next_thread(), 'https://elsewhere/posts/4567')
+
+
if __name__ == '__main__':
unittest.main()