# 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 re import subprocess import paperdoorknob from testing.fakeserver import FakeGlowficServer from fetch import DirectFetcher, FakeFetcher, Fetcher from glowfic import ContentOnlyLayout, BesideIconLayout 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() texifier = PandocTexifier('pandoc') spec = Spec( self.url(), self.fetcher(), FakeImageStore(), lambda x: x, lambda x: None, texifier, lambda x: x, 20, ContentOnlyLayout, 'margin=20mm', buf, lambda _: None) paperdoorknob.process(spec) assert re.match(br'''\\documentclass{article} (\\usepackage{[a-z]+}\n)+\\usepackage\[margin=20mm\]{geometry} \\begin{document} (.|\n)* \\glowhead{}{}{}{}This is \\href{https://glowfic.com}{glowfic} \\glowhead{}{}{}{}You \\emph{sure}\? \\glowhead{}{}{}{}Pretty sure. \\end{document} ''', buf.getvalue()) def testDirectTexifier(self) -> None: texifier = VerifyingTexifier( PandocTexifier('pandoc'), DirectTexifier()) buf = io.BytesIO() spec = Spec( self.url(), self.fetcher(), FakeImageStore(), lambda x: x, lambda x: None, texifier, lambda x: x, 20, ContentOnlyLayout, None, buf, lambda _: None) paperdoorknob.process(spec) def testPDF(self) -> None: texifier = PandocTexifier('pandoc') with open("test.tex", 'wb') as out: spec = Spec( self.url(), self.fetcher(), FakeImageStore(), lambda x: x, lambda x: None, texifier, lambda x: x, 20, BesideIconLayout, None, out, lambda _: None) 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: html = f.read(9999) return FakeFetcher({'fic': html, 'fic?view=flat': html}) if __name__ == '__main__': unittest.main()