# under the terms of the GNU General Public License as published by the
# Free Software Foundation, version 3.
-
+import dataclasses
+from io import BytesIO
from sys import stderr
import unittest
+from typing import Optional
+
from fetch import FakeFetcher
from images import FakeImageStore
from glowfic import makeChunk, Thread
from texify import PandocTexifier
-def spec_for_testing(html: bytes) -> Spec:
- return Spec('test',
- FakeFetcher({'test': html, 'test?view=flat': html}),
+def spec_for_testing(html: bytes, outbuf: Optional[BytesIO] = None) -> Spec:
+ return Spec('https://fake/test',
+ FakeFetcher({'https://fake/test': html,
+ 'https://fake/test?view=flat': html}),
FakeImageStore(),
lambda x: x,
lambda x: None,
20,
b'',
None,
- stderr.buffer,
+ stderr.buffer if outbuf is None else outbuf,
lambda x: None)
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):
</body></html>'''))
self.assertEqual(t.title(), 'Teh Story!')
- def testNextThread(self) -> None:
+ def testNextThreadRelative(self) -> None:
t = Thread(spec_for_testing(b'''
<html><body>
<div class="post-navheader">
</div>
<div class="post-container post-post">The "post"</div>
</body></html>'''))
- self.assertEqual(t.next_thread(), '/posts/4567')
+ 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')
+
+
+class TestEmit(unittest.TestCase):
+
+ def testEmit(self) -> None:
+ buf = BytesIO()
+ Thread(spec_for_testing(b'''
+ <html><body>
+ <div class="post-container post-post">
+ <div class="post-content">A</div>
+ </div>
+ <div class="flat-post-replies">
+ <div class="post-container post-reply">
+ <div class="post-content">B</div>
+ </div>
+ </div>
+ </body></html>''', buf)).emit()
+ self.assertEqual(buf.getvalue(), rb'''\glowhead{}{}{}{}A
+\glowhead{}{}{}{}B
+''')
+
+ def testEmitTwoThreads(self) -> None:
+ buf = BytesIO()
+ spec = dataclasses.replace(spec_for_testing(b'', buf), fetcher=FakeFetcher({
+ 'https://fake/test': b'''<html><body>
+ <div class="post-navheader">
+ <a class="view-button-link" href="/page2"><div class="view-button">Next Post »</div></a>
+ </div></body></html>''',
+ 'https://fake/test?view=flat': b'''<html><body>
+ <div class="post-container post-post"><div class="post-content">A</div></div>
+ <div class="flat-post-replies">
+ <div class="post-container post-reply"><div class="post-content">B</div></div>
+ </div>
+ </body></html>''',
+ 'https://fake/page2': b'''<html><body></body></html>''',
+ 'https://fake/page2?view=flat': b'''<html><body>
+ <div class="post-container post-post"><div class="post-content">C</div></div>
+ <div class="flat-post-replies">
+ <div class="post-container post-reply"><div class="post-content">D</div></div>
+ <div class="post-container post-reply"><div class="post-content">E</div></div>
+ </div>
+ </body></html>''',
+ }))
+ Thread(spec).emit()
+ self.assertEqual(buf.getvalue(), rb'''\glowhead{}{}{}{}A
+\glowhead{}{}{}{}B
+\glowhead{}{}{}{}C
+\glowhead{}{}{}{}D
+\glowhead{}{}{}{}E
+''')
if __name__ == '__main__':