# paperdoorknob: Print glowfic # # This program is free software: you can redistribute it and/or modify it # 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 spec import Spec from texify import PandocTexifier 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, PandocTexifier('pandoc'), lambda x: x, 20, b'', None, stderr.buffer if outbuf is None else outbuf, lambda x: None) class TestSplit(unittest.TestCase): def testSplit1(self) -> None: t = Thread(spec_for_testing(b'''
The "post"
''')) self.assertEqual([list(t.stripped_strings) for t in t.chunkDOMs()], [['The "post"']]) def testSplit2(self) -> None: t = Thread(spec_for_testing(b'''
The "post"
The "reply"
''')) self.assertEqual([list(t.stripped_strings) for t in t.chunkDOMs()], [['The "post"'], ['The "reply"']]) def testSplit3(self) -> None: t = Thread(spec_for_testing(b'''
The "post"
1st reply
2nd reply
''')) 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), '

') self.assertEqual( PandocTexifier("pandoc").texify(c.character), b'{Keltham}\n') def testMinimal(self) -> None: t = Thread(spec_for_testing(b'''
Just content
''')) 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), '
Just content
') class TestThread(unittest.TestCase): def testTitle(self) -> None: t = Thread(spec_for_testing(b'''
Teh Story!
The "post"
''')) self.assertEqual(t.title(), 'Teh Story!') def testNextThreadRelative(self) -> None: t = Thread(spec_for_testing(b'''
Next Post »
« Previous Post
The "post"
''')) self.assertEqual(t.next_thread(), 'https://fake/posts/4567') def testNextThreadAbsolute(self) -> None: t = Thread(spec_for_testing(b'''
Next Post »
« Previous Post
The "post"
''')) self.assertEqual(t.next_thread(), 'https://elsewhere/posts/4567') class TestEmit(unittest.TestCase): def testEmit(self) -> None: buf = BytesIO() Thread(spec_for_testing(b'''
A
B
''', 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'''
Next Post »
''', 'https://fake/test?view=flat': b'''
A
B
''', 'https://fake/page2': b'''''', 'https://fake/page2?view=flat': b'''
C
D
E
''', })) Thread(spec).emit() self.assertEqual(buf.getvalue(), rb'''\glowhead{}{}{}{}A \glowhead{}{}{}{}B \glowhead{}{}{}{}C \glowhead{}{}{}{}D \glowhead{}{}{}{}E ''') if __name__ == '__main__': unittest.main()