# 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"
'''))
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"
'''))
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'''
'''))
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'''
The "post"
'''))
self.assertEqual(t.title(), 'Teh Story!')
def testNextThreadRelative(self) -> None:
t = Thread(spec_for_testing(b'''
The "post"
'''))
self.assertEqual(t.next_thread(), 'https://fake/posts/4567')
def testNextThreadAbsolute(self) -> None:
t = Thread(spec_for_testing(b'''
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'''
''', 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'''
''',
'https://fake/test?view=flat': b'''
''',
'https://fake/page2': b'''''',
'https://fake/page2?view=flat': b'''
''',
}))
Thread(spec).emit()
self.assertEqual(buf.getvalue(), rb'''\glowhead{}{}{}{}A
\glowhead{}{}{}{}B
\glowhead{}{}{}{}C
\glowhead{}{}{}{}D
\glowhead{}{}{}{}E
''')
if __name__ == '__main__':
unittest.main()