# 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 glowfic import ContentOnlyLayout, BelowIconLayout from images import FakeImageStore 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 testProcess(self) -> None: buf = io.BytesIO() spec = Spec( self.url(), self.fetcher(), FakeImageStore(), lambda x: x, lambda x: ApplyDOMFilters('NoEdit,NoFooter', x), ContentOnlyLayout(PandocTexifier('pandoc')), 'margin=20mm', buf) paperdoorknob.process(spec) assert buf.getvalue() == b'''\\documentclass{article} \\usepackage{graphicx} \\usepackage{wrapstuff} \\usepackage[margin=20mm]{geometry} \\begin{document} This is glowfic \\wrapstuffclear\\vspace{-.5\\ht\\strutbox}\\noindent\\hrulefill You \\emph{sure}? \\wrapstuffclear\\vspace{-.5\\ht\\strutbox}\\noindent\\hrulefill Pretty sure. \\end{document} ''' def testDirectTexifier(self) -> None: texifier = VerifyingTexifier( PandocTexifier('pandoc'), DirectTexifier()) buf = io.BytesIO() spec = Spec( self.url(), self.fetcher(), FakeImageStore(), lambda x: x, lambda x: ApplyDOMFilters('NoEdit,NoFooter', x), ContentOnlyLayout(texifier), None, buf) paperdoorknob.process(spec) def testPDF(self) -> None: with open("test.tex", 'wb') as out: spec = Spec( self.url(), self.fetcher(), FakeImageStore(), lambda x: x, lambda x: ApplyDOMFilters('NoEdit,NoFooter', x), BelowIconLayout(PandocTexifier('pandoc'), 20), None, 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()