]> git.scottworley.com Git - paperdoorknob/blob - paperdoorknob_test.py
Remove no-longer-needed DOMFilters NoEdit and NoFooter
[paperdoorknob] / paperdoorknob_test.py
1 # paperdoorknob: Print glowfic
2 #
3 # This program is free software: you can redistribute it and/or modify it
4 # under the terms of the GNU General Public License as published by the
5 # Free Software Foundation, version 3.
6
7
8 from abc import ABC, abstractmethod
9 import unittest
10 import io
11 import re
12 import subprocess
13
14 import paperdoorknob
15
16 from testing.fakeserver import FakeGlowficServer
17 from fetch import DirectFetcher, FakeFetcher, Fetcher
18 from glowfic import ContentOnlyLayout, BelowIconLayout
19 from images import FakeImageStore
20 from spec import Spec
21 from texify import DirectTexifier, PandocTexifier, VerifyingTexifier
22
23 TIMEOUT = 8
24
25
26 class BaseTestProcess(ABC):
27
28 @abstractmethod
29 def url(self) -> str:
30 raise NotImplementedError()
31
32 @abstractmethod
33 def fetcher(self) -> Fetcher:
34 raise NotImplementedError()
35
36 def testProcess(self) -> None:
37 buf = io.BytesIO()
38 spec = Spec(
39 self.url(),
40 self.fetcher(),
41 FakeImageStore(),
42 lambda x: x,
43 lambda x: None,
44 lambda x: x,
45 ContentOnlyLayout(PandocTexifier('pandoc')),
46 'margin=20mm',
47 buf)
48 paperdoorknob.process(spec)
49 assert re.match(br'''\\documentclass{article}
50 (\\usepackage{[a-z]+}\n)+\\usepackage\[margin=20mm\]{geometry}
51 \\begin{document}
52 This is glowfic
53
54 You \\emph{sure}\?
55
56 Pretty sure.
57
58 \\end{document}
59 ''', buf.getvalue())
60
61 def testDirectTexifier(self) -> None:
62 texifier = VerifyingTexifier(
63 PandocTexifier('pandoc'), DirectTexifier())
64 buf = io.BytesIO()
65 spec = Spec(
66 self.url(),
67 self.fetcher(),
68 FakeImageStore(),
69 lambda x: x,
70 lambda x: None,
71 lambda x: x,
72 ContentOnlyLayout(texifier),
73 None,
74 buf)
75 paperdoorknob.process(spec)
76
77 def testPDF(self) -> None:
78 with open("test.tex", 'wb') as out:
79 spec = Spec(
80 self.url(),
81 self.fetcher(),
82 FakeImageStore(),
83 lambda x: x,
84 lambda x: None,
85 lambda x: x,
86 BelowIconLayout(PandocTexifier('pandoc'), 20),
87 None,
88 out)
89 paperdoorknob.process(spec)
90 subprocess.run(['pdflatex', 'test.tex'],
91 stdin=subprocess.DEVNULL, check=True)
92
93
94 class TestProcessFromWebserver(BaseTestProcess, unittest.TestCase):
95
96 def setUp(self) -> None:
97 self._fetcher = self.enterContext(DirectFetcher(TIMEOUT))
98 self._server = self.enterContext(FakeGlowficServer())
99 self._port = self._server.port()
100
101 def url(self) -> str:
102 return f"http://localhost:{self._port}"
103
104 def fetcher(self) -> Fetcher:
105 return self._fetcher
106
107
108 class TestProcessFromFakeFetcher(BaseTestProcess, unittest.TestCase):
109
110 def url(self) -> str:
111 return 'fic'
112
113 def fetcher(self) -> Fetcher:
114 with open('testdata/this-is-glowfic.html', 'rb') as f:
115 return FakeFetcher({'fic?view=flat': f.read(9999)})
116
117
118 if __name__ == '__main__':
119 unittest.main()