# 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. from abc import ABC, abstractmethod import unittest import io import subprocess import paperdoorknob from testing.fakeserver import FakeGlowficServer from domfilter import ApplyDOMFilters from fetch import DirectFetcher, FakeFetcher, Fetcher from spec import Spec from texify import DirectTexifier, PandocTexifier, VerifyingTexifier TIMEOUT = 8 class BaseTestProcess(ABC): @abstractmethod def url(self) -> str: raise NotImplementedError() @abstractmethod def fetcher(self) -> Fetcher: raise NotImplementedError() def testReplies(self) -> None: replies = list(paperdoorknob.replies( paperdoorknob.parse(self.fetcher().fetch(self.url())))) for r in replies: ApplyDOMFilters('NoEdit,NoFooter', r) assert [r.text.strip() for r in replies] == [ "This is glowfic", "You sure?", "Pretty sure."] def testProcess(self) -> None: buf = io.BytesIO() spec = Spec( self.url(), self.fetcher(), lambda x: x, lambda x: ApplyDOMFilters('NoEdit,NoFooter', x), PandocTexifier('pandoc'), buf) paperdoorknob.process(spec) assert buf.getvalue() == b'''\\documentclass{article} \\begin{document} This is glowfic You \\emph{sure}? Pretty sure. \\end{document} ''' def testDirectTexifier(self) -> None: texifier = VerifyingTexifier( PandocTexifier('pandoc'), DirectTexifier()) buf = io.BytesIO() spec = Spec( self.url(), self.fetcher(), lambda x: x, lambda x: ApplyDOMFilters('NoEdit,NoFooter', x), texifier, buf) paperdoorknob.process(spec) def testPDF(self) -> None: with open("test.tex", 'wb') as out: spec = Spec( self.url(), self.fetcher(), lambda x: x, lambda x: ApplyDOMFilters('NoEdit,NoFooter', x), PandocTexifier('pandoc'), out) paperdoorknob.process(spec) subprocess.run(['pdflatex', 'test.tex'], stdin=subprocess.DEVNULL, check=True) class TestProcessFromWebserver(BaseTestProcess, unittest.TestCase): def setUp(self) -> None: self._fetcher = self.enterContext(DirectFetcher(TIMEOUT)) self._server = self.enterContext(FakeGlowficServer()) self._port = self._server.port() def url(self) -> str: return f"http://localhost:{self._port}" def fetcher(self) -> Fetcher: return self._fetcher class TestProcessFromFakeFetcher(BaseTestProcess, unittest.TestCase): def url(self) -> str: return 'fic' def fetcher(self) -> Fetcher: with open('testdata/this-is-glowfic.html', 'rb') as f: return FakeFetcher({'fic': f.read(9999)}) if __name__ == '__main__': unittest.main()