X-Git-Url: http://git.scottworley.com/paperdoorknob/blobdiff_plain/aa060d9ba5891fd87fc62664fb30b75bf0463e3e..HEAD:/glowfic_test.py?ds=sidebyside diff --git a/glowfic_test.py b/glowfic_test.py index d3a6d56..d3fb2dd 100644 --- a/glowfic_test.py +++ b/glowfic_test.py @@ -4,46 +4,67 @@ # 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 bs4 import BeautifulSoup +from typing import Optional +from fetch import FakeFetcher from images import FakeImageStore -from glowfic import chunkDOMs, makeChunk +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: - soup = BeautifulSoup(b''' + t = Thread(spec_for_testing(b'''
The "post" -
''', 'html.parser') - self.assertEqual([list(t.stripped_strings) for t in chunkDOMs(soup)], + ''')) + 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'''
The "post"
The "reply"
- ''', 'html.parser') - self.assertEqual([list(t.stripped_strings) for t in chunkDOMs(soup)], + ''')) + 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'''
The "post"
1st reply
2nd reply
- ''', 'html.parser') - self.assertEqual([list(t.stripped_strings) for t in chunkDOMs(soup)], + ''')) + self.assertEqual([list(t.stripped_strings) for t in t.chunkDOMs()], [['The "post"'], ['1st reply'], ['2nd reply']]) @@ -51,18 +72,129 @@ class TestMakeChunk(unittest.TestCase): def testEmptyContent(self) -> None: with open('testdata/empty-content.html', 'rb') as f: - soup = BeautifulSoup(f, 'html.parser') - c = makeChunk(next(iter(chunkDOMs(soup))), FakeImageStore()) + 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') - self.assertEqual(c.character, 'Keltham') - self.assertEqual(c.screen_name, 'lawful chaotic') - self.assertEqual(c.author, 'Iarwain') + 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()